用c#处理电子邮件失败

本文关键字:失败 电子邮件 处理 | 更新日期: 2023-09-27 18:18:34

我希望有c#连接到一个电子邮件帐户和处理未交付的邮件或失败。我希望将失败的地址或原始电子邮件写入文本文件。

我肯定我能想出如何识别失败的消息。示例:其中主题包含'failure', 'returned'等

我不知道如何从电子邮件中收集失败的地址。

我曾经为一个客户使用一个叫做popmonger的程序,但是现在它正在收集错误的电子邮件地址。它正在收集mailer-daemon@gateway03.websitewelcome.com作为一个例子,而不是原始或失败的电子邮件。我想如果我写一个c#服务可能会更容易。

我正在连接的电子邮件帐户是在hostgator。有人知道从哪里开始吗?

谢谢,杰克

用c#处理电子邮件失败

由于正在使用的邮件客户端叫做popmonger,听起来您将处理POP3协议,尽管。net提供了一种通过SMTP轻松发送电子邮件的方法,但它在检查电子邮件时并没有真正做到同样的公正。

你将不得不使用第三方DLL,有一个POP3客户端检索电子邮件。最重要的是,您需要检查其中一个失败电子邮件通知,以了解您的应用程序将期望什么。邮件的主题、正文、发件人地址等都应该有共同之处,以提示哪些邮件是失败通知。然后,您需要查看电子邮件正文中指定了需要检索以写入文本文件的错误信息的位置。基本上你的步骤应该是这样的:

  • 检查和检索电子邮件消息
  • 将每个失败的电子邮件对象添加到集合中(List<T>工作正常)
  • 读取/解析每封邮件以提取所需信息
  • 将提取的数据写入文件
  • 只要一切顺利,没有异常,就用POP客户端对象从POP服务器中删除电子邮件(这样您就不会每次都读取相同的故障通知,并且用冗余数据填充文本文件)

我从这篇代码项目文章中使用了一个POP3类,它确实包含了附件的代码,但我从来没有将它用于附件,因为它有一点bug。在阅读电子邮件正文方面,我还没有失败过(敲敲木头)。

一旦你有了失败通知,你就可以用一个简单的正则表达式模式按照你规定的格式提取失败的地址并匹配它。假设已经从服务器检索到正文文本,并将其存储在名为bodyText

的字符串中
using System.Text.RegularExpressions;
// ...
string failedAddressPattern = @"The mail system <(?<address>.+)>";
string capturedAddress = null;
Match match = Regex.Match(bodyText, failedAddressPattern, RegexOptions.IgnoreCase);
if(match.Groups["address"].Success)
{
    capturedAddress = match.Groups["address"].Value.Trim();
}
if(capturedAddress == null)
{
    // do some form of debug logging here because the pattern no longer works, etc.
}

除了文本扫描,还有一个标准,它被称为DSN(交付状态通知,在RFC 3464中定义)。您可以通过内容类型头"multipart/report;报表类型=投递状态"。你可以检查http://www.lumisoft.ee/lsWWW/download/downloads/Examples/-它有所有你需要的POP3/IMAP客户端与示例。它也有你需要的MIME消息解析器,它也有DSN消息支持。提供了完整的源代码,因此入门应该很容易。