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

时间:2009-08-20 13:14:54

标签: c# email smtp eml

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

7 个答案:

答案 0 :(得分:7)

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

考虑以下困难:

  • unicode电子邮件
  • 从右到左的语言
  • 纠正由流行邮件客户端和服务器中众所周知的错误导致的格式错误的EML文件
  • 处理S / MIME(加密和签名的电子邮件)
  • 正确处理几种编码附件的方法
  • 处理嵌入到HTML电子邮件中的内嵌图像和样式表
  • 确保从Mike Crispin(Mime和IMAP RFC的合着者)正确解析MIME torture message
  • 确保格式错误的消息不会导致缓冲区溢出或其他应用程序崩溃
  • 处理分层消息(带附加消息的消息)
  • 确保它正确处理非常大的电子邮件

这种解析器的成熟需要数年时间并且不断为用户提供反馈。现在,.NET Framework中没有包含此类解析器。在它改变之前,我会从已建立的供应商处获取第三方MIME解析器。

以下代码使用我们的Rebex Secure Mail component,但我确信类似的任务也可以轻松地与其他供应商的组件一起复制。

代码基于Mail Message tutorial

// 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");

答案 1 :(得分:6)

使用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);

答案 2 :(得分:1)

做我做了什么......放弃。

构建MailMessage对象似乎是焦点,我在这里也有类似的问题...... How do i send an email when i already have it as a string?

从我所看到的最简单的方法是使用原始套接字将整个.eml文件内容转储到邮件服务器,然后让邮件服务器找出像from,to这样的硬件内容。主题,通过使用它的引擎解析电子邮件。

唯一的问题...... RFC 821 ......这样的痛苦,我正试图想出一个干净的方法来做这件事并快速阅读已经在邮箱中的邮件。

编辑:

我找到了一个干净的解决方案并在我的帖子中覆盖了它:)

How do i send an email when i already have it as a string?

答案 3 :(得分:1)

如果你是微软的商店并且还有一台Exchange服务器,那么还有另一种解决方案比这里建议的其他方法容易得多:

每个Exchange服务器都有一个开箱即用的配送目录 默认情况下,它是public class UserSpecification { public static Specification<User> findByFirstNmLastNmEmailApp(String firstNm, String lastNm, String email, Collection<Long> appIds) { return new Specification<User>() { @Override public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) { final Collection<Predicate> predicates = new ArrayList<>(); if (!StringUtils.isEmpty(firstNm)) { final Predicate firstNmPredicate = cb.like(cb.lower(root.get(User_.firstNm), firstNm)); predicates.add(firstNmPredicate); } if (!StringUtils.isEmpty(lastNm)) { final Predicate lastNmPredicate = cb.like(cb.lower(root.get(User_.lastNm), lastNm)); predicates.add(lastNmPredicate); } if (!StringUtils.isEmpty(email)) { final Predicate emailPredicate = cb.like(cb.lower(root.get(User_.email), email)); predicates.add(emailPredicate); } if (!appIds.isEmpty()) { final Predicate appPredicate = root.join(User_.applications).get(Application_.applicationId).in(appIds); predicates.add(appPredicate); } return cb.and(predicates.toArray(new Predicate[predicates.size()])); } }; } }

您只需将%ExchangeInstallPath%TransportRoles\Pickup个文件复制到该目录,Exchange就会自动发送邮件。

阅读此TechNet文章以获取更多信息:
Pickup directory and Replay directory

答案 4 :(得分:0)

记录:

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

答案 5 :(得分:0)

正如其他人所说,EML不是 public $hasMany = [ 'episodes' => ['Teranode\Anime\Models\AnimeEpisode', 'key' => 'season_id'], ]; 邮件消息的好方法。通过以其他格式保存邮件可能会更好。虽然.Net框架中有几个序列化引擎可以序列化任何对象,但您也可以考虑将您的邮件组件(如地址,正文,要附加到base64中的文件)保存在您自己设计的Xml文件中。 / p>

以下是一个让您入门的示例:

serialize

增加的优势在于,与创建EML不同,您不需要smtpClient来构建概念邮件文件。

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

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

答案 6 :(得分:0)

您可以使用Windows Server的内置SMTP服务器执行此操作,与使用Exchange的上一个答案相同。

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

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

To: email@address.com

如果需要,可以进一步处理邮件头。