从100个文本文件中提取电子邮件地址

时间:2012-09-26 08:01:44

标签: c# full-text-search

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

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

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

BAD示例文本:

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电子邮件。

2 个答案:

答案 0 :(得分:4)

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

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

This regular expression应足以匹配您的电子邮件地址:

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

grep命令是这样的:

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

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

您可以获得Grep&gt; here&lt;的Windows版本,或者Windows有一个内置的grep替代名为findstr,也可能符合您的需求。

编辑:如果您决定沿grep路线前进,可能需要在ServerFault上再次提出此问题。与StackOverflow上的开发人员相比,SysAdmins在这方面有更多的专业知识:)

答案 1 :(得分: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;

                 }