使用C#处理电子邮件失败

时间:2011-12-22 19:30:08

标签: c# email

我希望让C#连接到电子邮件帐户并处理未送达的邮件或失败。我希望将失败的地址或原始电子邮件写入文本文件。

我确信我可以弄清楚如何识别失败的消息。示例:WHERE subject CONTAINS'失败','返回'等等

我不知道怎么做是从电子邮件中收集失败的地址。

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

我要连接的电子邮件帐户位于hostgator。有谁知道从哪里开始呢?

谢谢,

杰克

2 个答案:

答案 0 :(得分:2)

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

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

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

我使用了来自this codeproject文章的POP3类,它确实包含了附件的代码,但我从来没有将它用于附件,因为它们对它们有点麻烦。为了阅读电子邮件正文,它还没有让我失望(敲木头)。

一旦您收到失败通知,您可以使用简单的正则表达式模式按照规定的格式提取失败的地址并进行匹配。假设已从服务器检索正文文本,并将其存储在名为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.
}

答案 1 :(得分:1)

除文本扫描外,还有标准,它称为DSN(传递状态通知,在RFC 3464中定义)。您可以通过内容类型标题“multipart / report; report-type = delivery-status”来取消此类邮件。您可以查看http://www.lumisoft.ee/lsWWW/download/downloads/Examples/ - 它包含您需要的所有POP3 / IMAP客户端以及示例。它还具有您需要的MIME消息解析器,它还具有DSN消息支持。提供完整的soruce代码,因此入门应该很容易。