SmtpClient.Send работает, но SmtpClient.SendMailAsync не работает на smtp.office365.com - PullRequest
0 голосов
/ 22 января 2019

Я разработал два метода: SendEmailBySmtp () и SendEmailAsyncBySmtp (), который использует SmtpClient.Send и SmtpClient.SendMailAsync соответственно.
В настоящее время первый метод работает, но второй - нет. Нет ошибки, но нет электронного письма.
Как я могу это исправить?

class Program
{
    static void Main(string[] args)
    {
        SendEmailBySmtp();
        SendEmailAsyncBySmtp();
    }

    static void SendEmailBySmtp()
    {
        MailMessage message = new MailMessage() 
        { 
            From = new MailAddress("test@example.com", "Test User"), 
            Subject = "Subject", 
            Body = "Body"
        };
        message.To.Add("test@example.com");
        message.CC.Add("test@example.com");
        message.BodyEncoding = UTF8Encoding.UTF8;
        message.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
        using (SmtpClient client = new SmtpClient())
        {
            client.Port = 587;
            client.Host = "smtp.office365.com";
            client.EnableSsl = true;
            client.UseDefaultCredentials = false;
            client.Credentials = new System.Net.NetworkCredential("test@example.com", "password");
            client.Send(message);
        }
    }

    static async Task SendEmailAsyncBySmtp()
    {
        MailMessage message = new MailMessage()
        {
            From = new MailAddress("test@example.com", "Test User"),
            Subject = "Subject",
            Body = "Body"
        };
        message.To.Add("test@example.com");
        message.CC.Add("test@example.com");
        message.BodyEncoding = UTF8Encoding.UTF8;
        message.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
        using (SmtpClient client = new SmtpClient())
        {
            client.Port = 587;
            client.Host = "smtp.office365.com";
            client.EnableSsl = true;
            client.UseDefaultCredentials = false;
            client.Credentials = new System.Net.NetworkCredential("test@example.com", "password");
            await client.SendMailAsync(message);
        }
    }
}

1 Ответ

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

Проблема в методе Main, который вы забыли дождаться второго вызова.Поскольку в основном методе вы не можете использовать ключевое слово await, вы должны вручную «ожидать» поток

Просто сделайте это, как показано ниже:

    static void Main(string[] args)
    {
        SendEmailBySmtp();
        SendEmailAsyncBySmtp().GetAwaiter().GetResult();
    }

И ответ на ваш вопрос: программазаканчивается до того, как SendMailAsync выполнит работу, поэтому операция отправки электронной почты останавливается перед отправкой.

...