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


最近寫郵件發送搞死人了,最后的結果,真是醉了,現整理如下:

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

准備一個MailHelper.cs通用類,如下所示:

重要的命名空間:

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

其余代碼如下:

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 服務器屬性的時候,順序很重要!!!

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

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

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

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

    return View();
}

至此,郵件發送的全部功能就實現了,並且已經成功發送了。

網上到處都有,但是都沒有提到 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:阿里雲郵(原萬網企業郵件)

收件人:163、qq、sina、gmail,全部測試成功!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM