You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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()

关键修改点说明

  1. 替换投票选项的Hex定义:
    • 原来的$ApproveOption和$RejectOption被替换成$YesOption和$NoOption,每个选项的Hex结构里包含了选项的文本(比如03596573对应ASCII的"Yes"),以及MAPI类型标记。
  2. 更新$VoteOptionExtras:
    • 这个变量里存储的是投票选项的Unicode编码文本(比如03590065007300对应Unicode的"Yes"),确保邮件客户端能正确显示投票按钮的文本。
  3. 拼接VerbStream时替换选项:
    • 在最终的$VerbValue拼接中,用新的$YesOption和$NoOption替换原来的$ApproveOption和$RejectOption。

如何自定义其他投票选项

如果想要改成比如“同意/不同意”或者“Accept/Decline”,只需要:

  1. 将你要的投票文本转成ASCII Hex(用于选项变量,开头要加文本长度的Hex值)和Unicode Hex(用于$VoteOptionExtras)。
    • 举个例子,要添加“Accept”选项:
      • ASCII Hex是06416363657074("Accept"长度是6,所以开头是06)
      • Unicode Hex是004100630063006500700074
  2. 复制$YesOption的结构,替换其中的文本Hex部分,生成新的选项变量。
  3. 在$VoteOptionExtras末尾添加对应的Unicode Hex文本。

验证效果

发送邮件后,收件人在Outlook或其他支持EWS投票的客户端中,会看到你自定义的投票按钮(比如Yes/No),而不是默认的Approve/Reject。

内容的提问来源于stack exchange,提问作者im_mangesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:58:27