Responder a mensagens de email usando o EWS no Exchange

Saiba como responder a mensagens de email usando a API Gerenciada do EWS ou o EWS no Exchange.

Você pode usar a API Gerenciada do EWS ou o EWS para responder às mensagens respondendo a elas ou encaminhando-as para destinatários.

Tabela 1. Métodos de API Gerenciada do EWS e operações EWS para responder a mensagens de email

Tarefa Método da API Gerenciada do EWS Operação do EWS
Responder a uma mensagem de email
EmailMessage.Reply
EmailMessage.CreateReply
CreateItem, em que o elemento Items tem um elemento filho de ReplyToItem ou ReplyAllToItem.
Encaminhar uma mensagem de email
EmailMessage.Forward
EmailMessage.CreateForward
CreateItem, em que o elemento Items tem um elemento filho do ForwardItem.

Responder a uma mensagem de email usando a API Gerenciada do EWS

A API Gerenciada do EWS fornece dois métodos que você pode usar para responder às mensagens: Responder e CriarReply. O método Reply usa apenas dois parâmetros: a mensagem de resposta para pré-endend para o corpo existente e um valor booliano que indica se a resposta deve ir para todos os destinatários (true) ou apenas o remetente (false). Se você precisar adicionar destinatários adicionais a uma mensagem, definir propriedades adicionais em uma resposta ou adicionar um anexo, use o método CreateReply , que permite definir todas as propriedades de primeira classe disponíveis em um objeto EmailMessage .

O exemplo de código a seguir mostra como usar o método Reply para responder a uma mensagem de email.

Esse exemplo pressupõe que serviço seja um objeto ExchangeService válido e que o usuário tenha sido autenticado em um servidor Exchange. A variável local ItemId é a Id do item a ser respondido. O exemplo chama o método FindRecentlySent para verificar se a mensagem foi marcada como respondida.

// 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);

O exemplo de código a seguir mostra como usar o método CreateReply para responder a uma mensagem de email.

// 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);

Se você precisar adicionar um anexo à mensagem de resposta, substitua a chamada para o método SendAndSaveCopy pelo código a seguir.

EmailMessage reply = responseMessage.Save();
reply.Attachments.AddFileAttachment("attachmentname.txt");
reply.Update(ConflictResolutionMode.AutoResolve);
reply.SendAndSaveCopy();

Responder a uma mensagem de email usando o EWS

O exemplo de código a seguir mostra como responder a uma mensagem usando o EWS. Use a operação CreateItem com o atributo MessageDisposition definido como SendAndSaveCopy para enviar a mensagem e salvar a resposta na pasta Itens Enviados. Inclua o elemento ReplyAllToItem como filho do elemento Items para responder a todos no thread da mensagem ou inclua o elemento ReplyToItem para responder apenas ao remetente.

Essa também é a solicitação XML que a API Gerenciada do EWS envia ao chamar o método Reply ou CreateReply .

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="https://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>

O servidor responde à solicitação CreateItem com uma mensagem CreateItemResponse que inclui um valor de elemento ResponseCode do NoError, que indica que a resposta foi criada e enviada com êxito.

Se você precisar adicionar um anexo à sua mensagem de resposta, chame a operação CreateItem conforme especificado acima, mas altere o MessageDisposition para SaveOnly. Em seguida, chame a operação CreateAttachment , seguida pela operação SendItem .

Encaminhar uma mensagem de email usando a API Gerenciada do EWS

A API Gerenciada do EWS fornece dois métodos que você pode usar para encaminhar mensagens: Encaminhar e CriarForward. O método Forward usa apenas dois parâmetros: a mensagem para se preparar para o corpo existente e uma matriz ou coleção de destinatários, dependendo da sobrecarga que você optar por usar. Se você precisar adicionar um anexo à mensagem que está encaminhando ou definir propriedades adicionais na nova mensagem, use o método CreateForward , que permite definir todas as propriedades disponíveis em um objeto EmailMessage .

O exemplo de código a seguir mostra como usar o método Encaminhar para encaminhar uma mensagem de email para um destinatário.

Esse exemplo pressupõe que serviço seja um objeto ExchangeService válido e que o usuário tenha sido autenticado em um servidor Exchange. A variável local ItemId é a Id do item a ser encaminhado. O exemplo chama o método FindRecentlySent para verificar se a mensagem foi marcada como encaminhada.

// 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);

O exemplo de código a seguir mostra como usar o método CreateForward para encaminhar uma mensagem de email para um destinatário.

// 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);

Se você precisar adicionar um anexo à mensagem encaminhada, substitua a chamada para o método SendAndSaveCopy pelo código a seguir.

EmailMessage forward = forwardMessage.Save();
forward.Attachments.AddFileAttachment("attachmentname.txt");
forward.Update(ConflictResolutionMode.AutoResolve);
forward.SendAndSaveCopy();

Encaminhar uma mensagem de email usando o EWS

O exemplo de código a seguir mostra como encaminhar uma mensagem usando o EWS. Use a operação CreateItem com o atributo MessageDisposition definido como SendAndSaveCopy para enviar a mensagem e salvar a resposta na pasta Itens Enviados. O elemento ForwardItem indica que o item é uma mensagem encaminhada.

Essa também é a solicitação XML que a API Gerenciada do EWS envia ao chamar o método Forward ou CreateForward .

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="https://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>

O servidor responde à solicitação CreateItem com uma mensagem CreateItemResponse que inclui um valor de elemento ResponseCode do NoError, que indica que a mensagem encaminhada foi criada e enviada com êxito.

Se você precisar adicionar um anexo à sua mensagem de resposta, chame a operação CreateItem , mas altere o MessageDisposition para SaveOnly. Em seguida, chame a operação CreateAttachment , seguida pela operação SendItem .

Localizar a última mensagem respondida ou encaminhada usando a API Gerenciada do EWS

O exemplo de código a seguir mostra como localizar o último verbo executado e a hora em que o último verbo foi executado no item especificado. Esse método é chamado de outros exemplos de código de API Gerenciada do EWS neste tópico para verificar se os itens aos quais você respondeu ou encaminhou foram marcados como respondidos ou encaminhados em sua caixa de entrada.

O exemplo usa a propriedade estendida PidTagLastVerbExecuted (0x10820003) para determinar se a mensagem era uma resposta, uma resposta a todos ou um encaminhamento e a propriedade estendida PidTagLastVerbExecutionTime (0x10820040) para determinar quando a resposta ou o encaminhamento foram enviados.

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() + "'.");
    }
}

Confira também