Pregunta

Soy nuevo en el uso EWS (servicio web de Exchange) y estoy buscando un ejemplo simple que muestra cómo enviar un correo electrónico con un archivo adjunto. He buscado un ejemplo y no puedo encontrar ninguna que son simples y claras. He encontrado ejemplos acerca de cómo enviar un correo electrónico, pero no el envío de un correo electrónico con un archivo adjunto.

¿Alguien tiene un enlace a un ejemplo que recomendaría? Publicar un ejemplo aquí funcionaría igual de bien!

¿Fue útil?

Solución

Bueno, finalmente cuenta de esto. Aquí es un método que se va a crear un mensaje de correo, guardarlo como borrador, añadir el archivo adjunto y luego enviar el correo electrónico. Esperamos que esto ayude a alguien por ahí que no fue capaz de encontrar un buen ejemplo como yo.

En mi ejemplo, voy a enviar solamente los archivos de Excel por lo que el tipo de contenido se establece como son. Esto puede, obviamente, ser modificado para soportar cualquier tipo de archivo adjunto.

Para su referencia, la variable ESB es una variable de nivel de clase de tipo ExchangeServiceBinding.

Editar

También debe tener en cuenta que en este ejemplo, no estoy comprobando los tipos de respuesta de las acciones de intercambio para el éxito o el fracaso. Esto sin duda se debe comprobar si es que quiere saber si o no las llamadas a EWS efectivamente trabajadas.

public void SendEmail(string from, string to, string subject, string body, byte[] attachmentAsBytes, string attachmentName)
        {
            //Create an email message and initialize it with the from address, to address, subject and the body of the email.
            MessageType email = new MessageType();

            email.ToRecipients = new EmailAddressType[1];
            email.ToRecipients[0] = new EmailAddressType();
            email.ToRecipients[0].EmailAddress = to;

            email.From = new SingleRecipientType();
            email.From.Item = new EmailAddressType();
            email.From.Item.EmailAddress = from;

            email.Subject = subject;

            email.Body = new BodyType();
            email.Body.BodyType1 = BodyTypeType.Text;
            email.Body.Value = body;

            //Save the created email to the drafts folder so that we can attach a file to it.
            CreateItemType emailToSave = new CreateItemType();
            emailToSave.Items = new NonEmptyArrayOfAllItemsType();
            emailToSave.Items.Items = new ItemType[1];
            emailToSave.Items.Items[0] = email;
            emailToSave.MessageDisposition = MessageDispositionType.SaveOnly;
            emailToSave.MessageDispositionSpecified = true;

            CreateItemResponseType response = esb.CreateItem(emailToSave);
            ResponseMessageType[] rmta = response.ResponseMessages.Items;
            ItemInfoResponseMessageType emailResponseMessage = (ItemInfoResponseMessageType)rmta[0];

            //Create the file attachment.
            FileAttachmentType fileAttachment = new FileAttachmentType();
            fileAttachment.Content = attachmentAsBytes;
            fileAttachment.Name = attachmentName;
            fileAttachment.ContentType = "application/ms-excel";

            CreateAttachmentType attachmentRequest = new CreateAttachmentType();
            attachmentRequest.Attachments = new AttachmentType[1];
            attachmentRequest.Attachments[0] = fileAttachment;
            attachmentRequest.ParentItemId = emailResponseMessage.Items.Items[0].ItemId;

            //Attach the file to the message.
            CreateAttachmentResponseType attachmentResponse = (CreateAttachmentResponseType)esb.CreateAttachment(attachmentRequest);
            AttachmentInfoResponseMessageType attachmentResponseMessage = (AttachmentInfoResponseMessageType)attachmentResponse.ResponseMessages.Items[0];

            //Create a new item id type using the change key and item id of the email message so that we know what email to send.
            ItemIdType attachmentItemId = new ItemIdType();
            attachmentItemId.ChangeKey = attachmentResponseMessage.Attachments[0].AttachmentId.RootItemChangeKey;
            attachmentItemId.Id = attachmentResponseMessage.Attachments[0].AttachmentId.RootItemId;

            //Send the email.
            SendItemType si = new SendItemType();
            si.ItemIds = new BaseItemIdType[1];
            si.SavedItemFolderId = new TargetFolderIdType();
            si.ItemIds[0] = attachmentItemId;
            DistinguishedFolderIdType siSentItemsFolder = new DistinguishedFolderIdType();
            siSentItemsFolder.Id = DistinguishedFolderIdNameType.sentitems;
            si.SavedItemFolderId.Item = siSentItemsFolder;
            si.SaveItemToFolder = true;

            SendItemResponseType siSendItemResponse = esb.SendItem(si);
        }

Otros consejos

Sé que esta pregunta es muy antiguo, pero aterrizó aquí después de buscar Google. Aquí es una respuesta de trabajo simplificado actualizado con el uso de declaraciones.

Es necesario añadir los paquetes Microsoft.Exchange.WebServices NuGet a su proyecto (versión actual es la 2.2.0).

using Microsoft.Exchange.WebServices.Data;

namespace Exchange
{
    public static class Emailer
    {
        public static void SendEmail(string from, string to, string subject, string body, byte[] attachmentBytes, string attachmentName)
        {
            var service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
            service.AutodiscoverUrl(from);
            var message = new EmailMessage(service)
            {
                Subject = subject,
                Body = body,
            };
            message.ToRecipients.Add(to);
            message.Attachments.AddFileAttachment(attachmentName, attachmentBytes);
            message.SendAndSaveCopy();
        }
    }
}

La llamada a service.AutodiscoverUrl puede tomar muchos segundos - si conoce la URL a continuación, puede evitar llamar AutodiscoverUrl y configurarlo directamente. (Puede recuperarse una vez llamando AutodiscoverUrl luego imprimir service.Url.)

// service.AutodiscoverUrl(from); // This can be slow
service.Url = new System.Uri("https://outlook.domain.com/ews/exchange.asmx");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top