Как подтвердить, что Почта доставлена или нет?

ниже мое кодирование, просто взгляните на него

System.Net.Mail.MailMessage oMail = new System.Net.Mail.MailMessage();
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();
oMail.From = new System.Net.Mail.MailAddress("one@gmail.com");
oMail.To.Add(TextBox1.Text.Trim());
oMail.Subject = "Subject*";
oMail.Body = "Body*";
oMail.IsBodyHtml = true;
smtp.Host = "smtp.sendgrid.net";
System.Net.NetworkCredential cred = new System.Net.NetworkCredential("myusername", "mypassword");
smtp.UseDefaultCredentials = false;
smtp.Credentials = cred;
smtp.Send(oMail);

здесь мне нужно проверить, была ли эта почта доставлена или нет.

6 ответов


вы не можете. Поскольку вы используете SMTP, в общем случае невозможно сказать, удалась ли доставка или нет. Спецификация читал протокол SMTP. Почта направляется во время доставки, поэтому:

  1. нет никакой гарантии, что ваше сообщение будет отправлено, как только вы позвоните smtp.Send().
  2. так как SMTP является routed, вы не можете быть уверены, что какой-то узел на маршруте не потерпит неудачу с доставкой в восходящую линию связи.

вы можете установить DeliveryNotificationOptions свойства MailMessage to OnSuccess.

здесь больше информации об этом: http://msdn.microsoft.com/en-us/library/system.net.mail.deliverynotificationoptions.aspx

и здесь: http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.deliverynotificationoptions.aspx

как было отмечено в комментариях, этот метод не является 100% надежным. Это только один вариант.


вот некоторые рекомендации по обеспечению доставки электронной почты:

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

http://www.kellermansoftware.com/p-37-net-email-validation.aspx


на случай, если кто-то наткнется. Вот мой опыт работы на старом сервере Win 2003 с Exchange. Мое приложение .Net использует SMTP для отправки электронных писем и использует групповой адрес как "от", Поэтому любые ответы будут отправляться всей группе. Это диспетчерская операция, и мы хотели, чтобы кто-нибудь из группы помог с любыми ответами. Мы ожидали, что любые уведомления о недоставке будут отправлены группе. Этого не происходит. Я даже вошел в отслеживание сообщений и увидел, что Exchange сказал, что он отправил уведомление группа, но они ее так и не получили. Затем я вошел в свойства виртуального сервера SMTP и ввел адрес электронной почты группы в "отправить копию отчета о недоставке:". Тот же результат, отслеживание сообщений говорит, что он отправил его группе, но он никогда не был доставлен. По-видимому, уведомления о недоставке будут доставляться только на адрес электронной почты отдельного лица, а не группы. Я изменил его на индивидуальный адрес и он работает.


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


Если у вас есть доступ к серверу, содержащему журнал SMTP, в зависимости от типа используемого сервера и уровня детализации, вы можете получить гораздо лучшее представление о фактическом успехе доставки.

например, если вы используете SmarterMail, вы можете написать простой парсер для чтения журнала smtp и отчета обратно в приложение. Не то, чтобы это не должна быть операция блокировки, как если бы ваш адрес электронной почты в сером списке, это может занять много минут, прежде чем это доставлен.

другой вариант-создать catch all "noreply" адрес электронной почты и отправить свои письма с идентификатором электронной почты, включенным в отправитель ie noreply-bounces-32432@bounces.mydomain.com и используйте POP3 reader для проверки входящих сообщений на наличие возвращенных писем. Используя идентификатор электронной почты в "отправителе", вы можете определить, какое письмо не удалось отправить. Вы также можете сделать некоторую фильтрацию, чтобы определить, является ли его ответ типа" невозможно доставить "или просто" вне офиса".

много вариантов доступный, как раз зависит сколько пота вы хотите положить в его.