Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 如何使用asp.net核心在mailkit中获取电子邮件发送状态_Asp.net Core_Smtpclient_Mailkit - Fatal编程技术网

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

Asp.net core 如何使用asp.net核心在mailkit中获取电子邮件发送状态,asp.net-core,smtpclient,mailkit,Asp.net Core,Smtpclient,Mailkit,我正在用mailkit在asp.NETCore2.0中实现电子邮件服务器。关于我的方案,我必须发送电子邮件,并需要返回电子邮件发送状态的反馈。我已经实现了电子邮件发送部分,它的工作良好 我知道试抓是唯一的选择,但这还不够我的处境。因为只有在网络错误或身份验证失败时才会发生异常。但如果某个收件人的电子邮件无效,则不会发生异常。 我必须为列表中的每封电子邮件返回电子邮件已发送状态。但如果有无效电子邮件或其他错误,我将无法捕获它 我看到一个叫做MessageSent的事件。但我不知道该怎么办,也不知

我正在用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; }
}这里对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属性包含服务器发送的实际响应,但它不太可能告诉您收件者电子邮件地址是否确实存在。