可能重复:
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会很好用。
另外,我希望能够保存电子邮件,然后在一天结束时发送批处理。如果我收到需要添加的更新,我可能需要在电子邮件中添加新条目,以便收件人不会因多封电子邮件而过载。但是,在某些情况下会遇到升级级别,无论何时何时都会自动发送电子邮件。
答案 0 :(得分:5)
为什么不将电子邮件发送到管理员帐户?
答案 1 :(得分:4)
嗯,你对你所寻找的东西并不太具体,所以这里有几个选择:
如果要保存到文件,请自行实施保存。这并不难。真的你要做的就是保存一些文字。我们可以像这样实现它:
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());
}
当然,你可以根据自己的需要调整它。
答案 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)
为什么不在发送电子邮件之前将数据写入数据库表?然后,您可以记录发送的电子邮件。