2017-02-09 65 views
0

我開始使用@jstedfast Mimekit/Mailkit library,這非常棒,可以使用它的主題行進行搜索以取消無法投遞的郵件。我嘗試使用message.to,message.resentto。使用mimekit/mailkit庫獲取無法投遞的郵件地址

我如何獲得該信息。我今天第一次嘗試。我能夠得到名單和身體,但我只需要電子郵件。我嘗試使用s22.imap,但沒有支持了,然後我發現了這一點。我知道你在這裏很活躍@jstedfast我需要你的幫助..你的github沒有討論標籤。

在此先感謝

+0

你能詳細說明你想要做什麼嗎?您嘗試發送的消息是否失敗,現在您正試圖獲取哪個電子郵件地址導致SMTP服務器失敗?要麼? – jstedfast

+0

@jstedfast這是場景。我會發送大量的電子郵件,然後當無法投遞時,應用程序應該檢查哪些電子郵件無法傳送。我能夠使用主題搜索來獲取這些電子郵件。我如何獲得這些電子郵件的電子郵件地址?謝謝你,先生 – CyberNinja

+0

看起來像是唯一的方式來獲得這是在體內搜索。你的圖書館有沒有捷徑?喜歡按主題搜索?只是想知道..謝謝 – CyberNinja

回答

4

如果你看一下原始消息源,做的Content-Type頭匹配的東西沿着multipart/report; report-type=delivery-status線的價值?如果是這樣,該消息很可能會有一個Content-Type標題的子部分,其值爲message/delivery-status。它應該成爲multipart/report的第二個子部分(第一部分應該是人類可讀的解釋)。

如果是這樣,您可以將message/delivery-statusMimeEntity轉換爲MessageDeliveryStatus的實例。您會注意到MessageDeliveryStatus類具有一個名爲StatusGroups的屬性,該屬性是多個標頭集合的列表(例如HeaderList對象的列表)。

每個HeaderList都包含有關失敗的特定收件人的信息。我想你想要做的就是看Final-Recipient頭將包含2條信息的內容:

  1. 的地址類型(通常應該"rfc822"
  2. 收件人的郵箱(這是你想)

不幸的是,MimeKit沒有任何工具來解析Final-Recipient頭,但它應該是微不足道的使用IndexOf (';')定位在標頭值的address-type參數結束,然後你可以使用類似MailboxAddress.TryParse()來解析它(或者你可能只需要Substring()值w/o解析)。

所以,這看起來可能會在代碼的方式是這樣的:

string[] GetUndeliverableAddresses (MimeMessage message) 
{ 
    var report = message.Body as MultipartReport; 

    if (report == null) 
     throw new ArgumentException ("This is not a multipart/report!"); 

    MessageDeliveryStatus status = null; 

    for (int i = 0; i < report.Count; i++) { 
     status = report[i] as MessageDeliveryStatus; 
     if (status != null) 
      break; 
    } 

    if (status == null) 
     throw new ArgumentException ("Did not contain a message/delivery-status!"); 

    var undeliverables = new List<string>(); 
    for (int i = 0; i < status.StatusGroups.Count; i++) { 
     var recipient = status.StatusGroups[i]["Final-Recipient"]; 
     int semicolon = recipient.IndexOf (';'); 

     var undeliverable = recipient.Substring (semicolon + 1).Trim(); 
     undeliverables.Add (undeliverable); 
    } 

    return undeliverables.ToArray(); 
} 

有關message/delivery-status的更多信息,請參閱https://tools.ietf.org/html/rfc3464

希望有所幫助。

+0

謝謝先生..我結束了..使用bodypart並選擇第二個元素。因爲它有「最終收件人」標籤。 – CyberNinja

0

這是我做過什麼

foreach (var uid in inbox.Search(query)) 
     { 
      var message = inbox.GetMessage(uid); 
      // Console.WriteLine("Subject: {0}", message.Subject); 
      //Console.WriteLine("Subject: {0}", message.Headers); 
      // Console.WriteLine("Subject: {0}", message.BodyParts); 
      var text = message.BodyParts; 
      string src = text.ElementAt(1).ToString(); 
      int srcStart = src.IndexOf("RFC822;",0); << i used final-recipient intially 
      int srcEnd = src.IndexOf("Action", 0); 
      Console.WriteLine("Email:" + src.Substring(srcStart + 8, srcEnd - (srcStart + 8))); 
      Console.WriteLine(src); 


      //foreach (var part in message.BodyParts) 
      //{ 
      // Console.WriteLine(part); 
      // // do something 
      //} 

     } 

讓我知道是否有可能是一個problem..will我得到的RFC822如果收件人的收件箱已滿?我沒有辦法測試..我用不存在域的郵件測試,郵箱不存在..with live.com,randomdomain.com,yahoo.com和gmail。另一方面,gmail不會返回任何無法收集的內容。

+0

我會建議使用更接近我的代碼上面的東西,而不是因爲它會更容易出錯。文本「RFC822;」在某些情況下可能會出現在郵件的其他地方。當傳送失敗時,並非所有SMTP服務器都會向您發送通知。例如,GMail並不是因爲他們打算顛覆垃圾郵件發送者試圖利用該系統通過暴力發現電子郵件地址的意圖。 – jstedfast

+0

感謝您的信息。我將使用final-recipeint然後rfc822 prolly雙重過濾器。即時通訊使用office365.com – CyberNinja

+0

爲什麼不使用MimeKit的MessageDeliveryStatus類?這就是它的目的。在MimeEntity上調用'ToString()'是昂貴且不必要的。 – jstedfast

相關問題