Asp.net core 如何使用asp.net核心在mailkit中获取电子邮件发送状态
我正在用mailkit在asp.NETCore2.0中实现电子邮件服务器。关于我的方案,我必须发送电子邮件,并需要返回电子邮件发送状态的反馈。我已经实现了电子邮件发送部分,它的工作良好 我知道试抓是唯一的选择,但这还不够我的处境。因为只有在网络错误或身份验证失败时才会发生异常。但如果某个收件人的电子邮件无效,则不会发生异常。 我必须为列表中的每封电子邮件返回电子邮件已发送状态。但如果有无效电子邮件或其他错误,我将无法捕获它 我看到一个叫做MessageSent的事件。但我不知道该怎么办,也不知道这是否符合我的条件 这是我的全部代码 公共void sendmaillist emailMessages { List emailQueue=新列表; 电子邮件中的foreach EmailMessage EmailMessage { var message=新的mimessage; message.MessageId=emailMessage.MessageId; message.To.addRangeMailMessage.toAddresss.Selectx=>new MailboxAddressx.Name,x.Address; message.From.addRangeMailMessage.FromAddresses.Selectx=>new MailboxAddressx.Name,x.Address; message.Subject=emailMessage.Subject; message.Body=new TextPartTextFormat.Html { Text=emailMessage.Content }; emailQueue.Addmessage; } 使用var emailClient=new SmtpClient { emailClient.Connect\u emailConfiguration.SmtpServer、\u emailConfiguration.SmtpPort、\u emailConfiguration.EnableSSL; emailClient.AuthenticationMechaniss.RemoveXOAUTH2; emailClient.Authenticate\u emailConfiguration.SmtpUsername、\u emailConfiguration.SmtpPassword; 电子邮件队列中的每封MIMessage电子邮件 { 尝试 { emailClient.sendmail; } 捕获异常 { } } emailClient.Disconnecttrue; }Asp.net core 如何使用asp.net核心在mailkit中获取电子邮件发送状态,asp.net-core,smtpclient,mailkit,Asp.net Core,Smtpclient,Mailkit,我正在用mailkit在asp.NETCore2.0中实现电子邮件服务器。关于我的方案,我必须发送电子邮件,并需要返回电子邮件发送状态的反馈。我已经实现了电子邮件发送部分,它的工作良好 我知道试抓是唯一的选择,但这还不够我的处境。因为只有在网络错误或身份验证失败时才会发生异常。但如果某个收件人的电子邮件无效,则不会发生异常。 我必须为列表中的每封电子邮件返回电子邮件已发送状态。但如果有无效电子邮件或其他错误,我将无法捕获它 我看到一个叫做MessageSent的事件。但我不知道该怎么办,也不知
}这里对MailKit发送的消息有很好的解释- TLDR:使用try/catch,因为它会告诉您消息是否已发送
var IsEmailSent = false;
try
{
emailClient.Send(email);
IsEmailSent = true;
}
catch (Exception ex)
{
}
由于隐私问题,您无法判断用户的电子邮件地址是否不存在,但发送电子邮件的人将收到任何回复消息
如果您使用通用电子邮件地址发送所有电子邮件,如不要-reply@my-cool-app.com然后将应用程序用户添加到发送电子邮件作为电子邮件回复的人,这样他们将在发生任何反弹时收到一份副本。我们可以这样发送邮件。确认电子邮件是通过smtp服务发送的。但不会返回电子邮件接收状态
我的smtp服务器是gmail,我正在向雅虎的电子邮件地址发送电子邮件。使用MessageSent,我们可以确认电子邮件是从smtp gmail客户端发送的。但我们无法获取yahoo电子邮件的接收状态
电子邮件队列中的每封MIMessage电子邮件
{
尝试
{
emailClient.MessageSent+=OnMessageSent;
emailClient.sendmail;
}
捕获异常
{
}
}
---------------------------------------
在MessageSentObject发送者、MessageSentEventArgs e上无效
{
Console.WriteLine消息已发送!;
} 您需要重写GetDeliveryStatusNotifications类,如下所示:
using MailKit;
using MailKit.Net.Smtp;
using MimeKit;
using System;
using System.Collections.Generic;
namespace YourProject
{
public class CustomSmtpClient : SmtpClient
{
protected override DeliveryStatusNotification? GetDeliveryStatusNotifications(MimeMessage message, MailboxAddress mailbox)
{
if (!(message.Body is MultipartReport report) || report.ReportType == null || !report.ReportType.Equals("delivery-status", StringComparison.OrdinalIgnoreCase))
return default;
report.OfType<MessageDeliveryStatus>().ToList().ForEach(x => {
x.StatusGroups.Where(y => y.Contains("Action") && y.Contains("Final-Recipient")).ToList().ForEach(z => {
switch (z["Action"])
{
case "failed":
Console.WriteLine("Delivery of message {0} failed for {1}", z["Action"], z["Final-Recipient"]);
break;
case "delayed":
Console.WriteLine("Delivery of message {0} has been delayed for {1}", z["Action"], z["Final-Recipient"]);
break;
case "delivered":
Console.WriteLine("Delivery of message {0} has been delivered to {1}", z["Action"], z["Final-Recipient"]);
break;
case "relayed":
Console.WriteLine("Delivery of message {0} has been relayed for {1}", z["Action"], z["Final-Recipient"]);
break;
case "expanded":
Console.WriteLine("Delivery of message {0} has been delivered to {1} and relayed to the the expanded recipients", z["Action"], z["Final-Recipient"]);
break;
}
});
});
return default;
}
}
}
我认为foreach循环中的try-catch块只会增加不必要的开销。“地址未找到”错误很可能是因为您发送到了错误的地址,而不是因为它不是sent@JohanHerstad是否有任何方法获取电子邮件接收状态。。?因为我必须返回每封电子邮件的状态。其他链接的答案根本无法解释如何获取邮件的已发送状态。@cdonner虽然MessageSentEventArgs.Response属性包含服务器发送的实际响应,但它不太可能告诉您收件者电子邮件地址是否确实存在。