Respuesta a mensajes de correo electrónico mediante EWS en Exchange

Obtenga información sobre cómo responder a los mensajes de correo electrónico mediante la API administrada de EWS o EWS en Exchange.

Puede usar la API administrada de EWS o EWS para responder a los mensajes respondiéndoles o reenviándolos a los destinatarios.

Tabla 1. Métodos de API administrada de EWS y operaciones de EWS para responder a mensajes de correo electrónico

Task Método de la API administrada de EWS Operación de EWS
Respuesta a un mensaje de correo electrónico
EmailMessage.Reply
EmailMessage.CreateReply
CreateItem, donde el elemento Items tiene un elemento secundario de ReplyToItem o ReplyAllToItem.
Reenviar un mensaje de correo electrónico
EmailMessage.Forward
EmailMessage.CreateForward
CreateItem, donde el elemento Items tiene un elemento secundario de ForwardItem.

Respuesta a un mensaje de correo electrónico mediante la API administrada de EWS

La API administrada de EWS proporciona dos métodos que puede usar para responder a los mensajes: Reply y CreateReply. El método Reply solo toma dos parámetros: el mensaje de respuesta que se antepone al cuerpo existente y un valor booleano que indica si la respuesta debe ir a todos los destinatarios (true) o solo al remitente (false). Si necesita agregar destinatarios adicionales a un mensaje, establecer propiedades adicionales en una respuesta o agregar datos adjuntos, use el método CreateReply , que le permite establecer todas las propiedades de primera clase que están disponibles en un objeto EmailMessage .

En el ejemplo de código siguiente se muestra cómo usar el método Reply para responder a un mensaje de correo electrónico.

En este ejemplo se supone que service es un objeto ExchangeService válido y que el usuario se ha autenticado en un servidor Exchange. La variable local ItemId es el identificador del elemento al que se va a responder. En el ejemplo se llama al método FindRecentlySent para comprobar que el mensaje se ha marcado como respondido.

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

En el ejemplo de código siguiente se muestra cómo usar el método CreateReply para responder a un mensaje de correo electrónico.

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

Si necesita agregar datos adjuntos al mensaje de respuesta, reemplace la llamada al método SendAndSaveCopy por el código siguiente.

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

Respuesta a un mensaje de correo electrónico mediante EWS

En el ejemplo de código siguiente se muestra cómo responder a un mensaje mediante EWS. Use la operación CreateItem con el atributo MessageDisposition establecido en SendAndSaveCopy para enviar el mensaje y guardar la respuesta en la carpeta Elementos enviados. Incluya el elemento ReplyAllToItem como elemento secundario del elemento Items para responder a todos los usuarios del subproceso del mensaje o incluya el elemento ReplyToItem para responder solo al remitente.

Esta es también la solicitud XML que envía la API administrada de EWS al llamar al método Reply o 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>

El servidor responde a la solicitud CreateItem con un mensaje CreateItemResponse que incluye un valor de elemento ResponseCode de NoError, lo que indica que la respuesta se creó y envió correctamente.

Si necesita agregar datos adjuntos al mensaje de respuesta, llame a la operación CreateItem como se especificó anteriormente, pero cambie MessageDisposition a SaveOnly. A continuación, llame a la operación CreateAttachment , seguida de la operación SendItem .

Reenviar un mensaje de correo electrónico mediante la API administrada de EWS

La API administrada de EWS proporciona dos métodos que puede usar para reenviar mensajes: Forward y CreateForward. El método Forward solo toma dos parámetros: el mensaje que se antepone al cuerpo existente y una matriz o colección de destinatarios, en función de la sobrecarga que elija usar. Si necesita agregar datos adjuntos al mensaje que va a reenviar o establecer propiedades adicionales en el nuevo mensaje, use el método CreateForward , que le permite establecer todas las propiedades disponibles en un objeto EmailMessage .

En el ejemplo de código siguiente se muestra cómo usar el método Forward para reenviar un mensaje de correo electrónico a un destinatario.

En este ejemplo se supone que service es un objeto ExchangeService válido y que el usuario se ha autenticado en un servidor Exchange. La variable local ItemId es el identificador del elemento que se va a reenviar. En el ejemplo se llama al método FindRecentlySent para comprobar que el mensaje se ha marcado como reenviado.

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

En el ejemplo de código siguiente se muestra cómo usar el método CreateForward para reenviar un mensaje de correo electrónico a un destinatario.

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

Si necesita agregar datos adjuntos al mensaje reenviado, reemplace la llamada al método SendAndSaveCopy por el código siguiente.

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

Reenviar un mensaje de correo electrónico mediante EWS

En el ejemplo de código siguiente se muestra cómo reenviar un mensaje mediante EWS. Use la operación CreateItem con el atributo MessageDisposition establecido en SendAndSaveCopy para enviar el mensaje y guardar la respuesta en la carpeta Elementos enviados. El elemento ForwardItem indica que el elemento es un mensaje reenviado.

Esta es también la solicitud XML que la API administrada de EWS envía al llamar al método Forward o 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>

El servidor responde a la solicitud CreateItem con un mensaje CreateItemResponse que incluye un valor de elemento ResponseCode de NoError, lo que indica que el mensaje reenviado se creó y envió correctamente.

Si necesita agregar datos adjuntos al mensaje de respuesta, llame a la operación CreateItem , pero cambie MessageDisposition a SaveOnly. A continuación, llame a la operación CreateAttachment , seguida de la operación SendItem .

Busque la última respuesta al mensaje o reenvíe mediante la API administrada de EWS.

En el ejemplo de código siguiente se muestra cómo buscar el último verbo ejecutado y la hora en que se ejecutó el último verbo en el elemento especificado. Se llama a este método desde otros ejemplos de código de API administrada de EWS en este tema para comprobar que los elementos a los que respondió o reenvió se marcaron como respondidos o reenviados en la Bandeja de entrada.

En el ejemplo se usa la propiedad extendida PidTagLastVerbExecuted (0x10820003) para determinar si el mensaje era una respuesta, una respuesta all o un reenvío, y la propiedad extendida PidTagLastVerbExecutionTime (0x10820040) para determinar cuándo se envió la respuesta o reenvío.

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

Vea también