如何在使用SmtpClient时保存电子邮件而不是发送邮件?

我正在使用SmtpClient发送附件的电子邮件。 但是对于某个批处理,我们需要以某种方式保存MailMessage而不是发送它们。 然后,我们正在考虑/希望手动上传消息到用户的草稿文件夹。

是否可以保存这些消息与完整的附件(不可能,我会想到)。 或者,也可以将邮件上传到用户帐户中的文件夹?

如果有人有这方面的经验,我会非常感谢一些帮助或指针。

在ASP.NET中testing时,我们将电子邮件保存到一个文件夹,而不是通过电子邮件服务器发送。 也许你可以改变你的web.config设置这样的批处理?

 <system.net> <mailSettings> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/> </smtp> </mailSettings> </system.net> 

附加信息:

  • MSDN:<specifiedPickupDirectory>元素(networking设置)
  • configurationSmtpClient将电子邮件放在磁盘上的文件夹中

除了其他答案的SpecifiedPickupDirectory信息之外,如果你想确保你的电子邮件被发送到相对于站点根目录的文件夹 – 在不知道path的构build服务器上testing的话 – 你可以添加一个快速检查在您的电子邮件发送代码:

  SmtpClient client = new SmtpClient(); ... // Add "~" support for pickupdirectories. if (client.DeliveryMethod == SmtpDeliveryMethod.SpecifiedPickupDirectory && client.PickupDirectoryLocation.StartsWith("~")) { string root = AppDomain.CurrentDomain.BaseDirectory; string pickupRoot = client.PickupDirectoryLocation.Replace("~/", root); pickupRoot = pickupRoot.Replace("/",@"\"); client.PickupDirectoryLocation = pickupRoot; } 

你的testing看起来像这样(确保你使用App_Data,这样IIS可以写入文件夹):

  // Arrange - get SitePath from AppDomain.Current.BaseDirectory + ..\ string pickupPath = Path.Combine(SitePath, "App_Data", "TempSmtp"); if (!Directory.Exists(pickupPath)) Directory.CreateDirectory(pickupPath); foreach (string file in Directory.GetFiles(pickupPath, "*.eml")) { File.Delete(file); } // Act (send some emails) // Assert Assert.That(Directory.GetFiles(pickupPath, "*.eml").Count(), Is.EqualTo(1)); 

这可以帮助 – 添加Save()function到Microsoft.Net.Mail.MailMessage
主要的想法是对MailMessage进行扩展,通过reflection制作一个保存方法。

您可以使用web.config / app.config文件中的system.net设置来configuration它。

 <system.net> <mailSettings> <smtp deliveryMethod="Network"> <network host="mail.mydomain.com" port="25" /> </smtp> <!-- Use this setting for development <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="C:\Temp" /> </smtp> --> </mailSettings> </system.net> 

此外,这里有一个从System.Web.MailSystem.Net.Mail信息链接。

一个bug还需要在框架的某些版本中添加一个解决方法。 所以完成的版本如下所示:

 <system.net> <mailSettings> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/> <network host="localhost" /> </smtp> </mailSettings> </system.net> 

这高度依赖于电子邮件客户端及其自动化API。 SMTP是一个邮件发送和传输协议。 它没有保存甚至检索电子邮件的能力。