如何使用asp.net核心在mailkit中获取电子邮件发送状态

问题描述 投票:0回答:2

我正在使用mailkit在asp.net core 2.0中实现电子邮件服务器。关于我的方案,我必须发送电子邮件,需要返回电子邮件发送状态的反馈。我已经实现了电子邮件发送部分,它工作正常。

我知道尝试捕获是一个选项。但这还不够我的情况。因为只有在网络错误或身份验证失败时才会发生异常。但如果某些接收方电子邮件无效,则不会发生异常。 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);
            }
        }      
asp.net-core smtpclient mailkit
2个回答
0
投票

MailKit的MessageSent在这里有一个很好的解释 - https://stackoverflow.com/a/48132905/1105937

TLDR:使用try / catch,它将告诉您消息是否已发送。

var IsEmailSent = false;

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

}  

您无法判断用户的电子邮件地址是否因隐私问题而存在,但发送该电子邮件的人将收到任何退回邮件。

如果您使用通用电子邮件地址(如[email protected])发送所有电子邮件,请将应用程序用户(发送电子邮件的人)添加为“回复”电子邮件,以便他们接收发生任何反弹的副本。


-1
投票

我们可以像这样得到MessageSent。它确认电子邮件是由smtp服务发送的。但是它没有返回电子邮件接收状态。

例如:我的smtp服务器是gmail,我正在向雅虎电子邮件地址发送电子邮件。使用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!");
          
        }
© www.soinside.com 2019 - 2024. All rights reserved.