如何使用EWS托管API设置消息回复地址?

时间:2014-12-10 21:30:36

标签: powershell exchangewebservices ews-managed-api

如何在Powershell v3中使用Exchange Web服务托管API发送邮件时设置回复标头?

我有一个Microsoft.Exchange.WebServices.Data.EmailMessage对象,可以设置发件人地址,添加附件和成功发送邮件。

我可以使用:

添加x-header
$xheader = new-object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition([Microsoft.Exchange.WebServices.Data.DefaultExtendedPropertySet]::InternetHeaders,"x-my-header",[Microsoft.Exchange.WebServices.Data.MapiPropertyType]::String)

并将其添加到$ pspropset但是如果我使用reply-to作为值,则不插入标题。

使用有价值且难以找到Glen Scales在this thread中发布的信息我相信需要在EmailMessage对象上设置两个扩展属性PidTagReplyRecipientEntriesPidTagReplyRecipientNames

我能够设置两个扩展属性而不会出现错误,但这不会在消息中产生Reply-To标头。

以下相关代码:

function SendResponse($orgMsg, $bodyTxt){
$message =  [Microsoft.Exchange.WebServices.Data.EmailMessage]::Bind($service, $($orgMsg.Id), $psPropset)
$reply = $message.CreateReply($true)
$reply.BodyPrefix = $bodyTxt
$replyMsg = $reply.Save($drftFolderid.Id)
$replyMsg.From = "my_desired_from@example.com"
$replyMsg.SetExtendedProperty($PidTagReplyRecipientEntries, $byteVal)
$replyMsg.SetExtendedProperty($PidTagReplyRecipientNames, "my_desired_replyto@example.com")
$replyMsg.Update([Microsoft.Exchange.WebServices.Data.ConflictResolutionMode]::AlwaysOverwrite)
$replyMsg.SendAndSaveCopy($sentFolderid.Id)
}

function convert-fromhex {
    process
    {
        $_ -replace '^0x', '' -split "(?<=\G\w{2})(?=\w{2})" | %{ [Convert]::ToByte( $_, 16 ) }
    }
}

# below is hex of string "my_desired_replyto@example.com"
[Byte[]]$byteVal = "6d795f646573697265645f7265706c79746f406578616d706c652e636f6d" | convert-fromhex

$PidTagReplyRecipientEntries = new-object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition(0x004F,[Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Binary)
$PidTagReplyRecipientNames = new-object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition(0x0050,[Microsoft.Exchange.WebServices.Data.MapiPropertyType]::String)
$psPropset = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
$psPropset.Add($PidTagReplyRecipientEntries)
$psPropset.Add($PidTagReplyRecipientNames)

有谁知道如何实现这一目标?

3 个答案:

答案 0 :(得分:0)

不知道为什么你被投票,但Microsoft.Exchange.WebServices.Data.EmailMessage类似乎确实有an EmailMessage.ReplyTo property。但是,我无法判断它是否是只读的。看起来可能是。

答案 1 :(得分:0)

据我所知,你不能。 Replyto是只读属性。我一直试图使用&#39; ImpersonatedUserId&#39;但它看起来有点笨重(请注意,我不能让它工作)。但是我确实发现如果你有模拟权限,那么你可以设置From属性,它会发送。我知道这可能不是您正在寻找的内容,但它会让电子邮件来自正确的位置。

答案 2 :(得分:0)

Microsoft.Exchange.WebServices.Data.EmailMessage.ReplyTo是从IEnumerable派生的只读EmailAddressCollection。您没有实例化它。创建EmailMessage时,它会自动实例化,您要做的就是在其中添加您的回复电子邮件地址(抱歉,不是PowerShell,而是C#代码):

message.ReplyTo.Add(new EmailAddress("someReply-ToEmailAddress@email.com");
message.ReplyTo.Add(new EmailAddress("anotherReply-ToEmailAddress@email.com");