【问题标题】:.NET SMTPClient - where is pending outgoing mail stored?.NET SMTPClient - 待发邮件存储在哪里?
【发布时间】:2008-12-21 05:11:56
【问题描述】:

如果我已将一些电子邮件排队等待通过 System.Net.Mail.SMTPClent 发送,我在哪里可以找到这封邮件?对于 Windows SMTP 客户端,它位于 C:\inetpub\mailroot 文件夹中 - .NET 客户端是否有类似的文件夹?

编辑:这是一个例子。如果我关闭我的 XP 计算机上的传出 SMTP 服务器,然后运行一个发送十几封电子邮件的应用程序,它们会在某个地方排队,因为 .NET SMTPClient.Send 调用成功。几个小时后,我启动了本地 SMTP 服务器,邮件突然飞快地离开了。期间在哪里?同样的行为发生在我的 Vista 桌面上,尽管我没有本地 SMTP 服务器——我可以通过在防火墙上阻止端口 25 来复制该功能,然后邮件在某处排队。在哪里?

这个问题的原因是我想在我拥有的服务器上重新启用 SMTP 服务,但我不知道在此期间排队的是什么,我想确保队列是干净的我重新启用该服务。这样一来,客户就不会突然收到非常非常旧的排队电子邮件。

编辑:显然,我不知道我在说什么。当我在 Vista 上执行此操作时:

    Dim mm As New System.Net.Mail.MailMessage("me@me.com", "you@you.com", "Testing", "this is a test")

    Dim s As New System.Net.Mail.SmtpClient("localhost")
    s.DeliveryMethod = Mail.SmtpDeliveryMethod.PickupDirectoryFromIis
    s.Send(mm)

我收到一个异常,因为我没有 IIS 拾取文件夹。将其更改为“Mail.SmtpDeliveryMethod.Network”会立即导致异常,因为我没有运行 SMTP 服务器。我将在服务器 2003 上对此进行测试,但我可以发誓这两者在过去都有效。如果需要,我会进行更多测试并修改问题。

【问题讨论】:

  • 为什么不搜索邮件?它们不是以某种邮件消息格式存储的吗?

标签: .net smtpclient outgoing-mail


【解决方案1】:

从 SmtpClient 的 MSDN 页面的外观来看,它是可配置的。您可以使用DeliveryMethod 属性来决定是否立即发送邮件、是否将其排入 IIS 拾取文件夹(可能是 C:\inetpub\mailroot)或是否放置在您选择的文件夹中(由 PickupDirectoryLocation 指定属性)。

【讨论】:

  • 现在您已经编辑了您的问题,我意识到我并没有真正回答它。我想您最好的选择是手动指定拾取目录,以便您知道它在哪里。我找不到对其默认位置的任何引用。 %TEMP% 可能。
  • 您现在走在正确的轨道上。由于我没有 mailroot 文件夹,将我的邮件发送到 IIS 拾取文件夹只会将其发送到深渊(糟糕的处理,Microsoft!),但我可以手动指定 picup 目录并查看我的邮件。但是我还是想知道默认文件夹在哪里!
【解决方案2】:

描述有点模糊,但是如果你调用Send() 而你的DeliveryMethodNetwork 并且调用成功,那么它就不再属于.NET 领域了。 Something 已经接受了它的投递,它正坐在那个东西的队列中,当你重新打开可以与外界连接的邮件服务器时,它会高兴地跳起来。当DeliveryMethodNetwork 时,我很确定(至少,从Reflector 反汇编来看)它直接在网络流上书写,而不是通过一些中间临时文件。如果它无法打开连接并获取该流,那么它会出现异常呕吐。这与我使用这个类的实际经验不谋而合。希望对您有所帮助。

【讨论】:

    【解决方案3】:

    默认情况下,SMTP 客户端使用网络发送。所以没有电子邮件存储在任何地方。

    这是web.config的配置部分

            <mailSettings>
            <!--
                <smtp
                    deliveryMethod = "Network" [Network | SpecifiedPickupDirectory | PickupDirectoryFromIis]
                    from = "" [String]
                    >
                    <network
                        defaultCredentials = "false" [true|false]
                        host = "" [String]
                        password = "" [String]
                        port = "25" [number]
                        userName = "" [String]
                    />
                    <specifiedPickupDirectory
                        pickupDirectoryLocation = "" [String]
                    />
                </smtp>
            -->
            <smtp deliveryMethod="Network">
                <network defaultCredentials="false" port="25" />
            </smtp>
        </mailSettings>
    

    您可以查看代码项目中的this article,它展示了如何在DeliveryMethod == SmtpDeliveryMethod.SpecifiedPickupDirectory 时手动处理由SMTP 客户端创建的文件。

    【讨论】:

      【解决方案4】:

      您可以设置指定的取货目录和送货方式,以便更好地控制

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

      【讨论】:

        【解决方案5】:

        我习惯使用的 .NET SMTP 客户端不会在任何地方存储邮件。它只是发送。如果它应该通过的出站服务器发生故障,它会立即给出异常。

        您已尝试打开和关闭 XP 机器上的出站服务器。伟大的。现在,尝试查找入站 SMTP 服务。入站和出站 SMTP 服务通过 filedrop 相互通信。

        【讨论】:

          猜你喜欢
          • 2011-01-29
          • 1970-01-01
          • 2012-12-27
          • 1970-01-01
          • 1970-01-01
          • 2019-06-10
          • 1970-01-01
          • 2014-08-09
          • 1970-01-01
          相关资源
          最近更新 更多