如何使用EWS PowerShell发送含自定义投票选项的邮件
自定义EWS邮件的投票选项(替换默认Approve/Reject为Yes/No或自定义)
我来帮你搞定这个投票选项的问题——你之前尝试修改Verb Stream没成功,是因为投票选项的Hex结构需要对应调整,尤其是$ApproveOption、$RejectOption和$VoteOptionExtras这几个核心部分。下面是修改后的完整代码和分步解释:
完整修改后的代码
$SentTo = "abc@xyz.com" $username="abc1" $password="abc1" $VerbSetting = "" | Select DisableReplyAll,DisableReply,DisableForward,DisableReplyToFolder $VerbSetting.DisableReplyAll = $false $VerbSetting.DisableReply = $false $VerbSetting.DisableForward = $false $VerbSetting.DisableReplyToFolder = $false Import-Module -Name 'C:\Program Files\Microsoft\Exchange\Web Services\2.0\Microsoft.Exchange.WebServices.dll' ## Create Exchange Service Object $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService -ArgumentList Exchange2010 $service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials -ArgumentList $username, $password # 信任所有证书(测试用,生产环境建议验证证书) $Provider=New-Object Microsoft.CSharp.CSharpCodeProvider $Compiler=$Provider.CreateCompiler() $Params=New-Object System.CodeDom.Compiler.CompilerParameters $Params.GenerateExecutable=$False $Params.GenerateInMemory=$True $Params.IncludeDebugInformation=$False $Params.ReferencedAssemblies.Add("System.DLL") | Out-Null $TASource=@' namespace Local.ToolkitExtensions.Net.CertificatePolicy{ public class TrustAll : System.Net.ICertificatePolicy { public TrustAll() { } public bool CheckValidationResult(System.Net.ServicePoint sp, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Net.WebRequest req, int problem) { return true; } } '@ $TAResults=$Provider.CompileAssemblyFromSource($Params,$TASource) $TAAssembly=$TAResults.CompiledAssembly $TrustAll=$TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll") [System.Net.ServicePointManager]::CertificatePolicy=$TrustAll $uri=[system.URI] "https://web.xyz.com/EWS/Exchange.asmx" $service.Url = $uri function Get-VerbStream{ param ( $VerbSettings = "$( throw 'VerbSettings is a mandatory Parameter' )" ) process{ $Header = "02010600000000000000" $ReplyToAllHeader = "055265706C790849504D2E4E6F7465074D657373616765025245050000000000000000" $ReplyToAllFooter = "0000000000000002000000660000000200000001000000" $ReplyToHeader = "0C5265706C7920746F20416C6C0849504D2E4E6F7465074D657373616765025245050000000000000000" $ReplyToFooter = "0000000000000002000000670000000300000002000000" $ForwardHeader = "07466F72776172640849504D2E4E6F7465074D657373616765024657050000000000000000" $ForwardFooter = "0000000000000002000000680000000400000003000000" $ReplyToFolderHeader = "0F5265706C7920746F20466F6C6465720849504D2E506F737404506F737400050000000000000000" $ReplyToFolderFooter = "00000000000000020000006C00000008000000" # 替换为Yes/No投票选项的Hex定义 $YesOption = "04000000035965730849504D2E4E6F7465000359657300000000000000000001000000020000000200000001000000FFFFFFFF" $NoOption = "04000000024E6F0849504D2E4E6F746500024E6F00000000000000000001000000020000000200000002000000FFFFFFFF" # 替换对应的Unicode投票文本(Yes/No) $VoteOptionExtras = "0401055200650070006C00790002520045000C5200650070006C007900200074006F00200041006C006C0002520045000746006F007200770061007200640002460057000F5200650070006C007900200074006F00200046006F006C00640065007200000359006500730003590065007300024E006F00024E006F00" if($VerbSetting.DisableReplyAll){ $DisableReplyAllVal = "00" } else{ $DisableReplyAllVal = "01" } if($VerbSetting.DisableReply){ $DisableReplyVal = "00" } else{ $DisableReplyVal = "01" } if($VerbSetting.DisableForward){ $DisableForwardVal = "00" } else{ $DisableForwardVal = "01" } if($VerbSetting.DisableReplyToFolder){ $DisableReplyToFolderVal = "00" } else{ $DisableReplyToFolderVal = "01" } # 拼接VerbStream时用新的Yes/No选项替换原来的Approve/Reject $VerbValue = $Header + $ReplyToAllHeader + $DisableReplyAllVal + $ReplyToAllFooter + $ReplyToHeader + $DisableReplyVal +$ReplyToFooter + $ForwardHeader + $DisableForwardVal + $ForwardFooter + $ReplyToFolderHeader + $DisableReplyToFolderVal + $ReplyToFolderFooter + $YesOption + $NoOption + $VoteOptionExtras return $VerbValue } } function hex2binarray($hexString){ $i = 0 [byte[]]$binarray = @() while($i -le $hexString.length - 2){ $strHexBit = ($hexString.substring($i,2)) $binarray += [byte]([Convert]::ToInt32($strHexBit,16)) $i = $i + 2 } return ,$binarray } $VerbStreamProp = new-object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition([Microsoft.Exchange.WebServices.Data.DefaultExtendedPropertySet]::Common,0x8520, [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Binary) $VerbSettingValue = get-VerbStream $VerbSetting $EmailMessage = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage -ArgumentList $service $EmailMessage.Subject = "Message Subject" #Add Recipients $EmailMessage.ToRecipients.Add($SentTo) $EmailMessage.Body = New-Object Microsoft.Exchange.WebServices.Data.MessageBody $EmailMessage.Body.BodyType = [Microsoft.Exchange.WebServices.Data.BodyType]::HTML $EmailMessage.Body.Text = "Body" $EmailMessage.SetExtendedProperty($VerbStreamProp,(hex2binarray $VerbSettingValue)) $EmailMessage.SendAndSaveCopy()
关键修改点说明
- 替换投票选项的Hex定义:
- 原来的
$ApproveOption和$RejectOption被替换成$YesOption和$NoOption,每个选项的Hex结构里包含了选项的文本(比如03596573对应ASCII的"Yes"),以及MAPI类型标记。
- 原来的
- 更新
$VoteOptionExtras:- 这个变量里存储的是投票选项的Unicode编码文本(比如
03590065007300对应Unicode的"Yes"),确保邮件客户端能正确显示投票按钮的文本。
- 这个变量里存储的是投票选项的Unicode编码文本(比如
- 拼接VerbStream时替换选项:
- 在最终的
$VerbValue拼接中,用新的$YesOption和$NoOption替换原来的$ApproveOption和$RejectOption。
- 在最终的
如何自定义其他投票选项
如果想要改成比如“同意/不同意”或者“Accept/Decline”,只需要:
- 将你要的投票文本转成ASCII Hex(用于选项变量,开头要加文本长度的Hex值)和Unicode Hex(用于
$VoteOptionExtras)。- 举个例子,要添加“Accept”选项:
- ASCII Hex是
06416363657074("Accept"长度是6,所以开头是06) - Unicode Hex是
004100630063006500700074
- ASCII Hex是
- 举个例子,要添加“Accept”选项:
- 复制
$YesOption的结构,替换其中的文本Hex部分,生成新的选项变量。 - 在
$VoteOptionExtras末尾添加对应的Unicode Hex文本。
验证效果
发送邮件后,收件人在Outlook或其他支持EWS投票的客户端中,会看到你自定义的投票按钮(比如Yes/No),而不是默认的Approve/Reject。
内容的提问来源于stack exchange,提问作者im_mangesh
相关产品推荐
相关产品推荐

