by

Sending a message with voting buttons utilizing EWS

Sending a message with voting buttons utilizing EWS Voting button’s in emails are one the lengthy standing options of utilizing Outlook with Alternate, in Alternate 2013 SP1 there’s now help for responding to Vote requests with EWS . Nevertheless there’s nonetheless no direct help for sending a message with voting buttons in EWS, so on this submit I’ll present a technique you need to use to ship a message with Voting Button in EWS by setting the PidLidVerbStream prolonged Property on a message which is documented within the http://msdn.microsoft.com/en-us/library/ee218541(v=exchg.80).aspx .

I used this property a number of months again in one other script for stopping ReplyAll on a message, this script makes use of a lot the identical code with the addition of Hex values for the Voting choices to incorporate within the Message. Firstly every voting choice you need to add makes use of the VoteOption Construction http://msdn.microsoft.com/en-us/library/ee218406(v=exchg.80).aspx . That is affordable straight ahead eg

$ApproveOption = “0400000007417070726F76650849504D2E4E6F74650007417070726F766500000000000000000001000000020000000200000001000000FFFFFFFF”

equates to

 04000000 VerbType
 07 Size of the DisplayName eg the size of (Approve)
 417070726F7665 (Approve in Hex)
  08 Size of the MsgClsNameCount  eg the size of (IPM.Notice)
 49504D2E4E6F7465 (IPM.Notice in Hex)
 00 Internal1StringCount
 07417070726F7665 Repeat of the DisplayName and Size

The remainder of the choices are listed within the documentation hyperlink the one fascinating choice is SendBehavior which lets you management if you need the person to be prompted in regards to the response of to only ship it instantly. In my instance scripts its set to immediate the person

The next script will ship a message utilizing EWS with Appove/Reject voting buttons  I’ve put a download of this script right here the code itself appears to be like like

  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
$MailboxName = $args[0]
$SentTo = $args[1]

$VerbSetting = "" | Choose DisableReplyAll,DisableReply,DisableForward,DisableReplyToFolder
$VerbSetting.DisableReplyAll = $false
$VerbSetting.DisableReply = $false
$VerbSetting.DisableForward = $false
$VerbSetting.DisableReplyToFolder = $false

## Load Managed API dll

###CHECK FOR EWS MANAGED API, IF PRESENT IMPORT THE HIGHEST VERSION EWS DLL, ELSE EXIT
$EWSDLL = (($(Get-ItemProperty -ErrorAction SilentlyContinue -Path Registry::$(Get-ChildItem -ErrorAction SilentlyContinue -Path 'Registry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftExchangeWeb Companies'|Kind-Object Identify -Descending| Choose-Object -First 1 -ExpandProperty Identify)).'Set up Listing') + "Microsoft.Exchange.WebServices.dll")
if (Take a look at-Path $EWSDLL)
{
Import-Module $EWSDLL
}
else
{
"$(get-date -format yyyyMMddHHmmss):"
"This script requires the EWS Managed API 1.2 or later."
"Please download and install the current version of the EWS Managed API from"
"http://go.microsoft.com/fwlink/?LinkId=255472"
""
"Exiting Script."
exit
}

## Set Alternate Model
$ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Alternate2010_SP2

## Create Alternate Service Object
$service = New-Object Microsoft.Alternate.WebServices.Knowledge.ExchangeService($ExchangeVersion)

## Set Credentials to make use of two choices are availible Option1 to make use of explict credentials or Possibility 2 use the Default (logged On) credentials

#Credentials Possibility 1 utilizing UPN for the home windows Account
$psCred = Get-Credential
$creds = New-Object System.Internet.NetworkCredential($psCred.UserName.ToString(),$psCred.GetNetworkCredential().password.ToString())
$service.Credentials = $creds

#Credentials Possibility 2
#service.UseDefaultCredentials = $true

## Select to disregard any SSL Warning points attributable to Self Signed Certificates

## Code From http://poshcode.org/624
## Create a compilation setting
$Supplier=New-Object Microsoft.CSharp.CSharpCodeProvider
$Compiler=$Supplier.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 Native.ToolkitExtensions.Internet.CertificatePolicy{
public class TrustAll : System.Internet.ICertificatePolicy {
public TrustAll() {
}
public bool CheckValidationResult(System.Internet.ServicePoint sp,
System.Safety.Cryptography.X509Certificates.X509Certificates cert,
System.Internet.WebRequest req, int drawback) {
return true;
}
}
}
'@
$TAResults=$Supplier.CompileAssemblyFromSource($Params,$TASource)
$TAAssembly=$TAResults.CompiledAssembly

