Веб-службы Exchange - отправьте электронное письмо с вложением - PullRequest
8 голосов
/ 29 сентября 2010

Я новичок в использовании EWS (веб-служба Exchange), и я ищу простой пример, демонстрирующий, как отправить электронное письмо с вложением. Я искал пример, и я не могу найти простой и понятный. Я нашел примеры того, как отправить электронное письмо, но не отправлять электронное письмо с вложением.

У кого-нибудь есть ссылка на пример, который они бы порекомендовали? Размещение примера здесь также сработало бы!

Ответы [ 2 ]

9 голосов
/ 04 октября 2010

Ну, я в конце концов понял это. Вот метод, который создаст почтовое сообщение, сохранит его как черновик, добавит вложение и затем отправит электронное письмо. Надеюсь, что это поможет кому-то, кто не смог найти хороший пример, как я.

В моем примере я буду отправлять только файлы Excel, поэтому тип контента установлен так, как он есть. Очевидно, что это можно изменить для поддержки любого типа вложенного файла.

Для справки, переменная esb является переменной уровня класса типа ExchangeServiceBinding.

Редактировать

Я также должен отметить, что в этом примере я не проверяю типы ответов от действий обмена для успеха или неудачи. Это обязательно нужно проверить, если вы хотите знать, действительно ли ваши звонки в EWS работали.

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);
        }
3 голосов
/ 17 октября 2016

Я знаю, что этот вопрос очень старый, но я попал сюда после поиска в Google.Вот обновленный упрощенный рабочий ответ с использованием операторов.

Вам необходимо добавить пакет nuget Microsoft.Exchange.WebServices в ваш проект (текущая версия 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();
        }
    }
}

Вызов service.AutodiscoverUrl может занять много секунд - если вы знаете URL-адрес, тогда вы можете избежать вызова AutodiscoverUrl и установить его напрямую.(Вы можете восстановить его один раз, вызвав AutodiscoverUrl, а затем распечатав service.Url.)

// service.AutodiscoverUrl(from); // This can be slow
service.Url = new System.Uri("https://outlook.domain.com/ews/exchange.asmx");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...