保存自动生成的电子邮件?

时间:2011-10-03 16:52:14

标签: c#

  

可能重复:
  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会很好用。

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

6 个答案:

答案 0 :(得分:5)

为什么不将电子邮件发送到管理员帐户?

答案 1 :(得分: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());
    }
    
  3. 当然,你可以根据自己的需要调整它。

答案 2 :(得分:3)

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

这就是没有内置Save()方法的原因。电子邮件通常不是容易保存到文件系统的东西(并不是说它们不能存在)。但是有很多信息不是简单存储的,比如To / From地址,主题行,不同的部分(即MIME替换部分,附件)。

答案 3 :(得分:3)

“备份”您的电子邮件的几种不同方式,以便在必要时重新发送:

  • ProcMail。根据您使用的MTA,在MTA发送邮件时,可以轻松编写ProcMail recipe来存档邮件。如果您使用的是Exchange,则可以在服务器端进行相同的操作。

  • XML序列化。创建MailMessage类的每个实例后,将其序列化并将其存储在文件系统或数据库中。应该很容易在需要时补充实例。

  • 分拣目录。 SmtpClient课程可以配置为“发送”消息到“分拣目录”。这通常用于配置MTA(消息传输代理)以观察特定目录的配置中。然后发送邮件包括将包含RFC 2822-compliant message的文件放入目录中,MTA将很快收集该文件并在途中发送。如果没有配置MTA来监视拾取目录,那么邮件将被丢弃并停在那里。

    这是测试发送邮件的应用程序而不涉及真正的MTA的有用方法。当他们被垃圾邮件抨击时,人们往往会变得脾气暴躁。

    这也是一种有用的归档技术:在程序中配置2个SmtpClient实例:一个配置为与您的MTA通信,另一个配置为将消息放入拾取目录。将您创建的每个MailMessage发布到两个实例,然后您就可以获得存档。

这些技巧中的任何一种都适合您。如果您确实需要重新发送电子邮件,那么XML序列化可能是您的最佳选择,因为通过XML序列化对对象实例进行补充非常简单。

答案 4 :(得分:1)

使用

         MailAddress bcc = new MailAddress("youremail@domain.com");
         message.Bcc.Add(bcc);

您将获得该邮件的副本。

答案 5 :(得分:1)

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