.NET SMTPClient - где хранится ожидающая исходящая почта? - PullRequest
4 голосов
/ 21 декабря 2008

Если я поставил в очередь какое-то электронное письмо для отправки через 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 ]

4 голосов
/ 21 декабря 2008

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

2 голосов
/ 30 января 2009

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

1 голос
/ 30 января 2009

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

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</sysetm.net>
1 голос
/ 30 января 2009

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

0 голосов
/ 30 января 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...