为什么当 MailKit SmtpClient.Send() 失败时我没有收到异常?

Egg*_*der 0 .net c# smtp exception mailkit

当 MailKit SmtpClient.Send() 无法发送到无效电子邮件时,我想获取并处理异常。但它不会抛出任何异常。

我尝试故意发送到无效的电子邮件,看看是否可以捕获任何异常。MailKit SmtpClient 在发送失败时是否不会抛出任何异常?如果您想知道为什么我需要这个,是因为我想向客户端应用程序返回一条错误消息,指出某些电子邮件无效。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using MyProject.Backend.Models;
using MailKit.Net.Smtp;
using MimeKit;
using MimeKit.Text;

namespace MyProject.Backend.Helpers
{   
    public class SMTPHelper
    {

        SMTPSettings smtpSettings;

        public SMTPHelper(SMTPSettings smtpSettings)
        {
            this.smtpSettings = smtpSettings;
        }

        public List<string> Send(List<PreparedEmailModel> preparedEmails)
        {

            using (var emailClient = new SmtpClient())
            {
                var failedEmails = new List<string>();

                //The last parameter here is to use SSL (Which you should!)
                emailClient.Connect(smtpSettings.Host, 587);

                //Remove any OAuth functionality as we won't be using it. 
                emailClient.AuthenticationMechanisms.Remove("XOAUTH2");

                emailClient.Authenticate(smtpSettings.CredentialsUser, smtpSettings.CredentialsPassword);

                foreach (var preparedEmail in preparedEmails)
                {
                    var message = new MimeMessage();
                    message.From.Add(new MailboxAddress(preparedEmail.FromEmail));
                    message.To.Add(new MailboxAddress(preparedEmail.ToEmail));

                    message.Subject = preparedEmail.Subject;
                    //We will say we are sending HTML. But there are options for plaintext etc. 
                    message.Body = new TextPart(TextFormat.Html)
                    {
                        Text = preparedEmail.Body
                    };

                    try
                    {
                        emailClient.Send(message);
                    }
                    catch (Exception e)
                    {
                        failedEmails.Add(preparedEmail.ToEmail);
                    }
                }

                emailClient.Disconnect(true);
                return failedEmails;
            }

        }

    }
}
Run Code Online (Sandbox Code Playgroud)

预期:MailKit SmtpClient.Send() 在发送到无效电子邮件地址时应生成异常。

结果:即使尝试使用无效的虚构电子邮件地址,也不会引发异常。

mjw*_*lls 5

假设您去邮局。您将一个信封放入邮箱,地址不存在。

邮箱会不会把它回复给你,说它不存在?不。

邮局将其发送到某个地方,他们尝试将其交付,但失败了,最终它又回到了您手中。

电子邮件的工作原理基本相同。您在发送时不知道目标电子邮件地址是否合法。

因此,您的代码正在按预期工作。

如果您非常关心这些内容,则需要进行退回处理- 但退回可能会在几天后到达,或者永远不会到达。这不是一项小工作(我在一家专门从事此类事情的公司工作)。