0

我的 SMTP 服务器在发送大量电子邮件时出现了 100 多个错误。现在有很多 .BAD 文件,每个文件都包含一条错误消息,中间的某个地方是它应该发送到的实际电子邮件地址。

从每个文件中“仅”提取“电子邮件地址”的最简单方法是什么,以便我可以获得实际失败电子邮件的列表?

我可以用 C# 编写代码,任何建议都会受到欢迎。

错误的示例文本:

From: postmaster@my.server.com
To: me@me.com
Date: Tue, 25 Sep 2012 12:12:09 -0700
MIME-Version: 1.0
Content-Type: multipart/report; report-type=delivery-status;
    boundary="9B095B5ADSN=_01CD9B35032DF58000000066my.server.co"
X-DSNContext: 7ce717b1 - 1386 - 00000002 - C00402D1
Message-ID: <FRaqbC8wS00000068@my.server.com>
Subject: Delivery Status Notification (Failure)

This is a MIME-formatted message.  
Portions of this message may be unreadable without a MIME-capable mail program.

--9B095B5ADSN=_01CD9B35032DF58000000066my.server.co
Content-Type: text/plain; charset=unicode-1-1-utf-7

This is an automatically generated Delivery Status Notification.

Unable to deliver message to the following recipients, due to being unable to connect successfully to the destination mail server.

       email@stackoverflow.com




--9B095B5ADSN=_01CD9B35032DF58000000066my.server.com
Content-Type: message/delivery-status

Reporting-MTA: dns;my.server.com
Received-From-MTA: dns;Social
Arrival-Date: Tue, 25 Sep 2012 11:45:15 -0700

Final-Recipient: rfc822;email@stackoverflow.com
Action: failed
Status: 4.4.7

--9B095B5ADSN=_01CD9B35032DF58000000066my.server.com
Content-Type: message/rfc822

Received: from Social ([127.0.0.1]) by my.server.com with Microsoft SMTPSVC(7.5.7601.17514);
     Tue, 25 Sep 2012 11:45:15 -0700

主要是我想email@stackoverflow.com在中间找到电子邮件。

4

2 回答 2

4

你不需要 C# 来完成这个任务,这可以用Grep更简单地解决。通过编写新的 C# 程序,您正在为 40 年前解决的问题创建新的解决方案 :)

Grep 是专门为解决此类问题而设计的命令行工具。它搜索与glob(例如)匹配的文件列表*.bad并找到正则表达式匹配项。然后,您可以让它将所有这些匹配项导出到一个文本文件中。

这个正则表达式应该足以匹配您的电子邮件地址:

(?<=^Final-Recipient: rfc822;)(.*)$

grep 命令将是这样的:

grep "(?<=^Final-Recipient: rfc822;)(.*)$" *.bad >> emails.txt

这会将所有匹配的电子邮件地址放在一个名为emails.txt.

您可以在此处获得 Windows 版本的 Grep > ,或者 Windows 有一个内置的 grep 替代品,称为findstr,它也可能符合您的需求。

编辑:如果你决定走这条路,你可能想在ServerFaultgrep上再次问这个问题。与 StackOverflow 上的开发人员相比,那里的系统管理员在这类事情上拥有更多的专业知识:)

于 2012-09-26T09:28:09.153 回答
0

我有一个解决方案....首先您必须找到 (To:) 的索引,然后使用如下所示的正则表达式

      start = emailbody.IndexOf("To:");

                        if (start < 0)
                            start = 0;


     string emailExpression = @"([a-zA-Z0-9_\.]+)@([a-zA-Z0-9_\.]+)\.([a-zA-Z]{2,3})";
      System.Text.RegularExpressions.Regex regExp = new System.Text.RegularExpressions.Regex(emailExpression);

                        if (regExp.IsMatch(eamilbody, start))

               {
                     System.Text.RegularExpressions.Match match = regExp.Match(emailbody, start);
                            string email = match.Value;

                 }
于 2012-09-26T08:21:41.460 回答