我正在创建 eml 并使用此处提到的过程将它们保存到目录中。我想知道如何发送这些 eml 文件?我尝试使用 SMTPClient 类的对象,但它将 MailMessage 对象作为其参数,我找不到使用这些保存的 eml 文件创建 MailMessage 类型对象的方法。
7 回答
正确加载 EML 文件并不像看起来那么容易。您可以在几天内编写一个适用于 95% 情况的实现。剩下的 5% 至少需要几个月的时间;-)。我知道,因为我参与了开发。
考虑以下困难:
- Unicode 电子邮件
- 从右到左的语言
- 更正由流行邮件客户端和服务器中众所周知的错误导致的格式错误的 EML 文件
- 处理 S/MIME(加密和签名的电子邮件)
- 正确处理几种编码附件的方法
- 处理嵌入到 HTML 电子邮件中的内联图像和样式表
- 确保它正确解析来自 Mike Crispin(Mime 和 IMAP RFC 的合著者)的MIME 折磨消息
- 确保格式错误的消息不会导致缓冲区溢出或其他应用程序崩溃
- 处理分层消息(带有附加消息的消息)
- 确保它正确处理非常大的电子邮件
这种解析器的成熟需要数年的时间并为其用户提供持续的反馈。目前 .NET Framework 中还没有这样的解析器。在它改变之前,我建议从一个成熟的供应商那里获得一个第三方 MIME 解析器。
以下代码使用了我们的Rebex Secure Mail 组件,但我确信类似的任务也可以轻松地使用其他供应商的组件进行复制。
该代码基于邮件消息教程。
// create an instance of MailMessage
MailMessage message = new MailMessage();
// load the message from a local disk file
message.Load("c:\\message.eml");
// send message
Smtp.Send(message, "smtp.example.org");
使用EMLReader从 .eml 文件中检索数据。它包含创建MailMessage对象所需的所有数据,例如 From、To、Subject、Body 等等。
FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite);
EMLReader reader = new EMLReader(fs);
fs.Close();
MailMessage message = new System.Net.Mail.MailMessage(reader.From, reader.To, reader.Subject, reader.Body);
如果您是 Microsoft 商店并且无论如何都拥有 Exchange 服务器,那么还有另一种解决方案,它比这里建议的所有其他方法都容易得多:
每个 Exchange 服务器都有一个开箱即用配置的拾取目录。
默认情况下,它是%ExchangeInstallPath%TransportRoles\Pickup
.
您只需将.eml
文件复制到该目录,Exchange 就会自动发送邮件。
阅读此 TechNet 文章了解更多信息:
分拣目录和重播目录
正如其他人所展示的那样,EML 并不是serialize
邮件消息的好方法。以另一种格式保存邮件可能会更好。虽然 .Net 框架中有多个序列化引擎可以序列化任何对象,但您也可以考虑将邮件的组件(如地址、正文、要附加在 base64 中的文件)保存在您自己设计的 Xml 文件中。
下面是一个帮助您入门的示例:
<?xml version="1.0" encoding="utf-8"?>
<mail>
<to display="Thomas Edison" address="tedison@domain.com" />
<body>
Hi Thomas,
How are you doing?
Bye
</body>
<attachment name="MaryLamb.wav">
cmF0aWUgYWFuIGluIFBERi1mb3JtYWF0LiBEZSBmYWN0dXVyIGlzIGVlbiBvZmZpY2ll
ZWwgZ2VzaWduZWVyZA0KZG9jdW1lbnQgdmFuIEV1cm9maW5zIE9tZWdhbSBCVi4gRGUg
c2lnbmF0dXJlIGt1bnQgdSB2ZXJpZmnDq3Jlbi4NCg0KVm9vciBoZXQgdmVyaWZpw6ty
...
</attachment>
</mail>
另一个好处是,与创建 EML 不同,您不需要 smtpClient 来构建概念邮件文件。
Xml 在 C# 中非常容易创建和解析。
您没有说明保存 EML 的理由。如果长期归档是一个目标,那么 xml 可能具有优势。
做我所做的……放弃。
构建 MailMessage 对象似乎是重点,我在这里也有类似的问题悬而未决...... 当我已经将电子邮件作为字符串发送时如何发送?
据我所知,最简单的方法是使用原始套接字将整个 .eml 文件内容原样转储到邮件服务器,并让邮件服务器找出困难的东西,例如从、到主题等通过使用它的引擎解析电子邮件。
唯一的问题...... RFC 821 ......太痛苦了,我正试图找出一种干净的方法来做到这一点,并快速阅读邮箱中已经存在的邮件。
编辑:
我找到了一个干净的解决方案并将其覆盖在我的线程中:)
您可以使用 Windows Server 的内置 SMTP 服务器执行此操作,与使用 Exchange 的上一个答案相同。
将 .eml 文件拖放到C:\inetpub\mailroot\Pickup
,原始消息将被发送(本地或远程)。
您只需在顶部插入一行即可转发消息:
To: email@address.com
如果需要,您可以进一步操作邮件标题。
对于记录:
在 Nuget Packager Console 中写入:
Install-Package LumiSoft.Net.dll
然后在您的代码中:
using (FileStream fs = new FileStream( cacheFileName, FileMode.Open, FileAccess.Read ))
using (LumiSoft.Net.SMTP.Client.SMTP_Client client =
new LumiSoft.Net.SMTP.Client.SMTP_Client())
{
client.SendMessage( fs );
}