Почему я не получаю исключения при сбое MailKit SmtpClient.Send()?
Я хочу получать и обрабатывать исключения, когда MailKit SmtpClient.Send() не удается отправить на недействительный адрес электронной почты. Но это не бросает никаких исключений.
Я попытался отправить на недействительный адрес электронной почты специально, чтобы посмотреть, смогу ли я поймать какие-либо исключения. Разве MailKit SmtpClient просто не выдает никаких исключений при неудачной отправке? Если вам интересно, зачем мне это нужно, я хочу вернуть клиентскому приложению сообщение об ошибке, что некоторые электронные письма были недействительными.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Hjarnkraft.Backend.Models;
using MailKit.Net.Smtp;
using MimeKit;
using MimeKit.Text;
namespace Hjarnkraft.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() должен генерировать исключение при отправке на недействительный адрес электронной почты.
Результат: исключений не выдается, даже если вы пытаетесь указать неверный адрес электронной почты.
1 ответ
Допустим, вы идете на почту. Вы кладете конверт в почтовый ящик, адресованный на несуществующий адрес.
Почтовый ящик стреляет в тебя и говорит, что его не существует? Нет.
Почта отправляет его куда-то, они пытаются доставить его, они терпят неудачу, и в конце концов он возвращается к вам.
Электронная почта работает в основном так же. Вы не знаете во время отправки, является ли целевой адрес электронной почты законным или нет.
Таким образом, ваш код работает как положено.
Если вам глубоко небезразличны эти вещи, вам нужно выполнить обработку отказов, но отскок может прийти через несколько дней или никогда. Это не маленькая работа (я работаю в компании, которая специализируется на таких вещах).
Существует разница между недействительным адресом и несуществующим (неправильным) адресом.
Если вы попытаетесь отправить электронное письмо на адрес, который не соответствует формату адреса электронной почты (XXX@AnyDomain, например, XXX@gmail.com), MailKit выдаст исключение.
Если вы отправляете файл в правильном формате, но адрес указан неверно, MailKit не выдает никаких исключений