2011-10-03 74 views
0

可能重复:
How to save MailMessage object to disk as *.eml or *.msg file保存自动生成的电子邮件?

我对电子邮件的人当某些条件得到满足C#程序的工作。我希望能够保存电子邮件的副本以便保存记录,并且无法弄清楚。我觉得它令人惊讶的是它没有像message.Save()这样的功能。

我已经包含下面一个非常基本的电子邮件示例:

MailMessage message = new MailMessage("from_email", "to_email"); 
message.Subject = "Email Alert"; 
message.Body = "This is a test email."; 
SmtpClient Smtp = new SmtpClient("smtp server"); 
Smtp.Send(message); 

我想保存的电子邮件的副本记录。我没有真正考虑存储邮件的所有方式,对此抱歉。如果收件人没有收到电子邮件,我可以将其副本从存档中转发给他们。我认为.msg会很好。

另外,我希望能够保存电子邮件,然后在一天结束时发送批处理。如果我收到需要添加的更新,我可能必须编程向电子邮件中添加新条目,以便收件人不会因多封电子邮件而过载。但是,在某些情况下,遇到升级时,无论何时都会自动发送电子邮件。

+3

保存对你有什么意义?数据库?纯文本文件? XML?云? – RedFilter

+0

如果您已经批处理/保存到数据库,那么您的问题是什么?你已经**了'保存电子邮件的副本'。 –

+0

@ p.cambell:我想为非程序员备份而无需访问数据库,并且如果需要的话可以很容易地重新发送文件。 – buzzzzjay

回答

3

几个不同的方式来“备份”你的电子邮件信息,使他们能够在必要时被重新发送:

  • procmail的。根据您使用的MTA,在您的MTA发送邮件时编写ProcMail recipe来存档邮件将非常容易。如果您使用的是Exchange,则可以在服务器端完成相同的操作。

  • XML序列化。创建MailMessage类的每个实例后,将其序列化并将其存储在文件系统或数据库中。在需要时应该足够简单以重新水化实例。

  • 拾取目录。SmtpClient类可以配置为将消息“发送”到“拾取目录”。这通常用于MTA(邮件传输代理)配置为监视特定目录的配置中。发送邮件的过程包括将包含RFC 2822-compliant message的文件放入目录中,在该目录中很快会被MTA收集并发送。如果没有将MTA配置为观看代答目录,则邮件信息将被丢弃并放置。

    这是一个测试应用程序的有用方法,它可以在不涉及真正的MTA的情况下进行邮件发送。当人们遭到垃圾信息抨击时,他们往往会变得脾气暴躁。

    这也是一种有用的归档技巧:在程序中配置2个SmtpClient实例:一个配置为与您的MTA交谈,另一个配置为将邮件放入拾取目录中。将您创建的每个MailMessage发布到两个实例,然后您将拥有您的存档。

任何一种这些技术都应该适合你。如果您确实需要重新发送电子邮件,则XML序列化可能是您的最佳选择,因为通过XML序列化来重新水化对象实例非常简单。

+0

您是否知道是否有任何方法更改输出.eml文件的文件名?我宁愿它看起来不像以下内容:f80f4695-551c-47d7-8879-40ad89707b23.eml谢谢! – buzzzzjay

+0

我对此表示怀疑。如果你用Reflector在'SmtpClient'的内部挖掘了一下,我怀疑你会发现它在临时目录中创建文件,然后在它被写入并关闭之后将它移动到拾取目录。 –

5

为什么不将密码抄送到管理员帐户?

3

这里要问的重要问题是:将它保存到哪里?

这就是为什么没有内置Save()方法。电子邮件通常不是简单地保存到文件系统的东西(这并不是说他们不能)。但是有很多信息不是简单地存储的,例如收件人/发件人地址,主题行,不同部分(即MIME替代部分,附件)。

4

好了,你没有太具体的什么你要找的人,所以这里有几个选项:

  1. BCC自己。这将(私下)向你自己发送一份电子邮件。
  2. 如果要保存到文件,请自行实施保存。这并不难。真的,你想要做的只是保存一些文本。我们可以实现这样的:

    private void SaveEmailToDisk(MailMessage message, string saveTo) 
    { 
        var builder = new StringBuilder(); 
        builder.AppendFormat("To: {0}\n", String.Join("; ", message.To.Select(m => m.Address).ToArray())); 
        builder.AppendFormat("From: {0}\n",message.From.Address); 
        builder.AppendFormat("Subject: {0}", message.Subject); 
        builder.AppendFormat("Body: {0}", message.Body); 
        File.WriteAllText(saveTo, builder.ToString()); 
    } 
    

当然,您可以在调整到任何需要你。

1

为什么不在发送电子邮件之前将数据写入数据库表?然后,您将记录发送了哪封电子邮件。

+0

我计划将数据存储在数据库中,然后再通过电子邮件发送。我想要备份,以便我可以在需要时重新发送。 – buzzzzjay

+1

我已经设置了一个最近的web应用程序来做到这一点,所以用户可以检查自动系统电子邮件是否按照他们的预期发布。它工作得很好。如果您在电子邮件周围捕获异常,则可以在数据库中设置一个标志,以便在没有异常情况下更新。然后,如果设置了标志,则需要经常重新发送电子邮件。 – Dragn1821