为什么当 MailKit SmtpClient.Send() 失败时我没有得到异常?
Why do I not get exceptions when MailKit SmtpClient.Send() fails?
我想在 MailKit SmtpClient.Send() 无法发送到无效电子邮件时获取并处理异常。但它不会抛出任何异常。
我曾尝试故意发送到无效的电子邮件,以查看是否可以捕获任何异常。 MailKit SmtpClient 在发送失败时是否不会抛出任何异常?如果您想知道我为什么需要这个,是因为我想 return 向客户端应用程序发送一条错误消息,指出某些电子邮件无效。
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;
}
}
}
}
预期:MailKit SmtpClient.Send() 应该在发送到无效电子邮件地址时生成异常。
结果:即使尝试使用无效的伪造电子邮件地址也不会引发异常。
假设您去 post 办公室。你在邮箱里放了一个信封,寄往一个不存在的地址。
邮箱给你回拍,说不存在?编号
post 办公室将它发送到某个地方,他们尝试交付它,但失败了,最终它还给了你。
电子邮件 basically 的工作方式相同。您不知道在发送时目标电子邮件地址是否合法。
因此,您的代码按预期工作。
如果您非常关心这些东西,您需要做 bounce processing - 但反弹可能会在几天后到来,或者永远不会到来。这不是个小活儿(我在一家专门做那种事的公司工作)。
无效地址和不存在(错误)地址之间存在差异。
如果您将尝试向不符合电子邮件地址格式的地址发送电子邮件
(XXX@AnyDomain 例如 XXX@gmail.com)MailKit 会抛出异常。
如果您发送的格式正确但地址错误,MailKit 不会抛出任何异常
我想在 MailKit SmtpClient.Send() 无法发送到无效电子邮件时获取并处理异常。但它不会抛出任何异常。
我曾尝试故意发送到无效的电子邮件,以查看是否可以捕获任何异常。 MailKit SmtpClient 在发送失败时是否不会抛出任何异常?如果您想知道我为什么需要这个,是因为我想 return 向客户端应用程序发送一条错误消息,指出某些电子邮件无效。
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;
}
}
}
}
预期:MailKit SmtpClient.Send() 应该在发送到无效电子邮件地址时生成异常。
结果:即使尝试使用无效的伪造电子邮件地址也不会引发异常。
假设您去 post 办公室。你在邮箱里放了一个信封,寄往一个不存在的地址。
邮箱给你回拍,说不存在?编号
post 办公室将它发送到某个地方,他们尝试交付它,但失败了,最终它还给了你。
电子邮件 basically 的工作方式相同。您不知道在发送时目标电子邮件地址是否合法。
因此,您的代码按预期工作。
如果您非常关心这些东西,您需要做 bounce processing - 但反弹可能会在几天后到来,或者永远不会到来。这不是个小活儿(我在一家专门做那种事的公司工作)。
无效地址和不存在(错误)地址之间存在差异。
如果您将尝试向不符合电子邮件地址格式的地址发送电子邮件 (XXX@AnyDomain 例如 XXX@gmail.com)MailKit 会抛出异常。
如果您发送的格式正确但地址错误,MailKit 不会抛出任何异常