Реагирование на сообщения электронной почты с помощью EWS в Exchange
Узнайте, как отвечать на сообщения электронной почты с помощью управляемого API EWS или EWS в Exchange.
Вы можете использовать управляемый API EWS или EWS для реагирования на сообщения, отвечая на них или пересылая их получателям.
Таблица 1. Методы управляемого API EWS и операции EWS для реагирования на сообщения электронной почты
Задача | Метод управляемого API EWS | Операция EWS |
---|---|---|
Ответ на сообщение электронной почты |
EmailMessage.Reply EmailMessage.CreateReply |
CreateItem, где элемент Items имеет дочерний элемент ReplyToItem или ReplyAllToItem. |
Пересылка сообщения электронной почты |
EmailMessage.Forward EmailMessage.CreateForward |
CreateItem, где элемент Items имеет дочерний элемент ForwardItem. |
Ответ на сообщение электронной почты с помощью управляемого API EWS
Управляемый API EWS предоставляет два метода, которые можно использовать для реагирования на сообщения: Reply и CreateReply. Метод Reply принимает только два параметра: ответное сообщение для добавления к существующему тексту и логическое значение, указывающее, должен ли ответ идти всем получателям (true) или только отправителю (false). Если необходимо добавить в сообщение дополнительных получателей, задать дополнительные свойства в ответе или добавить вложение, используйте метод CreateReply , который позволяет задать все свойства первого класса , доступные для объекта EmailMessage .
В следующем примере кода показано, как использовать метод Reply для ответа на сообщение электронной почты.
В этом примере предполагается, что служба является действительным объектом ExchangeService, и что пользователь прошел проверку подлинности на сервере Exchange server. Локальная переменная ItemId — это идентификатор элемента, на который нужно ответить. В примере вызывается метод FindRecentlySent , чтобы убедиться, что сообщение было помечено как ответное.
// As a best practice, limit the properties returned by the Bind method to only those that are required.
PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, ItemSchema.LastModifiedTime);
// Bind to the email message to reply to by using the ItemId.
// This method call results in a GetItem call to EWS.
EmailMessage message = EmailMessage.Bind(service, ItemId, propSet);
string myReply = "This is the message body of the email reply.";
bool replyToAll = false;
// Send the response message.
// This method call results in a CreateItem call to EWS.
message.Reply(myReply, replyToAll);
// Verify that the response was sent by calling FindRecentlySent.
FindRecentlySent(message);
В следующем примере кода показано, как использовать метод CreateReply для ответа на сообщение электронной почты.
// Bind to the email message to reply to by using the ItemId.
// This method call results in a GetItem call to EWS.
EmailMessage message = EmailMessage.Bind(service, ItemId, BasePropertySet.IdOnly);
// Create the reply response message from the original email message.
// Indicate whether the message is a reply or reply all type of reply.
bool replyToAll = true;
ResponseMessage responseMessage = message.CreateReply(replyToAll);
// Prepend the reply to the message body.
string myReply = "This is the message body of the email reply.";
responseMessage.BodyPrefix = myReply;
// Send the response message.
// This method call results in a CreateItem call to EWS.
responseMessage.SendAndSaveCopy();
// Check that the response was sent by calling FindRecentlySent.
FindRecentlySent(message);
Если необходимо добавить вложение в ответное сообщение, замените вызов метода SendAndSaveCopy следующим кодом.
EmailMessage reply = responseMessage.Save();
reply.Attachments.AddFileAttachment("attachmentname.txt");
reply.Update(ConflictResolutionMode.AutoResolve);
reply.SendAndSaveCopy();
Ответ на сообщение электронной почты с помощью EWS
В следующем примере кода показано, как ответить на сообщение с помощью EWS. Используйте операцию CreateItem с атрибутомMessageDisposition , для параметра SendAndSaveCopy , чтобы отправить сообщение и сохранить ответ в папке Отправленные. Добавьте элемент ReplyAllToItem в качестве дочернего элемента Items , чтобы ответить всем пользователям в потоке сообщения, или включите элемент ReplyToItem , чтобы ответить только отправителю.
Это также XML-запрос, который отправляет управляемый API EWS при вызове метода Reply или CreateReply .
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version=" Exchange2007_SP1" />
</soap:Header>
<soap:Body>
<m:CreateItem MessageDisposition="SendAndSaveCopy">
<m:Items>
<t:ReplyAllToItem>
<t:ReferenceItemId Id="AAMkADE4="
ChangeKey="CQAAABYA" />
<t:NewBodyContent BodyType="HTML">This is the message body of the email reply.</t:NewBodyContent>
</t:ReplyAllToItem>
</m:Items>
</m:CreateItem>
</soap:Body>
</soap:Envelope>
Сервер отвечает на запрос CreateItem сообщением CreateItemResponse , которое содержит значение элемента ResponseCodeNoError, указывающее, что ответ был успешно создан и отправлен.
Если необходимо добавить вложение в ответное сообщение, вызовите операцию CreateItem , как указано выше, но измените messageDisposition на SaveOnly. Затем вызовите операцию CreateAttachment , а затем операцию SendItem .
Пересылка сообщения электронной почты с помощью управляемого API EWS
Управляемый API EWS предоставляет два метода, которые можно использовать для пересылки сообщений: Forward и CreateForward. Метод Forward принимает только два параметра: сообщение для добавления к существующему тексту и массив или коллекцию получателей в зависимости от выбранной перегрузки. Если необходимо добавить вложение к пересылаемому сообщению или задать дополнительные свойства для нового сообщения, используйте метод CreateForward , который позволяет задать все свойства, доступные для объекта EmailMessage .
В следующем примере кода показано, как использовать метод Forward для пересылки сообщения электронной почты одному получателю.
В этом примере предполагается, что служба является действительным объектом ExchangeService, и что пользователь прошел проверку подлинности на сервере Exchange server. Локальная переменная ItemId — это идентификатор пересылаемого элемента. В примере вызывается метод FindRecentlySent , чтобы убедиться, что сообщение было помечено как переадресованное.
// Bind to the email message to reply to by using the ItemId.
// This method call results in a GetItem call to EWS.
EmailMessage message = EmailMessage.Bind(service, ItemId, BasePropertySet.IdOnly);
string myForward = "This is the message body of the forwarded email.";
// Send the response message.
// This method call results in a CreateItem call to EWS.
message.Forward(myForward, "sadie@contoso.com");
// Verify that the forwarded response was sent by calling FindRecentlySent.
FindRecentlySent(message);
В следующем примере кода показано, как использовать метод CreateForward для пересылки сообщения электронной почты одному получателю.
// Bind to the email message to reply to by using the ItemId.
// This method call results in a GetItem call to EWS.
EmailMessage message = EmailMessage.Bind(service, ItemId, BasePropertySet.IdOnly);
// Create the reply response message from the original email message.
// Indicate whether the message is a reply or reply all type of reply.
ResponseMessage forwardMessage = message.CreateForward();
// Set properties on the email message.
forwardMessage.ToRecipients.Add("sadie@contoso.com");
forwardMessage.Body = "Sadie,<br><br>I thought you'd be interested in this thread.<br><br>-Mack";
// Send and save a copy of the replied email message in the default Sent Items folder.
forwardMessage.SendAndSaveCopy();
// Verify that the forwarded message was sent by calling FindRecentlySent.
FindRecentlySent(message);
Если необходимо добавить вложение в пересылаемое сообщение, замените вызов метода SendAndSaveCopy следующим кодом.
EmailMessage forward = forwardMessage.Save();
forward.Attachments.AddFileAttachment("attachmentname.txt");
forward.Update(ConflictResolutionMode.AutoResolve);
forward.SendAndSaveCopy();
Пересылка сообщения электронной почты с помощью EWS
В следующем примере кода показано, как пересылать сообщение с помощью EWS. Используйте операцию CreateItem с атрибутомMessageDisposition , для параметра SendAndSaveCopy , чтобы отправить сообщение и сохранить ответ в папке Отправленные. Элемент ForwardItem указывает, что элемент является переадресованным сообщением.
Это также XML-запрос, который управляемый API EWS отправляет при вызове метода Forward или CreateForward .
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
</soap:Header>
<soap:Body>
<m:CreateItem MessageDisposition="SendAndSaveCopy">
<m:Items>
<t:ForwardItem>
<t:ToRecipients>
<t:Mailbox>
<t:EmailAddress>sadie@contoso.com</t:EmailAddress>
</t:Mailbox>
</t:ToRecipients>
<t:ReferenceItemId Id="AAAMkADE="
ChangeKey="CQAAABYA" />
<t:NewBodyContent BodyType="HTML">This is the message body of the forwarded email.</t:NewBodyContent>
</t:ForwardItem>
</m:Items>
</m:CreateItem>
</soap:Body>
</soap:Envelope>
Сервер отвечает на запрос CreateItem сообщением CreateItemResponse , которое содержит значение элемента ResponseCodeNoError, указывающее, что пересылаемое сообщение было создано и отправлено успешно.
Если необходимо добавить вложение в ответное сообщение, вызовите операцию CreateItem , но измените messageDisposition на SaveOnly. Затем вызовите операцию CreateAttachment , а затем операцию SendItem .
Поиск последнего ответа или перенаправления сообщения с помощью управляемого API EWS
В следующем примере кода показано, как найти последнюю выполненную команду и время выполнения последней команды для указанного элемента. Этот метод вызывается из других примеров кода управляемого API EWS в этом разделе, чтобы убедиться, что элементы, на которые вы ответили или переадресовали, были помечены как ответы или перенаправлены в папке "Входящие".
В примере используется расширенное свойство PidTagLastVerbExecuted (0x10820003) для определения того, было ли сообщение ответом, ответом на все или пересылкой, и расширенное свойство PidTagLastVerbExecutionTime (0x10820040) для определения момента отправки ответа или пересылки.
public static void FindRecentlySent(EmailMessage messageToCheck)
{
// Create extended property definitions for PidTagLastVerbExecuted and PidTagLastVerbExecutionTime.
ExtendedPropertyDefinition PidTagLastVerbExecuted = new ExtendedPropertyDefinition(0x1081, MapiPropertyType.Integer);
ExtendedPropertyDefinition PidTagLastVerbExecutionTime = new ExtendedPropertyDefinition(0x1082, MapiPropertyType.SystemTime);
PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.Subject, PidTagLastVerbExecutionTime, PidTagLastVerbExecuted);
messageToCheck = EmailMessage.Bind(service, messageToCheck.Id, propSet);
// Determine the last verb executed on the message and display output.
object responseType;
if (messageToCheck.TryGetProperty(PidTagLastVerbExecuted, out responseType))
{
object ReplyTime = null;
switch (((Int32)responseType))
{
case 102: Console.WriteLine("A reply was sent to the '" + messageToCheck.Subject.ToString() + "' email message at");
break;
case 103: Console.WriteLine("A reply all was sent to the '" + messageToCheck.Subject.ToString() + "' email message at");
break;
case 104: Console.WriteLine("The '" + messageToCheck.Subject.ToString() + "' email message was forwarded at");
break;
}
if (messageToCheck.TryGetProperty(PidTagLastVerbExecutionTime, out ReplyTime))
{
Console.WriteLine(((DateTime)ReplyTime).ToString() + ".");
}
}
else
{
Console.WriteLine("No changes were made to '" + messageToCheck.Subject.ToString() + "'.");
}
}