当使用SmtpClient时,我如何保存邮件而不是发送?

52

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

是否可能将这些带有附件的邮件保存下来(我认为这是不可能的)。或者,将邮件上传到用户账户的文件夹中?

如果有任何相关经验,我将非常感激您提供一些帮助或指示。

5个回答

82

谢谢,非常有效。此外,Avram(见下文)发布了一个有用的链接,讨论如何将电子邮件消息名称从自动生成的GUID更改为您自己的值。 - user17510
我尝试了这种方法,但是出现了一个错误,指出没有指定“From”地址。在web.config中的SpecifiedPickupDirectory中有没有指定这个的方法?当你进行网络设置时,会有这个选项。 - codeMonkey

14

除了其他答案提供的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));

好的。谢谢。 - Prasad Kanaparthi

7

谢谢,很有趣看看我是否也可以在这里添加附件。 - user17510

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>

另外,这里有一个链接提供有关从 System.Web.Mail 迁移到 System.Net.Mail 的信息。


1

在一些框架的版本中,由于存在 bug,需要添加 作为解决方法。因此,最终版本看起来是这样的:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接