如果你看一下原始消息源,做的Content-Type
頭匹配的東西沿着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條信息的內容:
- 的地址類型(通常應該
"rfc822"
)
- 收件人的郵箱(這是你想)
不幸的是,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
希望有所幫助。
你能詳細說明你想要做什麼嗎?您嘗試發送的消息是否失敗,現在您正試圖獲取哪個電子郵件地址導致SMTP服務器失敗?要麼? – jstedfast
@jstedfast這是場景。我會發送大量的電子郵件,然後當無法投遞時,應用程序應該檢查哪些電子郵件無法傳送。我能夠使用主題搜索來獲取這些電子郵件。我如何獲得這些電子郵件的電子郵件地址?謝謝你,先生 – CyberNinja
看起來像是唯一的方式來獲得這是在體內搜索。你的圖書館有沒有捷徑?喜歡按主題搜索?只是想知道..謝謝 – CyberNinja