后台发送电子邮件的任务

时间:2014-03-08 18:57:35

标签: c# asp.net asp.net-mvc email

MVC 5.1,.NET 4.5

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

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

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

基本上,出于性能原因,我是否可以发送非阻止电子邮件。

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

2 个答案:

答案 0 :(得分:3)

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

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

将指定的消息发送到SMTP服务器以作为异步操作

进行传递

答案 1 :(得分:2)

调用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;
    }