Movimiento y copia de mensajes de correo electrónico mediante EWS en Exchange
Obtenga información sobre cómo mover y copiar 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 mover y copiar mensajes de correo electrónico en un buzón.
Tabla 1. Métodos de API administrada de EWS y operaciones de EWS para mover y copiar mensajes de correo electrónico
Task | Método de la API administrada de EWS | Operación de EWS |
---|---|---|
Mover un mensaje de correo electrónico |
EmailMessage.Move |
MoveItem |
Copia de un mensaje de correo electrónico |
EmailMessage.Copy |
CopyItem |
Es importante tener en cuenta que al mover o copiar un mensaje de correo electrónico en una carpeta diferente, se crea un nuevo elemento en la nueva carpeta con un identificador de elemento único y se elimina el mensaje original. Si va a mover o copiar un mensaje de correo electrónico entre dos carpetas del mismo buzón, el nuevo elemento se devuelve en la respuesta, lo que le proporciona acceso al nuevo identificador de elemento. Sin embargo, si va a mover o copiar un mensaje de correo electrónico entre dos buzones o entre un buzón y una carpeta pública, el nuevo elemento no se devuelve en la respuesta. Para obtener acceso al mensaje movido en ese escenario, use el método FindItems de la API administrada de EWS o la operación FindItem de EWS, cree una definición de propiedad extendida para la propiedad PidTagSearchKey (0x300B0102) o cree y establezca una propiedad extendida personalizada y, a continuación, busque la propiedad extendida personalizada en la nueva carpeta.
La eliminación de un mensaje de correo electrónico es diferente de mover un elemento a la carpeta Elementos eliminados. Si usa el método Item.Delete de la API administrada de EWS o la operación DeleteItem de EWS, el elemento especificado en la solicitud se quita de la carpeta original y se coloca una copia en la carpeta Elementos eliminados con un nuevo identificador de elemento. A diferencia de cuando mueve o copia cualquier elemento, el nuevo elemento no se devuelve en el método Delete ni en la respuesta de la operación DeleteItem . Los pasos implicados en la eliminación de un correo electrónico mediante la API administrada de EWS o EWS son los mismos que para eliminar cualquier elemento genérico del almacén de Exchange.
Mover un mensaje de correo electrónico mediante la API administrada de EWS
En el ejemplo de código siguiente se muestra cómo usar el método EmailMessage.Move para mover un mensaje de correo electrónico existente de una carpeta a otra.
En este ejemplo se supone que el servicio es un objeto ExchangeService válido y que ItemId es el identificador del mensaje de correo electrónico que se va a mover o copiar.
// As a best practice, limit the properties returned by the Bind method to only those that are required.
PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.Subject, EmailMessageSchema.ParentFolderId);
// Bind to the existing item by using the ItemId.
// This method call results in a GetItem call to EWS.
EmailMessage beforeMessage = EmailMessage.Bind(service, ItemId, propSet);
// Move the specified mail to the JunkEmail folder and store the returned item.
Item item = beforeMessage.Move(WellKnownFolderName.JunkEmail);
// Check that the item was moved by binding to the moved email message
// and retrieving the new ParentFolderId.
// This method call results in a GetItem call to EWS.
EmailMessage movedMessage = EmailMessage.Bind(service, item.Id, propSet);
Console.WriteLine("An email message with the subject '" + beforeMessage.Subject + "' has been moved from the '" + beforeMessage.ParentFolderId + "' folder to the '" + movedMessage.ParentFolderId + "' folder.");
Mover un mensaje de correo electrónico mediante EWS
En el ejemplo de código siguiente se muestra cómo usar la operación MoveItem para mover un mensaje de correo electrónico a la carpeta Email no deseado.
Esta es también la solicitud XML que envía la API administrada de EWS al llamar al método Move . Los valores de algunos atributos y elementos se han acortado para mejorar la legibilidad.
<?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="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2013" />
</soap:Header>
<soap:Body>
<m:MoveItem>
<m:ToFolderId>
<t:DistinguishedFolderId Id="junkemail" />
</m:ToFolderId>
<m:ItemIds>
<t:ItemId Id="AfwDoAAA="
ChangeKey="CQAAABYAAAApjGm7TnMWQ5TzjbhziLL0AAF25sM1" />
</m:ItemIds>
</m:MoveItem>
</soap:Body>
</soap:Envelope>
El servidor responde a la solicitud MoveItem con un mensaje MoveItemResponse que incluye un valor ResponseCode de NoError, lo que indica que el mensaje de correo electrónico se movió correctamente. La respuesta también incluye itemid para el mensaje de correo electrónico en la nueva carpeta, que es importante almacenar porque itemId es diferente en la nueva carpeta.
Copia de un mensaje de correo electrónico mediante la API administrada de EWS
En el ejemplo de código siguiente se muestra cómo usar el método EmailMessage.Copy para copiar un mensaje de correo electrónico existente de una carpeta a otra.
En este ejemplo se supone que el servicio es un objeto ExchangeService válido y que ItemId es el identificador del mensaje de correo electrónico que se va a copiar. Los valores de algunos parámetros se han acortado para mejorar la legibilidad.
// As a best practice, limit the properties returned by the Bind method to only those that are required.
PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.Subject, EmailMessageSchema.ParentFolderId);
// Bind to the existing item by using the ItemId.
// This method call results in a GetItem call to EWS.
EmailMessage originalMessage = EmailMessage.Bind(service, ItemId, propSet);
// Copy the orignal message into another folder in the mailbox and store the returned item.
Item item = originalMessage.Copy("epQ/3AAA=");
// Check that the item was copied by binding to the copied email message
// and retrieving the new ParentFolderId.
// This method call results in a GetItem call to EWS.
EmailMessage copiedMessage = EmailMessage.Bind(service, item.Id, propSet);
Console.WriteLine("An email message with the subject '" + originalMessage.Subject + "' has been copied from the '" + originalMessage.ParentFolderId + "' folder to the '" + copiedMessage.ParentFolderId + "' folder.");
Copia de un mensaje de correo electrónico mediante EWS
En el ejemplo de código siguiente se muestra cómo usar la operación CopyItem para copiar un mensaje de correo electrónico en otra carpeta del mismo buzón enviando el ItemId del mensaje de correo electrónico que se va a mover y especificando la carpeta de destino en el elemento ToFolderId .
Esta es también la solicitud XML que envía la API administrada de EWS al llamar al método Copy . Los valores de algunos atributos y elementos se han acortado para mejorar la legibilidad.
<?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="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2013" />
</soap:Header>
<soap:Body>
<m:CopyItem>
<m:ToFolderId>
<t:FolderId Id="pQ/3AAA=" />
</m:ToFolderId>
<m:ItemIds>
<t:ItemId Id="2TSeSAAA="
ChangeKey="CQAAABYAAAApjGm7TnMWQ5TzjbhziLL0AAF2d+3+" />
</m:ItemIds>
</m:CopyItem>
</soap:Body>
</soap:Envelope>
El servidor responde a la solicitud CopyItem con un mensaje CopyItemResponse que incluye un valor ResponseCode de NoError, lo que indica que el mensaje de correo electrónico se copió correctamente. La respuesta también incluye itemid para el mensaje de correo electrónico en la nueva carpeta, que es importante almacenar porque itemId es diferente en la nueva carpeta.