.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.