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 ...
随机推荐
- ASP.NET MVC5+EF6+EasyUI 后台管理系统 (源码购买说明)
系列目录 升级日志 !!!重大版本更新:于2016-12-20日完成了系统的结构重构并合并简化了T4(这是一次重要的更新,不需要修改现有功能的代码),代码总行数比上个版本又少了1/3.更新了代码生成器 ...
- [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...
- UWP开发必备:常用数据列表控件汇总比较
今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...
- 关于Raid0,Raid1,Raid5,Raid10的总结
RAID0 定义: RAID 0又称为Stripe或Striping,它代表了所有RAID级别中最高的存储性能.RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就 ...
- 马里奥AI实现方式探索 ——神经网络+增强学习
[TOC] 马里奥AI实现方式探索 --神经网络+增强学习 儿时我们都曾有过一个经典游戏的体验,就是马里奥(顶蘑菇^v^),这次里约奥运会闭幕式,日本作为2020年东京奥运会的东道主,安倍最后也已经典 ...
- Kooboo CMS技术文档之四:Kooboo CMS的站点组成部分
Kooboo CMS本着功能独立分离的原则,将站点分为三部分组成:用户管理,站点管理和内容数据库管理.各个功能之间既可独立使用,也可以容易组成在一起形成一个完整的系统. 用户管理 管理整个系统内的用户 ...
- Collection集合
一些关于集合内部算法可以查阅这篇文章<容器类总结>. (Abstract+) Collection 子类:List,Queue,Set 增: add(E):boolean addAll(C ...
- java中易错点(二)
java,exe是java虚拟机 javadoc.exe用来制作java文档 jdb.exe是java的调试器 javaprof,exe是剖析工具 解析一: sleep是线程类(Thread)的方法, ...
- Function.prototype.toString 的使用技巧
Function.prototype.toString这个原型方法可以帮助你获得函数的源代码, 比如: function hello ( msg ){ console.log("hello& ...
- 2DToolkit官方文档中文版打地鼠教程(二):设置摄像机
这是2DToolkit官方文档中 Whack a Mole 打地鼠教程的译文,为了减少文中过多重复操作的翻译,以及一些无必要的句子,这里我假设你有Unity的基础知识(例如了解如何新建Sprite等) ...