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;   // 在最终发送成功的代码中,本属性(UseDefaultCredentials)必须在 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,全部测试成功!

时间: 2024-10-07 13:18:09

ASP.NET MVC 发送邮件(异步)的相关文章

ASP.NET MVC 4 异步加载控制器

ASP.NET 4 Developer preview中的异步操纵器 在放弃了对.NET 3的支持之后, ASP.NET MVC 4 彻底拥抱了Task类库, 你不需求再蛋疼的给每个Action写两个方法, 也无需傻傻的手动对异步Action计数器增减了(AsyncManager.OutstandingOperations.Increment()), 现在的你只需拿起手指, 轻轻敲几下, 其他的事情都由系统帮你完成. public class PortalController : AsyncCo

ASP.NET MVC 文件异步上传问题处理

最近在做一个网站,用asp.net MVC4.0来开发,今天遇到了个小问题,通过查找相关渠道解决了,在这里把这个问题写出来,问题非常简单,不喜勿喷,mark之希望可以给遇到相同问题的初学者一点帮助.我要实现文件的异步上传,前端提交的文件后台老是获取不到.我前端是这样写的: @using (Ajax.BeginForm("UpdateNewInfo", "Home", new AjaxOptions() { HttpMethod = "post",

asp.net mvc发送邮件

参考文献: 第一篇:http://www.cnblogs.com/qinpengming/archive/2011/06/08/2075040.html 第二篇:http://www.cnblogs.com/XuebinDing/archive/2012/03/27/2419497.html 第三篇:http://jingyan.baidu.com/article/0f5fb099dffe7c6d8334ea31.html (qq邮箱开启smtp服务的步骤) 第四篇:http://bbs.csd

asp.net mvc 微软异步请求

public ActionResult GetDateTime(string userName,int age) { System.Threading.Thread.Sleep(2000); return Content(DateTime.Now.ToString() + userName + age); } public ActionResult MicroSoftAjax() { return View(); } @{ Layout = null; } <!DOCTYPE html> &l

全网最全ASP.NET MVC 教程汇总

全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从Why,What,How三个角度整理MVC 的学习资源,让学习者第一时间找到最有价值的文章,获取最彻底的ASp.NET MVC 框架知识,Let’s go! 1. Why :为什么需要ASP.NET MVC 本章主要为大家汇总了为什么学习Asp.net MV

自学MVC看这里——全网最全ASP.NET MVC 教程汇总(转)

自学MVC看这里——全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从Why,What,How三个角度整理MVC 的学习资源,让学习者第一时间找到最有价值的文章,获取最彻底的ASp.NET MVC 框架知识,Let’s go! 1. Why :为什么需要ASP.NET MVC 本章主要为大家汇总了为什么学习

ASP.NET MVC 教程汇总

自学MVC看这里——全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从Why,What,How三个角度整理MVC 的学习资源,让学习者第一时间找到最有价值的文章,获取最彻底的ASp.NET MVC 框架知识,Let’s go! 1. Why :为什么需要ASP.NET MVC 本章主要为大家汇总了为什么学习

取经——ASP.NET MVC Ajax

一直对ASP.NET MVC 的异步提交搞不懂,今天决定一探究竟. 其实核心都封装在jquery.unobtrusive-ajax.js里. 我们发现所有的代码都放在了(function($){}(jQuery))里,这个结构很奇妙,一般的js函数都是function(){},可这个后面多了个参数,其实说白了这是个匿名方法,我们一点点还原它的真实面目. 我们可以写成这样(function($){})(jQuery), 我们再把function方法拿出来 function aa($){ } aa(

自学MVC看这里——全网最全ASP.NET MVC 教程汇总

MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从Why,What,How三个角度整理MVC 的学习资源,让学习者第一时间找到最有价值的文章,获取最彻底的ASp.NET MVC 框架知识,Let’s go! 1. Why :为什么需要ASP.NET MVC 本章主要为大家汇总了为什么学习Asp.net MVC替代WebForms,产生ASP.NET