Как проверить, что MailMessage был доставлен в.NET?
Есть ли способ проверить, успешно ли 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);
}
4 ответа
Нет, нет надежного способа узнать, действительно ли сообщение было доставлено.
Для этого потребуется доступ к конечному SMTP-серверу для каждого человека, которому вы пишете.
Если вы не получите исключение, вы можете предположить, что SMTP-сервер сделал все возможное для доставки электронной почты.
Нет никакой возможности быть на 100% уверенным, что почтовое сообщение было получено при отправке через SmtpClient
из-за того, как работает электронная почта. Дело в том, что SmtpClient
"Не выбрасывать исключение" означает, что вы все сделали правильно, но в дальнейшем может произойти сбой, например:
- Принимающий почтовый сервер может отклонить почту
- Промежуточный почтовый сервер может отклонить почту
- Сервер, через который SmtpClient передает почту, может принять решение об отказе в передаче почты
Одним из решений, которое вы можете использовать, является создание httphandler для изображений вашего сайта. Если вы отправите HTML-сообщение, содержащее хотя бы одно изображение, вы можете вставить данные строки запроса в конец этого изображения. Это может быть что-то вроде прозрачного изображения 1x1. Когда пользователь читает электронную почту, он отправляет запрос на сервер для получения данных изображения, и, в свою очередь, вы можете зафиксировать этот запрос и указать, что сообщение было прочитано.
Однако это не является пуленепробиваемым, поскольку большинство почтовых клиентов по умолчанию блокируют изображения, если пользователь не укажет, что они хотели бы просматривать изображения в электронном письме.
Если адрес электронной почты получателя действителен, вы не получите немедленное возвращаемое значение об успешной доставке сообщения; увидеть подпись:
public void Send(MailMessage message)
SMTP-сервер будет уведомлять отправителя (или кого-либо, кого вы указали для уведомления) почти немедленно с уведомлением о невозможности доставки, когда адрес электронной почты получателя является недействительным / поддельным.
SMTP-серверы должны периодически повторять попытки доставки. Если адрес электронной почты получателя является действительным адресом, но по какой-то причине SMTP-сервер не смог доставить сообщение, SMTP-сервер вернет отправителю сообщение об ошибке, если он не сможет доставить сообщение через определенный период времени.
RFC 2821 содержит больше деталей.
Из раздела 2.1 Базовая структура
Другими словами, передача сообщения может происходить в одном соединении между исходным SMTP-отправителем и конечным SMTP-получателем или может происходить в серии переходов через промежуточные системы. В любом случае происходит официальная передача ответственности за сообщение: протокол требует, чтобы сервер принял на себя ответственность либо за доставку сообщения, либо за надлежащее сообщение об отказе сделать это.
Смотрите разделы 4.5.4 и 4.5.5
Из раздела 6.1 Надежная доставка и ответы по электронной почте
Если после принятия сообщения произойдет сбой доставки, получатель-SMTP ДОЛЖЕН сформулировать и отправить уведомление по почте. Это уведомление ДОЛЖНО быть отправлено с использованием нулевого (<>") обратного пути в конверте. Получателем этого уведомления ДОЛЖЕН быть адрес из пути возврата конверта (или строки Return-Path:).