【问题标题】:How can I save an email instead of sending when using SmtpClient?使用 SmtpClient 时如何保存电子邮件而不是发送?
【发布时间】:2010-10-08 17:46:49
【问题描述】:

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

是否可以保存这些带有完整附件的邮件(我原以为不可能)。或者将消息上传到用户帐户中的文件夹?

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

【问题讨论】:

    标签: c# .net email smtp


    【解决方案1】:

    您可以使用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 的信息。

    【讨论】:

      【解决方案2】:

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

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

      其他信息:

      【讨论】:

      • 谢谢你的款待。 Avram(见下文)还发布了一个有用的链接,讨论了将电子邮件名称从自动生成的 GUID 更改为您自己的值。
      • 我已经尝试过这种方法,但我收到一个错误,即未指定“发件人”地址。有没有办法在 web.config 中为 SpecifiedPickupDirectory 指定这个?当你做网络设置有
      【解决方案3】:

      这会有所帮助 - Adding Save() functionality to Microsoft.Net.Mail.MailMessage
      主要思想,对 MailMessage 做一个扩展,通过反射做一个保存方法。

      【讨论】:

      • 谢谢,看看我是否也可以在这里添加附件会很有趣。
      【解决方案4】:

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

      【讨论】:

      • 谢谢伙计。这就是我要找的!
      • 好一个。谢谢
      【解决方案5】:

      还需要在某些版本的框架中添加一个错误作为解决方法。所以完成的版本是这样的:

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

      【讨论】:

        猜你喜欢
        • 2014-10-18
        • 1970-01-01
        • 2015-06-11
        • 2014-09-15
        • 1970-01-01
        • 2015-02-26
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        相关资源
        最近更新 更多