Sincronizar elementos mediante EWS en Exchange

Obtenga información sobre cómo importar citas, correos electrónicos, contactos, tareas y otros elementos mediante la API administrada de EWS o EWS en Exchange.

Muchos sistemas contienen citas, correos electrónicos, contactos y tareas, y puede importar esos elementos en Exchange de varias maneras diferentes. Importar elementos en Exchange es sencillo cuando las relaciones de buzón de correo no se mantienen en esos elementos. Puede usar el método De API administrada de EWS Item.Save o la operación EWS CreateItem para crear los elementos en un buzón de Exchange. Sin embargo, el enfoque simple no admite todos los escenarios; por ejemplo:

  • No se puede mantener la relación entre organizadores y asistentes al importar citas con asistentes (reuniones). Esto significa que el organizador de la reunión tendrá que volver a enviar invitaciones a los asistentes para restablecer la relación entre el organizador y los asistentes. Si la cita se importó en el calendario de un asistente, la cita no estará relacionada con la cita del organizador de la reunión. Los asistentes tendrán que aceptar la invitación de reunión del organizador para restablecer la relación organizador-asistente.

  • La información sobre los asignados no se conserva cuando se importan las tareas asignadas.

Todas las opciones de importación se pueden usar para importar elementos por lotes en Exchange.

Uso de tipos de elemento de EWS o API administrada de EWS para importar un elemento

Puede usar la API administrada de EWS o EWS para importar correos electrónicos, contactos, citas o tareas de otros sistemas. Solo tiene que establecer las propiedades del formato de origen en cualquiera de los objetos siguientes, en función de lo que importe.

Tabla 1. Objetos de API administrada de EWS y elementos de EWS

Objeto de API administrada de EWS Elemento EWS
EmailMessage
Message
Contact
Contact
Appointment
CalendarItem
Tarea
Tarea

Use el método De API administrada de EWS Item.Save o la operación EWS CreateItem para realizar la importación de elementos. Se recomienda este enfoque al importar elementos de otros sistemas porque tiene control sobre qué propiedades se importan. Para obtener más información sobre cómo establecer propiedades en elementos y, a continuación, guardar el elemento, vea Crear un elemento mediante la API administrada de EWS o Crear un elemento mediante EWS.

Importación de elementos con fidelidad completa

Puede usar la operación EWS UploadItems para cargar un elemento como una secuencia de datos. Esta representación de flujo de datos de un elemento debe proceder de los resultados de una llamada a la operación ExportItems . Dado que la API administrada de EWS no implementa la operación UploadItems , si usa la API administrada de EWS, deberá escribir una rutina para enviar las solicitudes web.

Esta es la manera más fácil de importar elementos que se han exportado desde otro servidor de Exchange.

En el ejemplo siguiente, los identificadores y el contenido del elemento Data se acortan para mejorar la legibilidad.

<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"
      xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
      xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013_SP1"/>
  </soap:Header>
  <soap:Body>
    <m:UploadItems>
      <m:Items>
        <t:Item CreateAction="CreateNew">
          <t:ParentFolderId  Id="AAMkADEzOTE7kV0AAA=" ChangeKey="AQAAAA=="/>
          <t:Data>AQAAAAgAAAAAAQAAAAADABZADQASDkANABMO</t:Data>
        </t:Item>
      </m:Items>
    </m:UploadItems>
  </soap:Body>
</soap:Envelope>

El servidor responde a la solicitud UploadItems con un elemento UploadItemsResponse que incluye un valor de elemento ResponseCode de NoError, lo que indica que el elemento se cargó correctamente. La respuesta también incluye el identificador de elemento del elemento cargado.

Uso de la secuencia MIME para importar desde formatos de archivo comunes

EWS puede importar archivos EML (.eml) e iCal (.ics). Querrá probar el contenido MIME para ver cómo el analizador MIME de Exchange controla el contenido de la secuencia MIME. Aunque el uso de la secuencia MIME es conveniente, normalmente es mejor usar tipos de elemento de EWS o API administrada de EWS para importar un elemento. Este es un ejemplo de cómo importar una vCard.

Uso de la API administrada de EWS para importar un correo electrónico desde un archivo EML mediante la secuencia MIME

