我正在使用mailkit在asp.net core 2.0中实现电子邮件服务器。关于我的方案,我必须发送电子邮件,需要返回电子邮件发送状态的反馈。我已经实现了电子邮件发送部分,它工作正常。
我知道尝试捕获是一个选项。但这还不够我的情况。因为只有在网络错误或身份验证失败时才会发生异常。但如果某些接收方电子邮件无效,则不会发生异常。
我必须为List.But中的每封电子邮件返回电子邮件发送状态。如果有无效的电子邮件或其他错误,我无法抓住它。
我看到一个名为MessageSent的事件。但我不知道实施该事件以及它是否符合我的条件。
这是我的完整代码。
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);
}
}
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])发送所有电子邮件,请将应用程序用户(发送电子邮件的人)添加为“回复”电子邮件,以便他们接收发生任何反弹的副本。
我们可以像这样得到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!");
}