代码之家  ›  专栏  ›  技术社区  ›  Ian Vink

发送电子邮件的后台任务

  •  1
  • Ian Vink  · 技术社区  · 10 年前

    MVC 5.1,.NET 4.5

    在我们的简单网站中,我们需要发送电子邮件。我们的电子邮件服务由Post-back事件调用,它发送电子邮件,然后构建结果页面并返回。

    这会减慢页面速度,因为页面必须等待发送同步电子邮件。

    如果我们在不同的线程中运行电子邮件,网站是否可以继续创建页面并在处理电子邮件时将其返回给用户,或者长时间运行的任务会导致页面无法呈现。

    基本上,出于性能原因,我可以发送电子邮件吗。

    注意:我们无法将电子邮件请求发送到服务或其他系统。

    2 回复  |  直到 10 年前
        1
  •  3
  •   dkozl    10 年前

    假设您使用内置 SmtpClient 你可以使用 SmtpClient.SendMailAsync 方法

    smtpClient.SendMailAsync(new MailMessage{ ... });
    

    将指定的邮件发送到SMTP服务器以作为异步操作传递

        2
  •  3
  •   Hadi Sharifi    10 年前

    调用StartNew在功能上等同于使用任务的一个构造函数创建任务,然后调用task.Start方法来计划任务的执行。

    Task.Factory.StartNew(() => {
             //do somethings
    });
    

    例子:

    Task.Factory.StartNew(() => {
             SendMail("Hello world", "email@yahoo.com", "TEST");
    });
    
    public static bool SendMail(string subject, string to, string body)
        {
            string fromMailAddress = ConfigurationManager.AppSettings["MailAddress"];
            string fromMailPassword = ConfigurationManager.AppSettings["MailPassword"];
            string fromMailName = ConfigurationManager.AppSettings["MailName"];
    
            var networkConfig = new NetworkCredential(fromMailAddress, fromMailPassword);
            var mailServer = new SmtpClient()
            {
                Host = ConfigurationManager.AppSettings["SmtpHost"],
                UseDefaultCredentials = false,
                Credentials = networkConfig
            };
            if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["SmtpPort"]))
                mailServer.Port = Convert.ToInt32(ConfigurationManager.AppSettings["SmtpPort"]);
    
            var message = new MailMessage()
            {
                Subject = subject,
                SubjectEncoding = Encoding.UTF8,
                IsBodyHtml = true,
                BodyEncoding = Encoding.UTF8,
            };
    
            //message send config
            message.To.Add(new MailAddress(to));
            message.From = new MailAddress(fromMailAddress, fromMailName);
            message.Body = body;
    
            try
            {
                mailServer.SendAsync(message, null);
            }
            catch (Exception ex)
            {
                return false;
            }
    
            return true;
        }