使用 mimekit/mailkit 库获取无法送达的电子邮件地址
get the undeliverable email address with mimekit/mailkit library
我开始使用 @jstedfast Mimekit/Mailkit library,顺便说一句,它很棒,可以使用其主题行搜索无法交付的内容。我尝试使用 message.to、message.resentto.
我如何获得该信息。我今天第一次尝试。我能够获得列表和正文,但我只需要电子邮件。我尝试使用 s22.imap 但不再支持,然后我发现了这一点。我知道你在这里很活跃 @jstedfast 我需要你的帮助..你的 github.
中没有讨论标签
提前致谢
如果您查看原始消息源,Content-Type
header 的值是否与 multipart/report; report-type=delivery-status
类似的内容匹配?如果是这样,则此消息很可能会有一个 sub-part 和一个 Content-Type
header,值为 message/delivery-status
。 应该是multipart/report
的第二child部分(第一部分应该是human-readable解释)。
如果是这样,您可以将 message/delivery-status
MimeEntity
转换为 MessageDeliveryStatus
的实例。您会注意到 MessageDeliveryStatus
class 有一个名为 StatusGroups
的 属性,它是 header 的多个 collections 的列表(例如HeaderList
objects).
列表
每个 HeaderList
都包含有关失败的特定收件人的信息。我认为您想要做的是查看 Final-Recipient
header ,其中将包含 2 条信息:
- address-type(通常应该是
"rfc822"
)
- 收件人的邮箱(这就是你想要的)
不幸的是,MimeKit 没有任何工具来解析 Final-Recipient
header,但是在 header 中定位 address-type
参数的末尾应该是微不足道的] 值通过使用 IndexOf (';')
然后你可以使用类似 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://www.rfc-editor.org/rfc/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 吗?我无法测试它。我用不存在域的电子邮件进行了测试,邮箱不存在......使用 live.com、randomdomain.com、yahoo.com 和 gmail。另一方面,gmail 没有 return 任何无法投递的邮件。
我开始使用 @jstedfast Mimekit/Mailkit library,顺便说一句,它很棒,可以使用其主题行搜索无法交付的内容。我尝试使用 message.to、message.resentto.
我如何获得该信息。我今天第一次尝试。我能够获得列表和正文,但我只需要电子邮件。我尝试使用 s22.imap 但不再支持,然后我发现了这一点。我知道你在这里很活跃 @jstedfast 我需要你的帮助..你的 github.
中没有讨论标签提前致谢
如果您查看原始消息源,Content-Type
header 的值是否与 multipart/report; report-type=delivery-status
类似的内容匹配?如果是这样,则此消息很可能会有一个 sub-part 和一个 Content-Type
header,值为 message/delivery-status
。 应该是multipart/report
的第二child部分(第一部分应该是human-readable解释)。
如果是这样,您可以将 message/delivery-status
MimeEntity
转换为 MessageDeliveryStatus
的实例。您会注意到 MessageDeliveryStatus
class 有一个名为 StatusGroups
的 属性,它是 header 的多个 collections 的列表(例如HeaderList
objects).
每个 HeaderList
都包含有关失败的特定收件人的信息。我认为您想要做的是查看 Final-Recipient
header ,其中将包含 2 条信息:
- address-type(通常应该是
"rfc822"
) - 收件人的邮箱(这就是你想要的)
不幸的是,MimeKit 没有任何工具来解析 Final-Recipient
header,但是在 header 中定位 address-type
参数的末尾应该是微不足道的] 值通过使用 IndexOf (';')
然后你可以使用类似 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://www.rfc-editor.org/rfc/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 吗?我无法测试它。我用不存在域的电子邮件进行了测试,邮箱不存在......使用 live.com、randomdomain.com、yahoo.com 和 gmail。另一方面,gmail 没有 return 任何无法投递的邮件。