Amar P Sutar Ответов: 2

Как получить статус отправленных по электронной почте, используя ASP.NET в MVC


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

как я мог это сделать?

Что я уже пробовал:

общих асинхронных статических задач SendEmailAsync(строка электронной почты, строки, строку сообщения)
{
пробовать
{
ВАР _email = "xyz@gmail.com";
ВАР _epass = "фрд";
ВАР _displayname = "тестовое сообщение";
MailMessage mymessage = новый MailMessage();
мое сообщение.Для.Добавить(по электронной почте);
// mymessage.Конечную=письмо;
мое сообщение.From = новый почтовый адрес(_email, _displayname);
мое сообщение.Субъект = субъект;
мое сообщение.Тело = сообщение;
мое сообщение.DeliveryNotificationOptions = DeliveryNotificationOptions.Onsuccess процедуры;

мое сообщение.IsBodyHtml = true;
использование (SmtpClient smtp = new SmtpClient()) {
протокол SMTP.EnableSsl = true в;
протокол SMTP.Хозяин = "smtp.gmail.com";
протокол SMTP.Порт = 587;
протокол SMTP.UseDefaultCredentials = false;
протокол SMTP.Учетные данные = новый а networkcredential(_email,_epass);
протокол SMTP.DeliveryMethod = SmtpDeliveryMethod.Сеть;
протокол SMTP.SendCompleted += (ы, е) =&ГТ; { протокол SMTP.Распоряжаться(); };
ожидание smtp.SendMailAsync(mymessage);


}
}
поймать (SmtpFailedRecipientsException экс){
бросок экс;
}
}

F-ES Sitecore

Как вы определяете, что такое успех и что такое неудача?

Richard Deeming

catch (SmtpFailedRecipientsException ex){
    throw ex;
}
Не делай этого. Вы только что уничтожили трассировку стека исключения.

Если вам действительно нужно повторно создать исключение, просто используйте throw; вместо throw ex;.

Но в этом случае, поскольку вы ничего не делаете с исключением, которое вы поймали, просто удалите try..catch блок вообще.

2 Ответов

Рейтинг:
19

Dave Kreskowiak

Это зависит от того, что вы подразумеваете под "проверкой состояния электронной почты".

Вы можете получить статус сообщения электронной почты, отправленного на ваш локальный почтовый сервер, чтобы его можно было отправить. Вы действительно должны использовать синхронную версию SendMail, так как кажется, что вы пытаетесь сделать это в задаче. Эта задача может сделать операцию асинхронной отдельно от вызова SendMailAsync, и тогда вы сможете получить статус обратно без использования обработчика событий.

После того как сообщение успешно отправлено на почтовый сервер, указанный в файле smtp.Host, вы не сможете узнать, действительно ли предполагаемый получатель получил это письмо.


Richard Deeming

"Вы действительно должны использовать синхронную версию SendMail, так как кажется, что вы пытаетесь сделать это в задаче."

Почему? SendMailAsync[^] специально предназначен для использования в пределах async метод. ОП просто нужно использовать using блок вместо обработчика событий для удаления SmtpClient.

Dave Kreskowiak

Моя вина. Я просто снова посмотрел на код. Я думал, что он раскручивает задачу только для того, чтобы настроить и дождаться другой задачи, возвращенной smtp.SendMailAsync.

Рейтинг:
1

Hussain Mustafa1

Пожалуйста, обновите блок catch с помощью кода, приведенного ниже,

catch (SmtpFailedRecipientsException ex)
       {
           for (int i = 0; i < ex.InnerExceptions.Length; i++)
           {
               SmtpStatusCode status = ex.InnerExceptions[i].StatusCode;
               if (status == SmtpStatusCode.MailboxBusy ||
                   status == SmtpStatusCode.MailboxUnavailable)
               {
                   Console.WriteLine("Delivery failed - retrying in 5 seconds.");
                   System.Threading.Thread.Sleep(5000);
                   client.Send(message);
               }
               else
               {
                   Console.WriteLine("Failed to deliver message to {0}",
                       ex.InnerExceptions[i].FailedRecipient);
               }
           }
       }


Richard Deeming

Thread.Sleep это не очень хороший выбор в рамках async метод. Вы должны использовать await Task.Delay(...); вместо.

Кроме того, эти Console.WriteLine звонки не принесут много пользы в течение часа. ASP.NET применение.