Уведомление о доставке в SMTP

Ниже код работает отлично. Однако мне нужно получить уведомление об отказе или успехе на конкретный адрес ([email protected]). Но я получаю письмо с уведомлением о доставке на адрес FromMail ([email protected]). Не могли бы вы помочь мне решить эту проблему?

SmtpClient smtpClient = new SmtpClient();

MailMessage message = new MailMessage();
MailAddress fromAddress = new MailAddress("[email protected]", "BALA");
MailAddress adminAddress = new MailAddress("[email protected]");

smtpClient.Host = "Mail Server Name";
smtpClient.Port = 25;
smtpClient.UseDefaultCredentials = true; 

message.From = fromAddress;
message.To.Add(_sendTo); //Recipent email
message.Subject = _subject;
message.Body = _details;
message.IsBodyHtml = true;


message.Headers.Add("Disposition-Notification-To", "[email protected]");

message.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;

message.ReplyTo = adminAddress;

smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpClient.Send(message);

Ответ 1

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

Это будет работать только в определенных условиях. Проще всего описать, если SMTP-сервер, который вы используете для отправки сообщения, - это тот же сервер, на котором размещен домен получателей сообщений электронной почты (на сервере, на который вы ссылаетесь при настройке вашего .HOST-свойства smtpClient). Таким образом, если вы отправляли только получателям на свой локальный почтовый сервер SMTP, это может работать довольно надежно. Но это зависит от конкретного используемого программного обеспечения SMTP-сервера и потенциально также от того, как он настроен.

Чтобы объяснить, почему это так, вы должны понимать, что только последний почтовый сервер SMTP, получающий сообщение, на самом деле размещающем нужные адреса электронной почты, сможет авторизованно ответить на вопрос, является ли это действительным адресом электронной почты. Если сообщение должно пройти через любые другие серверы электронной почты на пути к тому, чтобы попасть на этот окончательный авторитетный сервер, сообщение должно передаваться последовательно от одного сервера к следующему серверу в цепочке до тех пор, пока он не достигнет этого окончательного авторитетного сервера. Это означает, что не существует гарантированного метода аутентификации определенного адреса. Соедините это с тем фактом, что некоторые домены настроены на то, чтобы действовать как черная дыра и проглатывают незаконно адресуемую почту, и вы можете видеть, что есть много причин, по которым вы не можете полагаться на эту методологию.

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

Ответ 2

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

public void Send(MailMessage message)

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

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

RFC 2821 содержит более подробную информацию.

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

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

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

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

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

Ответ 3

В соответствии с MSDN.Send будет вызывать SmtpFailedRecipientsException EDIT: если СООБЩЕНИЕ не может быть доставлено одному или нескольким получателям. Вы можете найти информацию о том, какая из них имеет свойство Failed Recipient в исключении. Таким образом, если вы попытаетесь поймать это исключение и подтвердите адрес, который вы ищете в Exception, это может помочь.