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 = ; // 注意打开系统防火墙相应的端口
//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 里面写具体调用的方法。
注意,一定要采用异步的方式来发送,我这里用的是 async 和 await 方式来写(采用这个方式来写,至少在页面上就不用添加 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,全部测试成功!
ASP.NET MVC 发送邮件(异步)的更多相关文章
- ASP.NET MVC 4 异步加载控制器
ASP.NET 4 Developer preview中的异步操纵器 在放弃了对.NET 3的支持之后, ASP.NET MVC 4 彻底拥抱了Task类库, 你不需求再蛋疼的给每个Action写两个 ...
- ASP.NET MVC 文件异步上传问题处理
最近在做一个网站,用asp.net MVC4.0来开发,今天遇到了个小问题,通过查找相关渠道解决了,在这里把这个问题写出来,问题非常简单,不喜勿喷,mark之希望可以给遇到相同问题的初学者一点帮助.我 ...
- Asp.Net MVC part4 异步、校验、区域Area
异步方式1:使用jquery的异步函数方式2:使用MVC的AjaxHelper行为的返回值设置:JsonResult对象,使用Json方法接收一个对象,在内部会完成对象的js序列化,向输出流中输出js ...
- asp.net mvc发送邮件
参考文献: 第一篇:http://www.cnblogs.com/qinpengming/archive/2011/06/08/2075040.html 第二篇:http://www.cnblogs. ...
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总
MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从 ...
- ASP.NET MVC 教程汇总
自学MVC看这里——全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要 ...
- 全网最全ASP.NET MVC 教程汇总
全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MV ...
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总(转)
自学MVC看这里——全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要 ...
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总【转】
自学MVC看这里——全网最全ASP.NET MVC 教程汇总 http://www.cnblogs.com/powertoolsteam/archive/2015/08/13/4667892.html ...
随机推荐
- Nested Loops join时显示no join predicate原因分析以及解决办法
本文出处:http://www.cnblogs.com/wy123/p/6238844.html 最近遇到一个存储过程在某些特殊的情况下,效率极其低效, 至于底下到什么程度我现在都没有一个确切的数据, ...
- Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)
之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...
- Android中Fragment的两种创建方式
fragment是Activity中用户界面的一个行为或者是一部分.你可以在一个单独的Activity上把多个Fragment组合成为一个多区域的UI,并且可以在多个Activity中再使用.你可以认 ...
- 如何理解MySQL中auto_increment?
1.auto_increment用于主键自动增长.比如从1开始增长,当把第一条数据删除,再插入第二条数据时,主键值为2,不是1.
- linux下 lvm 磁盘扩容
打算给系统装一个oracle,发现磁盘空间不足.在安装系统的时候我选择的是自动分区,系统就会自动以LVM的方式分区.为了保证系统后期的可用性,建议所有新系统安装都采用LVM,之后生产上的设备我也打算这 ...
- 跟Unity3D学代码优化
今天我们来聊聊如何跟Unity学代码优化,准确地说,是通过学习Unity的IL2CPP技术的优化策略,应用到我们的日常逻辑开发中. 做过Unity开发的同学想必对IL2CPP都很清楚,简单地说,IL2 ...
- docker创建私有仓库
由于网速和大中华局域网效果,使得我们在DockerHub下载镜像的速度很慢,甚至一些国内的镜像仓库,也感觉速度不是很好.所以,很有必要在本地或者一个我们访问很快速的地方(自己的云服务器)搭建一套镜像仓 ...
- 最全的Windows Azure学习教程汇总
Windows Azure 是微软基于云计算的操作系统,能够为开发者提供一个平台,帮助开发可运行在云服务器.数据中心.Web 和 PC 上的应用程序. Azure 是一种灵活和支持互操作的平台,能够将 ...
- (实例篇)php 使用redis锁限制并发访问类示例
1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功. 例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制 ...
- jquery ajax解析
jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对 ...