2017-03-17 25 views
0

以前は電子メール通知のテストにOpenPopを使用していました。 IMAPに切り替わり、今日MailKitを見始めました。私は現在、Gmailからの電子メール本文のプレーンストリングテキストを取得する際に問題が発生しています。TextBodyで電子メールの本文を取得できません

これまでの私のコードの抜粋:

using (var client = new ImapClient()) 
{ 
    var credentials = new NetworkCredential("username", "password"); 
    var uri = new Uri("imaps://imap.gmail.com"); 

    client.Connect(uri); 
    client.AuthenticationMechanisms.Remove("XOAUTH2"); 
    client.Authenticate(credentials); 
    client.Inbox.Open(FolderAccess.ReadOnly); 

    var inboxMessages = client.Inbox.Fetch(0, -1, MessageSummaryItems.Full).ToList(); 

    foreach (var message in inboxMessages) 
    { 
     var messageBody = message.TextBody.ToString(); 
     ... 
    } 

    ... 
} 

私はこれまでのところ、それが存在する場合TextBodyは、プレーンテキストでメッセージの本文を取得することができますドキュメントの理解何から。しかし、Visual Studioでデバッグしている間は、これがTextBodyの値であることがわかります。

{( "TEXT" "普通"( "CHARSET" "UTF-8" "FORMAT" が "流入")NIL NIL "7BIT" 6363 NIL NIL NIL NIL 119)}

ステップIありどこかで行方不明ですか?これはMailKitの視点から体が見当たらないことを意味しますか?私は同様にHtmlBodyの値を参照してください。

答えて

1

Fetchメソッドは、メッセージについてのの要約の要約情報(メールクライアントにメッセージリストを構築するのに必要な情報)を取り出します。

メッセージを取得する場合は、GetMessageメソッドを使用する必要があります。あなたはのみメッセージ本体をダウンロードしたい場合は

using (var client = new ImapClient()) { 
    client.Connect ("imap.gmail.com", 993, true); 
    client.AuthenticationMechanisms.Remove ("XOAUTH2"); 
    client.Authenticate ("username", "password"); 

    client.Inbox.Open (FolderAccess.ReadOnly); 

    var uids = client.Inbox.Search (SearchQuery.All); 

    foreach (var uid in uids) { 
     var message = client.Inbox.GetMessage (uid); 
     var text = message.TextBody; 

     Console.WriteLine ("This is the text/plain content:"); 
     Console.WriteLine ("{0}", text); 
    } 

    client.Disconnect (true); 
} 

さて、あなたは使用にあなたがフェッチされた要約情報を必要とし、引数としてそれを渡すと思います。このよう

このようなGetBodyPart方法に:

using (var client = new ImapClient()) { 
    client.Connect ("imap.gmail.com", 993, true); 
    client.AuthenticationMechanisms.Remove ("XOAUTH2"); 
    client.Authenticate ("username", "password"); 

    client.Inbox.Open (FolderAccess.ReadOnly); 

    // Note: the Full and All enum values don't mean what you think 
    // they mean, they are aliases that match the IMAP aliases. 
    // You should also note that Body and BodyStructure have 
    // subtle differences and that you almost always want 
    // BodyStructure and not Body. 
    var items = client.Inbox.Fetch (0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure); 

    foreach (var item in items) { 
     if (item.TextBody != null) { 
      var mime = (TextPart) client.Inbox.GetBodyPart (item.UniqueId, item.TextBody); 
      var text = mime.Text; 

      Console.WriteLine ("This is the text/plain content:"); 
      Console.WriteLine ("{0}", text); 
     } 
    } 

    client.Disconnect (true); 
} 

あなたは、メタデータfのIMAPサーバ上のSQLクエリを実行するようFetch方法を考えることができますまたはあなたのメッセージとMessageSummaryItemsのenum引数をビットフィールドとして使用します。Fetchクエリによって入力されるIMessageSummaryプロパティを指定するには、列挙型の値をビット単位でOR演算することができます。上記の例では

UniqueIdBodyビットフラグは、私たちがIMessageSummary結果のUniqueIdBodyプロパティを移入することを指定します。

読み取り/未読ステータスなどの情報を取得する場合は、MessageSummaryItems.Flagsをリストに追加します。

注:両方BodyBodyStructure enum値はIMessageSummary.Bodyプロパティを移入が、BodyStructureは、本体部分が取り付けであるかどうかを決定するために必要とされるより多くの情報、等を含む

関連する問題