C# 使用mimekit/mailkit库获取无法送达的电子邮件地址

C# 使用mimekit/mailkit库获取无法送达的电子邮件地址,c#,mailkit,C#,Mailkit,我开始使用@jstedfast,顺便说一句,它非常棒,可以使用主题行来搜索无法交付的内容。我尝试使用message.to,message.resento 我如何获得这些信息。我今天第一次尝试。我能得到名单和尸体,但我只需要电子邮件。我尝试过使用s22.imap,但是现在已经没有支持了,然后我发现了这个。我知道你在这里是活跃的@jstedfast我需要你的帮助..你的github中没有讨论选项卡 提前感谢如果您查看原始消息源,Content-Type头的值是否与multipart/report的行

我开始使用@jstedfast,顺便说一句,它非常棒,可以使用主题行来搜索无法交付的内容。我尝试使用message.to,message.resento

我如何获得这些信息。我今天第一次尝试。我能得到名单和尸体,但我只需要电子邮件。我尝试过使用s22.imap,但是现在已经没有支持了,然后我发现了这个。我知道你在这里是活跃的@jstedfast我需要你的帮助..你的github中没有讨论选项卡


提前感谢

如果您查看原始消息源,Content-Type头的值是否与multipart/report的行匹配;报告类型=交付状态?如果是这样,则此消息很可能有一个子部分,其内容类型标头的值为message/delivery status。它应该是多部分/报告的第二个子部分。第一部分应该是可读的解释

如果是这样,您可以将message/delivery status MimeEntity强制转换为MessageDeliveryStatus的实例。您会注意到MessageDeliveryStatus类有一个名为StatusGroups的属性,它是多个标题集合的列表,例如HeaderList对象的列表

每个标题列表都包含失败的特定收件人的信息。我认为您要做的是查看最终收件人标题,其中包含两条信息:

地址类型通常应为rfc822 您想要的收件人的邮箱 不幸的是,MimeKit没有任何工具来解析最终的收件人报头,但是使用IndexOf“;”在报头值中定位address type参数的结尾应该很简单然后,您可以使用MailboxAddress.TryParse之类的东西来解析它,或者您也可以只对值进行子串,而不进行解析

因此,这在代码中可能是这样的:

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 ();
}
有关邮件/传递状态的更多信息,请参阅

希望有帮助。

我就是这么做的

 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不会退回任何无法投递的邮件

你能详细说明你想做什么吗?您尝试发送的邮件是否失败,现在您正在尝试获取导致SMTP服务器失败的电子邮件地址?还是?@jstedfast下面是一个场景。我会发送大量电子邮件,然后当有无法送达的应用程序应该检查哪些电子邮件是无法送达。我可以通过主题搜索来提取这些电子邮件。如何获取这些电子邮件的电子邮件地址?谢谢,先生,看来唯一的办法就是在体内搜索。你的图书馆有捷径吗。?喜欢按主题搜索吗??只是想知道…谢谢你,先生。。最后,我使用bodypart并选择第二个元素。因为它有最终的接收者标签。我建议使用更接近我上面代码的东西,因为这样更不容易出错。文本RFC822;在某些情况下,可能会出现在邮件的其他位置。并非所有SMTP服务器都会在传递失败时向您发送通知。例如,GMail没有这样做,因为他们的意图是颠覆试图利用该系统通过暴力发现电子邮件地址的垃圾邮件发送者。谢谢你提供的信息。首先,我将使用最终接收器,然后是rfc822,对过滤器进行双重过滤。im使用office365.com为什么不使用MimeKit的MessageDeliveryStatus类?这就是它的目的。在Mimeenty上打电话给ToString既昂贵又不必要。我昨天才开始使用你的图书馆。我还没有去探索它。谢谢你的信息。我会考虑的。