Поделиться через


Реагирование на сообщения электронной почты с помощью 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() + "'.");
    }
}

См. также