## We now create an occasion of the TrustAll and fix it to the ServicePointManager
$TrustAll=$TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
[System.Net.ServicePointManager]::CertificatePolicy=$TrustAll

## finish code from http://poshcode.org/624

## Set the URL of the CAS (Consumer Entry Server) to make use of two choices are availbe to make use of Autodiscover to seek out the CAS URL or Hardcode the CAS to make use of

#CAS URL Possibility 1 Autodiscover
$service.AutodiscoverUrl($MailboxName,{$true})
"Using CAS Server : " + $Service.url

#CAS URL Possibility 2 Hardcoded

#$uri=[system.URI] "https://casservername/ews/exchange.asmx"
#$service.Url = $uri

## Optionally available part for Alternate Impersonation

#$service.ImpersonatedUserId = new-object Microsoft.Alternate.WebServices.Knowledge.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $MailboxName)


operate Get-VerbStream{
param (
$VerbSettings = "$( throw 'VerbSettings is a compulsory Parameter' )"
)
course of{

$Header = "02010600000000000000"
$ReplyToAllHeader = "055265706C790849504D2E4E6F7465074D657373616765025245050000000000000000"
$ReplyToAllFooter = "0000000000000002000000660000000200000001000000"
$ReplyToHeader = "0C5265706C7920746F20416C6C0849504D2E4E6F7465074D657373616765025245050000000000000000"
$ReplyToFooter = "0000000000000002000000670000000300000002000000"
$ForwardHeader = "07466F72776172640849504D2E4E6F7465074D657373616765024657050000000000000000"
$ForwardFooter = "0000000000000002000000680000000400000003000000"
$ReplyToFolderHeader = "0F5265706C7920746F20466F6C6465720849504D2E506F737404506F737400050000000000000000"
$ReplyToFolderFooter = "00000000000000020000006C00000008000000"
$ApproveOption = "0400000007417070726F76650849504D2E4E6F74650007417070726F766500000000000000000001000000020000000200000001000000FFFFFFFF"
$RejectOption= "040000000652656A6563740849504D2E4E6F7465000652656A65637400000000000000000001000000020000000200000002000000FFFFFFFF"
$VoteOptionExtras = "0401055200650070006C00790002520045000C5200650070006C007900200074006F00200041006C006C0002520045000746006F007200770061007200640002460057000F5200650070006C007900200074006F00200046006F006C00640065007200000741007000700072006F00760065000741007000700072006F007600650006520065006A0065006300740006520065006A00650063007400"
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"
}
$VerbValue = $Header + $ReplyToAllHeader + $DisableReplyAllVal + $ReplyToAllFooter + $ReplyToHeader + $DisableReplyVal +$ReplyToFooter + $ForwardHeader + $DisableForwardVal + $ForwardFooter + $ReplyToFolderHeader + $DisableReplyToFolderVal + $ReplyToFolderFooter + $ApproveOption + $RejectOption + $VoteOptionExtras
return $VerbValue
}
}

operate hex2binarray($hexString){
$i = 0
[byte[]]$binarray = @()
whereas($i -le $hexString.size - 2){
$strHexBit = ($hexString.substring($i,2))
$binarray += [byte]([Convert]::ToInt32($strHexBit,16))
$i = $i + 2
}
return ,$binarray
}



$VerbStreamProp = new-object Microsoft.Alternate.WebServices.Knowledge.ExtendedPropertyDefinition([Microsoft.Exchange.WebServices.Data.DefaultExtendedPropertySet]::Widespread,0x8520, [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Binary)

$VerbSettingValue = get-VerbStream $VerbSetting

$EmailMessage = New-Object Microsoft.Alternate.WebServices.Knowledge.EmailMessage -ArgumentList $service
$EmailMessage.Topic = "Message Subject"
#Add Recipients
$EmailMessage.ToRecipients.Add($SentTo)
$EmailMessage.Physique = New-Object Microsoft.Alternate.WebServices.Knowledge.MessageBody
$EmailMessage.Physique.BodyType = [Microsoft.Exchange.WebServices.Data.BodyType]::HTML
$EmailMessage.Physique.Textual content = "Body"
$EmailMessage.SetExtendedProperty($VerbStreamProp,(hex2binarray $VerbSettingValue))
$EmailMessage.SendAndSaveCopy()