Как получить статус отправленной электронной почты в mailkit с ядром asp.net - PullRequest
0 голосов
/ 07 сентября 2018

Я внедряю почтовый сервер в asp.net core 2.0 с mailkit. Что касается моего сценария, мне нужно отправить электронное письмо, и мне нужно отправить отзыв с сообщением о статусе отправленного электронного письма. Я реализовал часть отправки электронного письма, и она работает нормально.

Я знаю попробуй поймать это один из вариантов. Но этого недостаточно в моей ситуации. Потому что исключение будет происходить только при сетевой ошибке или ошибке аутентификации . Но исключение не произойдет, если какой-то адрес электронной почты получателя будет неверным. enter image description here

Мне нужно возвращать статус отправленной электронной почты для каждой электронной почты в List.But. Если есть неправильная электронная почта или другая ошибка, я не могу ее перехватить.

Я видел событие под названием MessageSent . Но я не знаю, чтобы реализовать это событие и соответствует ли оно моему условию.

enter image description here

Это мой полный код.

  public void SendEmail(List<EmailMessage> emailMessages)
        {
            List<MimeMessage> emailQueue = new List<MimeMessage>();
            foreach (EmailMessage emailMessage in emailMessages)
            {
                var message = new MimeMessage();
                message.MessageId = emailMessage.MessageId;
                message.To.AddRange(emailMessage.ToAddresses.Select(x => new MailboxAddress(x.Name, x.Address)));
                message.From.AddRange(emailMessage.FromAddresses.Select(x => new MailboxAddress(x.Name, x.Address)));

                message.Subject = emailMessage.Subject;
               
                message.Body = new TextPart(TextFormat.Html)
                {
                    Text = emailMessage.Content
                };

                emailQueue.Add(message);
            }
           
            using (var emailClient = new SmtpClient())
            {                   
                emailClient.Connect(_emailConfiguration.SmtpServer, _emailConfiguration.SmtpPort, _emailConfiguration.EnableSSL);
               
                emailClient.AuthenticationMechanisms.Remove("XOAUTH2");

                emailClient.Authenticate(_emailConfiguration.SmtpUsername, _emailConfiguration.SmtpPassword);
                foreach (MimeMessage email in emailQueue)
                {
                    try
                    {
                         emailClient.Send(email);
                       
                    }
                    catch (Exception ex)
                    {
                        
                    }                       
                }
                emailClient.Disconnect(true);
            }
        }      

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

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

Например, мой SMTP-сервер - это Gmail, и я отправляю электронное письмо на адрес электронной почты Yahoo. Используя MessageSent , мы можем подтвердить, что электронная почта отправляется от клиента SMTP Gmail. Но мы не можем получить полученный статус электронной почты Yahoo.

                foreach (MimeMessage email in emailQueue)
                {
                    try
                    {                      
                        emailClient.MessageSent += OnMessageSent;   
                        emailClient.Send(email);                    
                    }
                    catch (Exception ex)
                    {
                    }
    }
------------------------------------------------------------------------------     
        void OnMessageSent(object sender, MessageSentEventArgs e)
        {
            Console.WriteLine("The message was sent!");
          
        }
0 голосов
/ 07 сентября 2018

Здесь есть хорошее объяснение MessageSent MailKit - https://stackoverflow.com/a/48132905/1105937

TLDR: используйте try / catch, так как он сообщит вам, отправлено сообщение или нет ..

var IsEmailSent = false;

try
{
    emailClient.Send(email);
    IsEmailSent = true;
}
catch (Exception ex)
{

}  

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

Если вы отправите все письма, используяуниверсальный адрес электронной почты, такой как do-not-reply@my-cool-app.com, затем добавьте пользователя приложения (человека, отправляющего электронное письмо) в качестве «ответа на» электронное письмо, чтобы они получали копию любых отскоков назад по мере их возникновения..

...