我正在使用SmtpClient发送带附件的电子邮件。但是,对于某个批次,我们需要以某种方式保存MailMessage而不是发送它们。然后,我们考虑/希望手动将邮件上传到用户的草稿文件夹中。
是否可能将这些带有附件的邮件保存下来(我认为这是不可能的)。或者,将邮件上传到用户账户的文件夹中?
如果有任何相关经验,我将非常感激您提供一些帮助或指示。
在ASP.NET中进行测试时,我们会将电子邮件存储到文件夹中而不是通过电子邮件服务器发送它们。也许您可以像这样更改批处理的web.config
设置?
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/>
</smtp>
</mailSettings>
</system.net>
附加信息:
除了其他答案提供的SpecifiedPickupDirectory
信息外,如果您想确保电子邮件发送到与站点根目录相关的文件夹中——在构建服务器上进行测试时非常方便,因为您不知道路径——您可以在电子邮件发送代码中添加一个快速检查:
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;
}
你的测试将类似于以下内容(确保使用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));
这可以帮助 - 向 Microsoft.Net.Mail.MailMessage 添加Save()功能
主要思路是通过反射创建一个扩展 MailMessage 的方法,使其具有保存功能。
web.config
/ app.config
文件中使用system.net
设置来配置此项。<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.Mail 迁移到 System.Net.Mail 的信息。
在一些框架的版本中,由于存在 bug,需要添加 作为解决方法。因此,最终版本看起来是这样的:
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/>
<network host="localhost" />
</smtp>
</mailSettings>
</system.net>