Почему я не получаю исключения при сбое MailKit SmtpClient.Send ()? - PullRequest
0 голосов
/ 17 января 2019

Я хочу получать и обрабатывать исключения, когда 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 () должен генерировать исключение при отправке на недействительный адрес электронной почты.

Результат: исключений не выдается, даже если вы пытаетесь указать неверный адрес электронной почты.

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Существует разница между недействительным адресом и НЕ СУЩЕСТВУЮЩИМ (неправильным) адресом.

Если вы попытаетесь отправить электронное письмо на адрес, который не соответствует формату адреса электронной почты (XXX @ AnyDomain, например, XXX@gmail.com) MailKit выдаст исключение.

Если вы отправляете файл в правильном формате, но адрес указан неверно, MailKit не выдает никаких исключений

0 голосов
/ 17 января 2019

Допустим, вы идете на почту.Вы кладете конверт в почтовый ящик, адресованный несуществующему адресу.

Отвечает ли почтовый ящик на вас и говорит, что он не существует?Нет.

Почтовое отделение отправляет его куда-то, они пытаются доставить его, они терпят неудачу, и в конечном итоге оно возвращается к вам.

Электронная почта работает в основном точно так же.Вы не знаете во время отправки , является ли целевой адрес электронной почты законным или нет.

Таким образом, ваш код работает должным образом.

ЕслиВы глубоко заботитесь об этом, вам нужно выполнить обработку отказов - но отскок может прийти через несколько дней или никогда.Это не маленькая работа (я работаю в компании, которая специализируется на подобных вещах).

...