我的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
电子邮件。
答案 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;
}