Есть ли способ проверить, успешно ли SmtpClient доставил электронное письмо? SmtpClient.Send() не возвращает ничего, кроме исключения. Итак, если метод завершится, можно ли предположить, что электронное письмо будет успешно отправлено в соответствующий почтовый ящик? Мой код ниже:

MailMessage emailMessage = new MailMessage();
emailMessage.Subject = SubjectText;
emailMessage.IsBodyHtml = IsBodyHtml;
emailMessage.Body = BodyText;
emailMessage.From = new MailAddress(Settings.Default.FromEmail,Settings.Default.FromDisplayName);

//add recipients
foreach (string recipientAddress in RecipientAddresses.Split(new char[{','},StringSplitOptions.RemoveEmptyEntries))

emailMessage.To.Add(recipientAddress);

using (SmtpClient smtpClient = new SmtpClient())
{
smtpClient.Send(emailMessage);
}
1
whoblitz 11 Фев 2011 в 23:31
Нет, потому что SMTP отстой. Но да, если он не бросил, вы можете с уверенностью предположить, что SmtpClient действительно сделал все возможное.
 – 
AK_
11 Фев 2011 в 23:37
 – 
Michael Freidgeim
9 Фев 2016 в 16:00

4 ответа

Нет, нет надежного способа узнать, действительно ли сообщение было доставлено.

Для этого потребуется доступ к конечному SMTP-серверу для каждого человека, которому вы отправляете электронное письмо.

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

4
Oded 11 Фев 2011 в 23:36

Невозможно быть на 100% уверенным, что почтовое сообщение было получено при отправке через SmtpClient из-за того, как работает электронная почта. Тот факт, что SmtpClient не генерирует исключение, по сути, означает, что вы все сделали правильно, но в дальнейшем может произойти сбой, например:

  • Принимающий почтовый сервер может отклонить почту
  • Промежуточный почтовый сервер может отклонить почту
  • Сервер, через который SmtpClient передает почту, может решить отказаться от передачи почты.
1
Rob 11 Фев 2011 в 23:37

Одним из решений, которое вы можете использовать, является создание httphandler для изображений вашего веб-сайта. Если вы отправляете HTML-сообщение, содержащее хотя бы одно изображение, вы можете встроить данные строки запроса в конец этого изображения. Это может быть даже что-то вроде прозрачного изображения 1x1. Когда пользователь читает электронное письмо, он отправляет запрос на сервер для получения данных изображения, и, в свою очередь, вы можете перехватить этот запрос и обозначить, что сообщение было прочитано.

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

1
Kyle B. 11 Фев 2011 в 23:42

Если адрес электронной почты получателя действителен, вы не получите немедленного возвращаемого значения об успешной доставке сообщения; смотри подпись:

public void Send(MailMessage message)

SMTP-сервер почти сразу уведомит отправителя (или того, кого вы укажете для уведомления) с уведомлением «Не доставлено» всякий раз, когда адрес электронной почты получателя недействителен / поддельный.

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

RFC 2821 содержит дополнительные сведения.

Из раздела 2.1 Базовая структура

Другими словами, передача сообщения может происходить в одном соединении. между первоначальным SMTP-отправителем и конечным SMTP-получателем, или может происходят в серии прыжков через промежуточные системы. В любом В этом случае происходит формальная передача ответственности за сообщение: протокол требует, чтобы сервер принимал ответственность за доставки сообщения или надлежащего сообщения о невозможности этого сделать.

См. разделы 4.5.4 и 4.5.5.

Из раздела 6.1 Надежная доставка и ответы по электронной почте

В случае сбоя доставки после принятия сообщения получатель-SMTP ДОЛЖЕН сформулировать и отправить сообщение уведомления. Это уведомление ДОЛЖНО быть отправлено с использованием обратного пути null («<>») в конверте. Получателем этого уведомления ДОЛЖЕН быть адрес из обратного пути конверта (или строки Return-Path:).

0
Only You 15 Апр 2014 в 00:31