Назад | Перейти на главную страницу

Как отследить, было ли электронное письмо успешным среди тысяч (IIS 6, .NET 3.5)

Я хочу иметь возможность узнать, было ли электронное письмо, отправленное пользователю, успешным или нет.

Я попытался просмотреть журналы SMTP, и, похоже, нет способа связать запросы сервера с ответами сервера. Поэтому, если я получаю сообщение об ошибке 550 и запрашиваемый адрес не включается в ответ, у меня нет возможности узнать, какой адрес или какой запрос не удалось выполнить.

Ищу решение либо в логах, либо в коде, который отправляет.

Немного предыстории:
Правильно настроенный сервер должен немедленно сообщить вам, если почта не будет доставлена.

iirc: Первоначально это делали SMTP-серверы, но затем это считалось дырой в безопасности, чтобы выявить, существует ли пользователь в системе или нет, поэтому они начали принимать все, а затем отказываться. Но возврат используется спамерами для доставки спама, «возвращая его обратно адресату спама». Итак, теперь мы вернулись к немедленному отклонению электронного письма на основе правил ретрансляции.

Это означает, что в большинстве случаев вы жестяная банка определить, было ли письмо доставлено. Но только если вы общаетесь напрямую с почтовым сервером получателя. Это означает, что вашему приложению необходимо проделать большую работу: MX-поиск, TCP-соединение с потенциально медленным сервером, который может использовать битумная яма так что это чертовски медленно, обрабатывать тайм-аут и т. д. Проблема в том, что вы не будете очень хорошо обрабатывать серверы, которые временно не работают.

Если вы отправляете электронное письмо, доставляя его на сервер ретрансляции (например, на ваш локальный SMTP-сервер IIS или ваш интернет-провайдер), то единственный способ обнаружить отказы - это установить заголовок отказов в почте и проверить учетную запись отказов на предмет отказов писем. Это не редкость. Однако для возврата всех отказов может потребоваться до (и более) 5 дней, в зависимости от настроек повтора на SMTP-серверах в цепочке.

Эта проблема часто решается простым добавлением URL к изображению внутри сообщения. Когда пользователь нажимает «загрузить контент», изображение загружается, и вы можете подтвердить получение. Изображение могло быть http://server.com/image.jpg?user=some@user.com или это может быть созданная вами aspx-страница, которая использует Response.SendFile для отправки изображения (вы также можете установить Content-Type в Response.Header).

Единственный способ, о котором я знаю, - это обойти SMTP-сервер IIS и отправить его напрямую. Вы можете погуглить и найти некоторые компоненты, которые сделают это за вас, иначе вот ссылка на необработанный Версия TCP:

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