最近写邮件发送搞死人了,最后的结果,真是醉了,现整理如下:

网上一搜一大把,到处都是.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 里面写具体调用的方法。

注意,一定要采用异步的方式来发送,我这里用的是 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,全部测试成功!

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

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

    ASP.NET 4 Developer preview中的异步操纵器 在放弃了对.NET 3的支持之后, ASP.NET MVC 4 彻底拥抱了Task类库, 你不需求再蛋疼的给每个Action写两个 ...

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

    最近在做一个网站,用asp.net MVC4.0来开发,今天遇到了个小问题,通过查找相关渠道解决了,在这里把这个问题写出来,问题非常简单,不喜勿喷,mark之希望可以给遇到相同问题的初学者一点帮助.我 ...

  3. Asp.Net MVC part4 异步、校验、区域Area

    异步方式1:使用jquery的异步函数方式2:使用MVC的AjaxHelper行为的返回值设置:JsonResult对象,使用Json方法接收一个对象,在内部会完成对象的js序列化,向输出流中输出js ...

  4. asp.net mvc发送邮件

    参考文献: 第一篇:http://www.cnblogs.com/qinpengming/archive/2011/06/08/2075040.html 第二篇:http://www.cnblogs. ...

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

    MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从 ...

  6. ASP.NET MVC 教程汇总

    自学MVC看这里——全网最全ASP.NET MVC 教程汇总   MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要 ...

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

    全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MV ...

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

    自学MVC看这里——全网最全ASP.NET MVC 教程汇总   MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要 ...

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

    自学MVC看这里——全网最全ASP.NET MVC 教程汇总 http://www.cnblogs.com/powertoolsteam/archive/2015/08/13/4667892.html ...

随机推荐

  1. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

  2. Android数据加密之SHA安全散列算法

    前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好 ...

  3. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  4. LoadRunner函数百科叒叒叒更新了!

    首先要沉痛通知每周四固定栏目[学霸君]由于小编外派公干,本周暂停. 那么这周就由云层君来顶替了,当然要要说下自己做的内容啦,DuangDuang! <LoadRunner函数百科>更新通知 ...

  5. c# 字符串连接使用“+”和string.format格式化两种方式

    参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...

  6. Collection集合

    一些关于集合内部算法可以查阅这篇文章<容器类总结>. (Abstract+) Collection 子类:List,Queue,Set 增: add(E):boolean addAll(C ...

  7. 移动应用App测试与质量管理一

    测试工程师 基于Html的WebApp测试, 现在一些移动App混Html5 HTML5性能测试 兼容性 整理后的脑图 测试招聘 弱化大量技术考察 看重看问题的高度 看重潜力 测试经验 质量管理 专项 ...

  8. AFNetworking报错"_UTTypeCopyPreferredTagWithClass", referenced from: _AFContentTypeForPathExtens

    问题: 在和Unity交互的过程中,从Unity开发工具打包出来的项目文件,在添加AFNetworking库,运行时报出以下错误: Undefined symbols for architecture ...

  9. OpenGL shader 中关于顶点坐标值的思考

    今天工作中需要做一个事情: 在shader内部做一些空间距离上的计算,而且需要对所有的点进行计算,符合条件的显示,不符合条件的点不显示. 思路很简单,在vertex shader内知道顶点坐标,进行计 ...

  10. 归并排序的java实现

    归并排序的优点不说了. 做归并排序之前,我先试着将两个有序数组进行排序,合并成一个有序数组. 思路:定义好两个有序数组,理解的时候我先思考了数组只有一个数组的排序,然后是两个元素的数组的排序,思路就有 ...