轻松从 .EML 文件中提取电子邮件信息 -- 修改版
C# 类,用于将 EML 文件上传到 System.Net.Mail.MailMessage
引言
本文演示了如何将 EML 文件上传到 Microsoft .NET MailMessage
。 这取代了我之前撰写的 其他作品。 我在使用其他方法时,遇到了无法正确解码消息 HTML 主体的问题,并寻找替代方案,这时我发现了 Peter Huber 的文章 "POP3 电子邮件客户端 (.NET 2.0)"。 我发现通过少量修改,他的 RxMailMessage
和 Pop3MimeClient
类也可以读取 EML 文件。 我联系了他,并告知我将修改他的一些代码并更新我的文章,他对此表示同意。 Pop3MimeClient
也被重命名为 MimeReader
,因为它的用途不一定与 Pop3 有关。
背景
我的意图是创建一个 SMTP 服务,我可以向其发送消息,该服务将处理这些消息。 收件人电子邮件名称是一个标识符,但很难预测它可能是什么。 主机名是服务器。 发送到 id@server.com 将在 SMTP 服务的 Drop 区域中创建一个 EML 文件(对于 Microsoft SMTP,通常是 c:\inetpub\mailroot\drop)。 然后我可以提取所有邮件收件人(收件人、抄送和密送),并根据需要处理消息正文。 为了使用 Pop3,我必须登录到每个 Pop3 帐户或使用 Pop3 泛收帐户。 我愿意走这条路,直到我发现微软将在 Windows Server 2003 之后从所有 Microsoft Server 平台中删除 Pop3 服务器。 如果我可以找到直接读取 EML 文件的方法,使用 Pop3 似乎有点荒谬。 然后我找到了 Peter 的文章。
Using the Code
让我们保持简单。 我相信你们都知道如何从目录中获取文件路径,所以我不会展示它。 只需要创建一个 MimeReader
并使用它来获取 RxMailMessage
对象,只需指定 EML 路径即可。
MimeReader mime = new MimeReader(); // this class processes the .EML mime content
// this get's the MailMessage into Peter's RxMailMessage class
// which is derived from the MS MailMessage class
RxMailMessage mm = mime.GetEmail(sEmlPath);
在某些情况下,我不得不查看 MailMessage AlternateViews
才能找到消息正文
private string GetPlainText(RxMailMessage mm)
{
// check for plain text in body
if (!mm.IsBodyHtml && !string.IsNullOrEmpty(mm.Body))
return mm.Body;
string sText = string.Empty;
foreach (AlternateView av in mm.AlternateViews)
{
// check for plain text
if (string.Compare(av.ContentType.MediaType, "text/plain", true) == 0)
continue;// return StreamToString(av.ContentStream);
// check for HTML text
if (string.Compare(av.ContentType.MediaType, "text/html", true) == 0)
sText = StreamToString(av.ContentStream);
}
// HTML is our only hope
if (sText == string.Empty && mm.IsBodyHtml && !string.IsNullOrEmpty(mm.Body))
sText = mm.Body;
if (sText == string.Empty)
return string.Empty;
// need to convert the HTML to plaintext
return PgUtil.StripHTML(sText);
}
private static string StreamToString(Stream stream)
{
string sText = string.Empty;
using (StreamReader sr = new StreamReader(stream))
{
sText = sr.ReadToEnd();
stream.Seek(0, SeekOrigin.Begin); // leave the stream the way we found it
stream.Close();
}
return sText;
}
关注点
Peter 原始 Pop3MimeClient
(又名 MimeReader
)的某些部分对我来说似乎不起作用,特别是 ProcessHeaderField
中 content-disposition 标头字段的设置和 ConvertToMailAddress
方法。
历史
这取代了我之前撰写的 轻松从 .EML 文件中提取电子邮件信息 文章。