[英]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条信息:
"rfc822"
) 不幸的是,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.