2017-04-10 154 views
1

私は他の例をオンラインで見ましたが、MimeMessageオブジェクトからすべての添付ファイルをダウンロードして保存する方法がわかりません。 私はWriteTo()を調べましたが、動作させることができませんでした。 添付ファイルが元のファイル名に従って保存されるかどうか、電子メールの中に入力するかどうかも疑問です。ここ は、私がこれまで持っているものです。MailKit: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

ファイル名にはいくつかのサニタイズを行う必要があります。ダストを確認し、不正な文字を削除する... – Max

答えて

2

これは全てにFAQに説明されている「どのように私は、添付ファイルを保存しますか?」セクション。認証後client.IsConnectedかどうかを確認する必要はありません

  1. 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); 
           } 
          } 
         } 
        } 
    } 
    

    いくつかの注意事項:

    は、ここでは、あなたの質問に投稿されたコードの修正バージョンです。接続されていなければ、Authenticate()メソッドで例外がスローされていました。成功しなかった場合は、Connect()メソッドでも例外がスローされていました。文字通りConnect()を2行アップすると、IsConnectedの状態を確認する必要はありません。

  2. inboxFolder.Unreadはどこにいらっしゃるのですか?未読メッセージをダウンロードするだけの場合は、検索結果をSearchQuery.NotSeenに変更します。これにより、読み取られていないメッセージUIDのみが表示されます。
  3. あなたがそれを必要としないのであなたのIMailFolder inboxFolder = client.GetFolder(Constant.InboxFolder);ロジックを削除しました。 client.Inboxを使用して検索を実行する場合は、別のフォルダオブジェクトを使用して結果を反復処理しないでください。
関連する問題