2010-09-29 7 views
8

Je suis nouveau à l'utilisation de EWS (service Web Exchange) et je cherche un exemple simple qui montre comment envoyer un email avec une pièce jointe. J'ai cherché un exemple et je n'en trouve aucun qui soit simple et précis. J'ai trouvé des exemples sur la façon d'envoyer un e-mail sans envoyer d'e-mail avec une pièce jointe.Exchange Web Services - Envoyer un e-mail avec pièce jointe

Est-ce que quelqu'un a un lien vers un exemple qu'ils recommanderaient? Publier un exemple ici fonctionnerait tout aussi bien!

+0

Utilisez-vous l'API Managed ou tout simplement EWS? Les bits varient légèrement mais sont encore assez faciles. Suivez le didacticiel que vous avez trouvé pour créer une instance de messagerie, puis, dans l'API Managed, tout ce que vous avez à faire est: email.Attachments.Add (fileName); – Chris

+0

J'utilise juste EWS. J'ai trouvé un exemple qui crée un FileAttachmentType puis crée un CreateAttachmentType à partir de cette pièce jointe. Il appelle ensuite ews.CreateAttachment en utilisant le CreateAttachmentType. Est-ce ce que je devrais faire? J'espérais que ce serait un peu plus intuitif, comme votre réponse le suggère, mais je trouve que l'attachement d'un fichier à un email est un peu plus "flou" que ce à quoi je m'attendais. – Anthony

Répondre

9

Eh bien, j'ai finalement compris cela. Voici une méthode qui créera un message, le stockera comme brouillon, ajoutera la pièce jointe et enverra l'email. J'espère que cela aide quelqu'un qui n'était pas capable de trouver un bon exemple comme moi.

Dans mon exemple, je vais seulement envoyer des fichiers Excel, c'est pourquoi le type de contenu est défini comme il est. Cela peut évidemment être modifié pour prendre en charge tout type de pièce jointe. Pour référence, la variable esb est une variable de niveau classe de type ExchangeServiceBinding.

Modifier

Je tiens également à noter que dans cet exemple, je ne suis pas vérifier les types de réponse des actions de change pour le succès ou l'échec. Cela devrait certainement être vérifié si vous voulez savoir si vos appels à EWS ont effectivement fonctionné.

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); 
     } 
+0

pouvez-vous nous montrer vos importations s'il vous plaît ?? –

3

Je sais que cette question est très ancienne, mais j'ai atterri ici après une recherche sur google. Voici une réponse de travail simplifiée mise à jour avec l'utilisation des instructions.

Vous devez ajouter le package nuget Microsoft.Exchange.WebServices à votre projet (la version actuelle est 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(); 
     } 
    } 
} 

L'appel à service.AutodiscoverUrl peut prendre plusieurs secondes - si vous connaissez l'URL, vous pouvez éviter d'appeler AutodiscoverUrl et régler directement. (Vous pouvez le récupérer une fois en appelant AutodiscoverUrl alors l'impression service.Url.)

// service.AutodiscoverUrl(from); // This can be slow 
service.Url = new System.Uri("https://outlook.domain.com/ews/exchange.asmx"); 
Questions connexes