【发布时间】:2010-10-08 17:46:49
【问题描述】:
我正在使用 SmtpClient 发送带有附件的电子邮件。 但是对于某个批次,我们需要以某种方式保存 MailMessage 而不是发送它们。 然后我们正在考虑/希望手动将消息上传到用户草稿文件夹。
是否可以保存这些带有完整附件的邮件(我原以为不可能)。或者将消息上传到用户帐户中的文件夹?
如果有人有这方面的经验,我会非常感谢一些帮助或指点。
【问题讨论】:
我正在使用 SmtpClient 发送带有附件的电子邮件。 但是对于某个批次,我们需要以某种方式保存 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>
另外,这里有一个链接,上面有 migrating from System.Web.Mail to System.Net.Mail 的信息。
【讨论】:
在 ASP.NET 中进行测试时,我们将电子邮件保存到一个文件夹中,而不是通过电子邮件服务器发送它们。也许您可以像这样为您的批次更改web.config 设置?
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/>
</smtp>
</mailSettings>
</system.net>
其他信息:
【讨论】:
这会有所帮助 - Adding Save() functionality to Microsoft.Net.Mail.MailMessage
主要思想,对 MailMessage 做一个扩展,通过反射做一个保存方法。
【讨论】:
除了其他答案的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));
【讨论】:
还需要在某些版本的框架中添加一个错误作为解决方法。所以完成的版本是这样的:
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/>
<network host="localhost" />
</smtp>
</mailSettings>
</system.net>
【讨论】: