2009-02-19 63 views
37

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

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

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

+0

“而不是发送”。 – Avram 2009-02-19 23:52:42

回答

57

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

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

附加信息:

+0

谢谢工作。另外Avram(见下文)发布了一个有用的链接,讨论将电子邮件名称从自动生成的GUID更改为您自己的值。 – user17510 2009-02-20 00:57:35

+0

我试过这个方法,并且我得到一个错误,指出“From”地址没有被指定。有没有一种方法可以在web.config中指定SpecifiedPickupDirectory?当你进行网络设置时,有 – codeMonkey 2018-01-19 19:01:51

-6

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

6

您可以使用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

7

以及其他答案的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)); 
1

的bug也需要在f的某些版本中添加作为解决方法ramework。所以完成的版本看起来像:

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