Как проверить, было ли письмо успешно отправлено - PullRequest
23 голосов
/ 26 февраля 2010

Я занимаюсь разработкой приложения Asp.Net, в котором отправляю письмо на электронный адрес пользователя, если он забывает пароль.

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

EDIT

В случае, если идентификатор электронной почты не существует, я бы обнаружил сбой.

Ответы [ 8 ]

21 голосов
/ 26 февраля 2010

если ваш метод SmtpMail.Send(message) не возвращает ошибку, это означает, что электронное письмо было отправлено на SMTP-сервер, тогда вы находитесь за пределами своей юрисдикции, это то, как далеко вы можете знать.

10 голосов
/ 26 февраля 2010

Если вы используете System.Net.Mail, попробуйте

message.DeliveryNotificationOptions = System.Net.Mail.DeliveryNotificationOptions.OnSuccess;
8 голосов
/ 26 февраля 2010

Поместите метод .Send (msg) в блок try catch и перехватите SmtpFailedRecipientException.

try
{
    mail.Send(msg);
}
catch (SmtpFailedRecipientException ex)
{
    // ex.FailedRecipient and ex.GetBaseException() should give you enough info.
}
6 голосов
/ 26 февраля 2010

Согласно spec :

S: 220 smtp.example.com ESMTP Postfix
C: HELO relay.example.org
S: 250 Hello relay.example.org, I am glad to meet you
C: MAIL FROM:<bob@example.org>
S: 250 Ok
C: RCPT TO:<alice@example.com>
S: 250 Ok
C: RCPT TO:<theboss@example.com>
S: 250 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: "Bob Example" <bob@example.org>
C: To: Alice Example <alice@example.com>
C: Cc: theboss@example.com
C: Date: Tue, 15 Jan 2008 16:02:43 -0500
C: Subject: Test message
C:
C: Hello Alice.
C: This is a test message with 5 header fields and 4 lines in the message body.
C: Your friend,
C: Bob
C: .
S: 250 Ok: queued as 12345
C: QUIT
S: 221 Bye
{The server closes the connection}

Как только сервер сообщает 250 Ok: queued as 12345, вы не можете точно знать, действительно ли оно отправило электронное письмо или нет, или оно было доставлено.

5 голосов
/ 26 февраля 2010

Вы можете использовать DeliveryNotificationOptions для получения квитанции.

Если у вас есть MailMessage объект с именем mail, сделайте это:

mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;
4 голосов
/ 26 февраля 2010

Метод SmtpClient.Send вызовет исключение, если возникла проблема с отправкой. Но кроме передачи этого сообщения на SMTP-сервер, нет способа узнать, доберется ли оно оттуда до места назначения.

4 голосов
/ 26 февраля 2010

Нет. Электронная почта (на основе SMPT) является ненадежным транспортным протоколом, и хотя существуют некоторые хаки для обнаружения того, что электронная почта была получена и прочитана, например, встраивая индивидуальный URL-адрес изображения в электронное письмо и отслеживая, что изображение было запрошено клиентом получателя, не существует абсолютно надежного способа выполнить ваш запрос.

0 голосов
/ 03 октября 2018

Я использую SMTP Gmail для отправки писем с моей программой. Поддельное отправленное письмо возвращается нормально, даже с ловушкой SmtpFailedRecipientException.

Но когда я проверяю outlook моего получателя gmail, я вижу, что письмо не было отправлено с объяснением. С темой Уведомление о статусе доставки (отказ)

Мой вопрос: возможно ли получить это уведомление в программе?

Я нашел это, но это не для POP

Уведомление клиента C #, когда SMTP-сервер получает новое электронное письмо

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