簡體   English   中英

使用mimekit / mailkit庫獲取無法傳遞的電子郵件地址

[英]get the undeliverable email address with mimekit/mailkit library

我開始使用@jstedfast Mimekit / Mailkit庫 ,這很不錯,它可以使用其主題行來搜索無法交付的內容。 我嘗試使用message.to,message.resentto。

我如何獲得該信息。 我今天的第一次嘗試。 我可以獲取列表和正文,但是我只需要電子郵件。 我嘗試使用s22.imap,但現在不再支持,因此發現了這一點。 我知道您在這里很活躍@jstedfast我需要您的幫助。..您的github中沒有討論選項卡。

提前致謝

如果您查看原始消息源,那么Content-Type標頭的值是否與multipart/report; report-type=delivery-status multipart/report; report-type=delivery-status 如果是這樣,則此消息很有可能會包含一個帶有Content-Type頭的子部分,該頭的值是message/delivery-status 應該multipart/report的第二個子部分(第一部分應該是易於理解的解釋)。

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

每個HeaderList包含有關失敗的特定收件人的信息。 我認為您想要做的是查看Final-Recipient標頭,其中包含2條信息:

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

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

因此,在代碼中的外觀可能是這樣的:

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

希望能有所幫助。

這就是我所做的

 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
            //}

        }

讓我知道是否可能有問題。如果收件人收件箱已滿,我會收到rfc822嗎? 我無法測試。.我測試了域不存在的電子郵件,郵箱不存在.. with live.com,randomdomain.com,yahoo.com和gmail。 gmail則不會返回任何無法交付的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM