Есть ли способ проверить, успешно ли 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 ДОЛЖЕН сформулировать и отправить сообщение уведомления. Это уведомление ДОЛЖНО быть отправлено с использованием обратного пути null («<>») в конверте. Получателем этого уведомления ДОЛЖЕН быть адрес из обратного пути конверта (или строки Return-Path:).
Похожие вопросы
Связанные вопросы
Новые вопросы
asp.net
ASP.NET - это среда разработки веб-приложений Microsoft, которая позволяет программистам создавать динамические веб-сайты, веб-приложения и веб-службы. Полезно использовать этот тег в сочетании с тегом типа проекта, например, [asp.net-mvc], [asp.net-webforms] или [asp.net-web-api]. НЕ используйте этот тег для вопросов о ASP.NET Core - используйте вместо этого [asp.net-core].