.NET SMTPClient - где хранится ожидающая исходящая почта?

Если я поставил в очередь какое-то электронное письмо для отправки через System.Net.Mail.SMTPClent, где я могу найти это письмо? С клиентом SMTP для Windows он находится в папке C:\inetpub\mailroot - есть ли аналогичная папка для клиента.NET?

РЕДАКТИРОВАТЬ: Вот пример. Если я отключу исходящий SMTP-сервер на своем компьютере с XP и затем запустлю приложение, которое отправит десяток электронных писем, они будут где-то поставлены в очередь, поскольку вызов.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, но я мог бы поклясться, что они оба работали в прошлом. Я сделаю еще несколько тестов и при необходимости внесу изменения в вопрос.

5 ответов

Решение

Судя по страницам MSDN для SmtpClient, он настраивается. Вы можете использовать свойство DeliveryMethod, чтобы решить, будет ли почта отправляться немедленно, помещена ли она в очередь в папку раскладки IIS (предположительно C:\inetpub\mailroot) или находится ли она в папке по вашему выбору (определяется свойством PickupDirectoryLocation).

Описание немного расплывчато, но если вы позвоните Send() и ваш DeliveryMethod является Network и вызов завершается успешно, тогда он больше не принадлежит.NET. Что-то приняло его к доставке, и оно сидит в очереди этого чего-то, что прыгает от радости, когда вы снова включаете почтовый сервер, который может соединиться с внешним миром. когда DeliveryMethod является NetworkЯ вполне уверен (по крайней мере, судя по разборке Reflector), что он пишет прямо в сетевом потоке, а не через какой-то промежуточный временный файл. Если он не может открыть соединение и получить этот поток, то он рвется с исключением. Это совпадает с моим реальным опытом использования этого класса. Надеюсь, это поможет.

Вы можете установить указанный каталог и способ доставки для большего контроля

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

По умолчанию 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>

Вы можете взглянуть на эту статью в проекте кода, который показывает, как вручную обрабатывать файлы, созданные SMTP-клиентом, когда DeliveryMethod == SmtpDeliveryMethod.SpecifiedPickupDirectory,

SMTP-клиент.NET, к которому я привык, нигде не хранит почту. Это просто отправляет. Если исходящий сервер, через который он должен отправлять сообщения, не работает, он немедленно выдает исключение.

Вы пытались включить и выключить исходящий сервер на вашем компьютере с XP. Отлично. Теперь попробуйте найти входящую службу SMTP. Входящие и исходящие SMTP-сервисы взаимодействуют друг с другом посредством filedrop.

Другие вопросы по тегам