.NET SMTPClient - 那么未发送的邮件存储在哪里?

4
如果我使用System.Net.Mail.SMTPClient排队发送了一些电子邮件,那么在哪里可以找到这些邮件呢?对于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服务器。我将在Server 2003上进行测试,但我敢肯定这些都曾经起作用过。如果需要,我将进行更多的测试并修改问题。


为什么不搜索邮件呢?它们不是以某种邮件消息格式存储的吗? - dotjoe
5个回答

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

现在你编辑了你的问题,我意识到我并没有真正回答它。我猜你最好手动指定拾取目录,这样你就知道它在哪里了。我找不到任何关于它默认位置的参考。也许是%TEMP%。 - Matt Hamilton
你现在走在正确的轨道上。由于我没有mailroot文件夹,将我的邮件发送到IIS接收文件夹只会使它消失(糟糕的处理方式,微软!),但是我可以手动指定接收文件夹并查看我的邮件。但我仍然想知道默认文件夹在哪里! - SqlRyan

2
描述有点模糊,但如果您调用Send()并且您的DeliveryMethodNetwork,并且调用成功,则它不再属于.NET领域。某物已接受它进行传递,并且它正坐在该物体的队列中,在您重新启动可以连接外部世界的邮件服务器时,该队列会欢呼雀跃。当DeliveryMethodNetwork时,我非常确定(至少从Reflector反汇编判断),它直接涂写在网络流上,而不是通过某些中间临时文件。如果它无法打开连接并获取该流,则会抛出异常。这与我使用此类的实际经验相符。希望这有所帮助。

1

默认情况下,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>

你可以查看 Code Project 中的 this article,其中展示了如何手动处理 SMTP Client 创建的文件,当 DeliveryMethod == SmtpDeliveryMethod.SpecifiedPickupDirectory时。

1

您可以设置指定的取件目录和交付方式,以获得更大的控制权。

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

0

我熟悉的.NET SMTP客户端不会存储任何邮件。它只是发送。如果它应该通过的出站服务器已经关闭,它会立即抛出异常。

你已经尝试在XP桌面上开启和关闭出站服务器了。很好。现在,请尝试找到入站SMTP服务。入站和出站SMTP服务通过文件传输进行通信。


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