C# 发送保存在磁盘上的eml文件

C# 发送保存在磁盘上的eml文件,c#,email,smtp,eml,C#,Email,Smtp,Eml,我正在创建eml并使用上面提到的过程将它们保存到一个目录中。 我想知道如何发送这些eml文件? 我尝试使用SMTPClient类的对象,但它将MailMessage对象作为其参数,我无法找到使用这些保存的eml文件创建MailMessage类型对象的方法。用于从.eml文件检索数据。它包含创建MailMessage对象所需的所有数据,比如From、to、Subject、Body等等 FileStream fs = File.Open(filePath, FileMode.Open, FileAc

我正在创建eml并使用上面提到的过程将它们保存到一个目录中。 我想知道如何发送这些eml文件? 我尝试使用SMTPClient类的对象,但它将MailMessage对象作为其参数,我无法找到使用这些保存的eml文件创建MailMessage类型对象的方法。

用于从.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);

正确加载EML文件并不像看上去那么容易。您可以在几天内编写一个在95%的情况下工作的实现。剩下的5%至少需要几个月;-)。我知道,因为我参与了开发

考虑以下缺陷:

  • unicode电子邮件
  • 从右到左的语言
  • 更正由流行邮件客户端和服务器中的已知错误导致的格式错误的EML文件
  • 处理S/MIME(加密和签名的电子邮件)
  • 正确处理附件编码的几种方法
  • 处理嵌入HTML电子邮件中的内联图像和样式表
  • 确保它正确解析来自Mike Crispin(Mime和IMAP RFCs的合著者)的
  • 确保格式错误的消息不会导致缓冲区溢出或其他应用程序崩溃
  • 处理分层消息(带有附加消息的消息)
  • 确保它正确处理非常大的电子邮件
这种解析器的成熟需要数年时间,并且需要用户不断地反馈。目前,.NET Framework中没有包含这样的解析器。在它改变之前,我建议从一家成熟的供应商那里获得第三方MIME解析器

下面的代码使用了我们的,但我相信类似的任务也可以通过其他供应商的组件轻松复制

代码基于


做我所做的。。。放弃

构建MailMessage对象似乎是我关注的焦点,这里还有一个类似的问题有待解决。。。

据我所知,最简单的方法是使用原始套接字将整个.eml文件内容按原样转储到邮件服务器,并让邮件服务器通过使用其引擎解析电子邮件来找出诸如从、到主题等硬内容

唯一的问题是。。。RFC821。。。如此痛苦,我正试图找出一个干净的方法来做到这一点,并阅读邮件已经在邮箱太快

编辑:

我找到了一个干净的解决方案,并将其覆盖在我的线程中:)

对于记录:

在Nuget Packager控制台中写入:

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 );
}

如果您是一家Microsoft商店,并且有一台Exchange服务器,那么还有一种解决方案比此处建议的其他解决方案简单得多:

每个Exchange服务器都有一个现成配置的分拣目录。
默认情况下,它是
%ExchangeInstallPath%TransportRoles\Pick

您只需将
.eml
文件复制到该目录,Exchange将自动发送邮件


阅读这篇TechNet文章了解更多信息:

正如其他人所证明的,EML并不是将邮件消息序列化的好方法。你最好用另一种格式保存邮件。虽然.NETFramework中有多个序列化引擎来序列化任何对象,但您也可以考虑仅保存您的邮件的组件,如地址、主体、要在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>

嗨,托马斯,
你好吗?
拜伊
cmF0aWUgYWFuIGluIFBERi1mb3JtYWF0LiBEZSBmYWN0dXVyIGlzIGVlbiBvZmZpY2ll
ZWWGZ2VZAWDUZWVYZA0KZG9JDW1LBNQGDMFUIEV1CM9MAW5ZI9TZWDHBSBCVI4GRGUG
c2lnbmF0dXJlIGt1bnQgdSB2ZXJpZmnDq3Jlbi4NCg0KVm9vciBoZXQgdmVyaWZpw6ty
...
另外一个优点是,与创建EML不同,您不需要smtpClient来构建概念邮件文件

Xml非常容易在C#中创建和解析


你没有说出拯救EML的理由。如果长期存档是一个目标,xml可能会有优势。

您可以使用Windows Server的内置SMTP服务器来实现这一点,与前面使用Exchange的回答相同

将.eml文件放到
C:\inetpub\mailroot\Pickup
中,原始消息将被发送(本地或远程)

只需在顶部插入一行即可转发邮件:

To: email@address.com

如果需要,您可以进一步操作邮件标题。

提供的代码不处理其他视图或附件。链接文章指定它已过时,并链接到另一个()以更好地处理备用视图和附件,但仍然存在一些问题(密件抄送看起来被不正确地还原为“收件人”)是的,我知道。我只是想帮助其他任何人(比如我自己)在试图找到解决同样问题的方法时遇到这个问题。另请参见相关问题:您好,martin。您是否尝试过此代码消息。Load()。没有这样的方法。请尝试您的代码,然后发布代码,代码工作正常。它使用Rebex.Mail.MailMessage类,该类自1.0版起就具有Load方法。代码正上方的帖子中提到了这一点。也许你的意思是System.Net.Mail.MailMessage没有加载方法?我知道——这就是为什么我的答案使用不同的类的确切原因。
To: email@address.com