代码之家  ›  专栏  ›  技术社区  ›  akkapolk

smtpclient.send正在工作,但smtpclient.sendmailasync在smtp.office365.com上不工作。

  •  0
  • akkapolk  · 技术社区  · 5 年前

    我开发了两种方法:sendmailbysmtp()和sendmailasyncbysmtp(),分别使用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 回复  |  直到 5 年前
        1
  •  1
  •   Piotr Stapp    5 年前

    问题出在 Main 方法忘记等待第二个调用。因为在主方法中不能使用wait关键字,所以必须手动“wait”线程

    只需如下操作:

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

    你的问题的答案是:程序在 SendMailAsync 做这项工作,这样在发送电子邮件之前就停止了发送操作。