ASP.NET MVC 發送郵件(異步)

最近寫郵件發送搞死人了,最後的結果,真是醉了,現整理以下:服務器

網上一搜一大把,處處都是.NET發送郵件的方法,我這裏也大同小異的寫了一個。異步

準備一個MailHelper.cs通用類,以下所示:async

重要的命名空間:測試

using System.Net;
using System.Net.Mail;

其他代碼以下:ui

public void Send(string to, string subject, string content, string from, string name, string password)
{
    // 構造郵件體(按照常規構造便可)
    var mail = new MailMessage();
    mail.From = new MailAddress(from.Trim(), name.Trim(), Encoding.UTF8);
    mail.To.Add(new MailAddress(to.Trim()));
    mail.Subject = subject.Trim();
    mail.SubjectEncoding = Encoding.UTF8;
    mail.Body = content.Trim();
    mail.BodyEncoding = Encoding.UTF8;
    mail.IsBodyHtml = true;
    mail.Priority = MailPriority.Normal;

    // 構造SMTP服務器(很重要!!!)
    var client = new SmtpClient();
    client.UseDefaultCredentials = true;   // 在最終發送成功的代碼中,本屬性必須在 Credentials 以前賦值
    client.Credentials = new NetworkCredential(from, password);   // 本屬性必須在 UseDefaultCredentials 以後賦值
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.Host = "SMTP 服務器 IP 或 域名";
    client.Port = 25;   // 注意打開系統防火牆相應的端口
    //client.EnableSsl = true;   // 要看 SMTP 服務器是否支持
    client.SendCompleted += SMTPSendCompleted;   // 郵件發送完畢的回調方法

    try
    {
        client.SendAsync(mail, Guid.NewGuid());
    }
    catch (Exception e)
    { }
}

private void SMTPSendCompleted(object sender, AsyncCompletedEventArgs e)
{
    var result = string.Empty;

    if (e.Cancelled)
    {
        result = "已取消發送郵件";
    }
    else if (e.Error != null)
    {
        result = "失敗:" + e.UserState.ToString() + e.Error.Message;
    }
    else
    {
        result = "郵件發送成功";
    }

    // 記錄 result
}

上面就是一個發送郵件的通用類。阿里雲

特別須要注意的就是:在實例化 SMTP 服務器屬性的時候,順序很重要!!!spa

下面在頁面的 Controller 裏面寫具體調用的方法。code

注意,必定要採用異步的方式來發送,我這裏用的是 asyncawait 方式來寫(採用這個方式來寫,至少在頁面上就不用添加 async = true 等代碼了,其它多的就不說了)具體的 Action 代碼以下:orm

public async Task<ActionResult> SendEmail()
{
    ViewBag.Title = "發送郵件";

    // 異步發送郵件
    await Task.Run(() => { new MailHelper().SendByAccount("{收件人郵箱地址}", "測試郵件標題", "測試郵件內容,測試郵件內容"); });

    return View();
}

至此,郵件發送的所有功能就實現了,而且已經成功發送了。blog

網上處處都有,可是都沒有提到 SMTP 服務屬性賦值時有順序的問題,不知道是否是個人代碼有問題,纔會有順序的問題,這裏先記錄下來,後面再看吧。

總之,我是在本機上和服務器上面測試經過了。

開發環境:Win 7 Pro 64(本機)+ VS2013 + .NET Framework 4.6 + MVC 5.2.3.0

發佈環境:Win 2008 R2 SP1 Ent(服務器)+ IIS + .NET Framework 4.6

SMTP:阿里雲郵(原萬網企業郵件)

收件人:16三、qq、sina、gmail,所有測試成功!

相關文章
相關標籤/搜索