En el ejemplo siguiente se muestra cómo establecer la propiedad MimeContent con el contenido de un archivo EML y, a continuación, importar el correo electrónico en un buzón. En este ejemplo también se muestra cómo establecer la propiedad extendida PidTagMessageFlags (0x0E07) en un correo electrónico importado para que no aparezca en el buzón como un elemento de borrador. En este ejemplo se supone que service es un objeto ExchangeService válido y que el usuario se ha autenticado en un servidor Exchange.

private static void UploadMIMEEmail(ExchangeService service)
{
    EmailMessage email = new EmailMessage(service);
    
    string emlFileName = @"C:\import\email.eml";
    using (FileStream fs = new FileStream(emlFileName, FileMode.Open, FileAccess.Read))
    {
        byte[] bytes = new byte[fs.Length];
        int numBytesToRead = (int)fs.Length;
        int numBytesRead = 0;
        while (numBytesToRead > 0)
        {
            int n = fs.Read(bytes, numBytesRead, numBytesToRead);
            if (n == 0)
                break;
            numBytesRead += n;
            numBytesToRead -= n;
        }
        // Set the contents of the .eml file to the MimeContent property.
        email.MimeContent = new MimeContent("UTF-8", bytes);
    }
    
    // Indicate that this email is not a draft. Otherwise, the email will appear as a 
    // draft to clients.
    ExtendedPropertyDefinition PR_MESSAGE_FLAGS_msgflag_read = new ExtendedPropertyDefinition(3591, MapiPropertyType.Integer);
    email.SetExtendedProperty(PR_MESSAGE_FLAGS_msgflag_read, 1);
    // This results in a CreateItem call to EWS. The email will be saved in the Inbox folder.
    email.Save(WellKnownFolderName.Inbox);
}

Uso de la API administrada de EWS para importar una cita desde un archivo iCal mediante la secuencia MIME

Puede importar citas sencillas en forma de archivos iCalendar mediante el flujo MIME. No se pueden importar reuniones, que son citas con asistentes, porque la relación entre los organizadores de reuniones y los asistentes debe establecerse como parte del flujo de trabajo de calendario de Exchange . Los asistentes no se pueden capturar en la secuencia MIME.

En el ejemplo de código siguiente se muestra cómo importar un archivo .ics simple en el buzón de un usuario.

private static void UploadMIMEAppointment(ExchangeService service)
{
    Appointment appointment = new Appointment(service);
    string iCalFileName = @"C:\import\appointment.ics";
    using (FileStream fs = new FileStream(iCalFileName, FileMode.Open, FileAccess.Read))
    {
        byte[] bytes = new byte[fs.Length];
        int numBytesToRead = (int)fs.Length;
        int numBytesRead = 0;
        while (numBytesToRead > 0)
        {
            int n = fs.Read(bytes, numBytesRead, numBytesToRead);
            if (n == 0)
                break;
            numBytesRead += n;
            numBytesToRead -= n;
        }
        // Set the contents of the .ics file to the MimeContent property.
        appointment.MimeContent = new MimeContent("UTF-8", bytes);
    }
    // This results in a CreateItem call to EWS. 
    appointment.Save(WellKnownFolderName.Calendar);
}

Uso de EWS para importar un elemento mediante la secuencia MIME

Puede usar la operación EWS CreateItem para importar elementos EML e iCal mediante su secuencia MIME.

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"
               xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013_SP1" />
    <t:MailboxCulture>en-US</t:MailboxCulture>
  </soap:Header>
  <soap:Body >
    <m:CreateItem>
      <m:SavedItemFolderId>
        <t:DistinguishedFolderId Id="inbox"/>
      </m:SavedItemFolderId> 
        <m:Items>
        <t:Message>
          <t:MimeContent CharacterSet="UTF-8">
            <!-- Insert MIME content here-->
          </t:MimeContent>
        </t:Message>
      </m:Items>
    </m:CreateItem>
  </soap:Body>
</soap:Envelope>

Pasos siguientes

Después de importar elementos en un buzón de correo, es posible que desee crear una carpeta personalizada para almacenar los elementos importados o sincronizar los elementos de cliente y buzón.

Recursos adicionales