2017-04-10 5 views
1

J'ai regardé d'autres exemples en ligne, mais je n'arrive pas à comprendre comment télécharger et stocker TOUTES les pièces jointes d'un objet MimeMessage. J'ai regardé dans le WriteTo(), mais je ne pouvais pas le faire fonctionner. Vous vous demandez également si les pièces jointes seront enregistrées en fonction du nom de fichier d'origine, et tapez dans l'e-mail. Voici ce que j'ai jusqu'à présent: « Comment puis-je enregistrer des pièces jointes »MailKit: Comment télécharger toutes les pièces jointes en local à partir d'un MimeMessage

using (var client = new ImapClient()) 
{ 
    client.Connect(Constant.GoogleImapHost, Constant.ImapPort, SecureSocketOptions.SslOnConnect); 
    client.AuthenticationMechanisms.Remove(Constant.GoogleOAuth); 
    client.Authenticate(Constant.GoogleUserName, Constant.GenericPassword); 

    if (client.IsConnected == true) 
    { 
     FolderAccess inboxAccess = client.Inbox.Open(FolderAccess.ReadWrite); 
     IMailFolder inboxFolder = client.GetFolder(Constant.InboxFolder); 
     IList<UniqueId> uids = client.Inbox.Search(SearchQuery.All); 

     if (inboxFolder != null & inboxFolder.Unread > 0) 
     { 
      foreach (UniqueId msgId in uids) 
      { 
       MimeMessage message = inboxFolder.GetMessage(msgId); 

       foreach (MimeEntity attachment in message.Attachments) 
       { 
        //need to save all the attachments locally 
       } 
      } 
     } 
    } 
} 
+0

Vous devrez effectuer un nettoyage des noms de fichiers. Vérifiez les dupes, supprimez les mauvais caractères ... – Max

Répondre

2

Tout cela est expliqué dans le FAQ dans les section.

est ici une version fixe du code affiché dans votre question:

using (var client = new ImapClient()) { 
    client.Connect (Constant.GoogleImapHost, Constant.ImapPort, SecureSocketOptions.SslOnConnect); 
    client.AuthenticationMechanisms.Remove (Constant.GoogleOAuth); 
    client.Authenticate (Constant.GoogleUserName, Constant.GenericPassword); 

    client.Inbox.Open (FolderAccess.ReadWrite); 
    IList<UniqueId> uids = client.Inbox.Search (SearchQuery.All); 

    foreach (UniqueId uid in uids) { 
     MimeMessage message = client.Inbox.GetMessage (uid); 

     foreach (MimeEntity attachment in message.Attachments) { 
      var fileName = attachment.ContentDisposition?.FileName ?? attachment.ContentType.Name; 

      using (var stream = File.Create (fileName)) { 
       if (attachment is MessagePart) { 
        var rfc822 = (MessagePart) attachment; 

        rfc822.Message.WriteTo (stream); 
       } else { 
        var part = (MimePart) attachment; 

        part.ContentObject.DecodeTo (stream); 
       } 
      } 
     } 
    } 
} 

Quelques notes:

  1. Il n'y a pas besoin de vérifier si client.IsConnected après l'authentification. Si elle n'était pas connectée, elle aurait généré une exception dans la méthode Authenticate(). Il aurait aussi levé une exception dans la méthode Connect() si elle n'a pas réussi. Il n'est pas nécessaire de vérifier l'état IsConnected si vous appelez simplement Connect() 2 lignes.
  2. Pourquoi vérifiez-vous inboxFolder.Unread si vous ne l'utilisez même pas? Si vous voulez juste télécharger des messages non lus, changez votre recherche pour qu'elle soit SearchQuery.NotSeen, ce qui vous donnera uniquement les UID de message qui n'ont pas été lus. J'ai supprimé votre logique IMailFolder inboxFolder = client.GetFolder(Constant.InboxFolder); parce que vous n'en avez pas besoin. Si vous allez effectuer la RECHERCHE à l'aide de client.Inbox, ne parcourez pas les résultats avec un autre objet de dossier.