PS: 为了弥补上篇博客的不足,正好周六闲着没事。所以进行优化下,来个终结版

功能实现:模板发送+自指定邮箱发送+解耦

总体预览如下:

各代码如下:(代码略多,所以都折叠了)

前台;

  1. @{
  2. Layout = null;
  3. }
  4.  
  5. <!DOCTYPE html>
  6.  
  7. <html>
  8. <head>
  9. <meta name="viewport" content="width=device-width" />
  10. <title>Index</title>
  11. </head>
  12. <body>
  13. <div>
  14. 请输入您的邮箱:<input type="text" id="email" /> <input type="button" value="获取验证码" id="getYZM" /><br />
  15. 返回信息:<input type="text" id="yzm" />
  16. </div>
  17. </body>
  18. </html>
  19. <script src="~/Scripts/jquery-1.8.2.min.js"></script>
  20. <script>
  21. $("#getYZM").click(function () {
  22. var emailName = $("#email").val().trim();
  23. if (emailName.length <= ) {
  24. alert("请输入邮箱"); return;
  25. }
  26. $.post('@Url.Action("SendYanZhengMa","Home")', { recEmail: emailName }, function (_data) {
  27. if (_data=="no") {
  28. alert("发送失败!");
  29. } else {
  30. $("#yzm").val(_data);
  31. }
  32. })
  33. });
  34. </script>

后台;(简单调用Helper类轻松搞定,哈哈)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.Specialized;
  4. using System.Linq;
  5. using System.Web;
  6. using System.Web.Mvc;
  7. using 发送邮件ZJ.Helpers;
  8.  
  9. namespace 发送邮件ZJ.Controllers
  10. {
  11. public class HomeController : Controller
  12. {
  13. //
  14. // GET: /Home/
  15.  
  16. public ActionResult Index()
  17. {
  18. return View();
  19. }
  20.  
  21. [HttpPost]
  22. public ActionResult SendYanZhengMa(string recEmail)
  23. {
  24.  
  25. //调用模板文件 并进行占位符替换
  26. string templetpath = Server.MapPath("../mailtemplate/irupoint.txt");
  27. NameValueCollection myCol = new NameValueCollection();
  28. myCol.Add("ename", "一明");
  29. myCol.Add("from", "地狱之门");
  30. myCol.Add("link", "http://shuai7boy.cn/");
  31. string mailBody = TemplateHelper.BulidByFile(templetpath, myCol);
  32. string result= MailHelper.SendNetMail(recEmail, mailBody, true);
  33. return Content(result);
  34. }
  35. }
  36. }

MailHelper.cs(发送邮件封装类)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Configuration;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.Mail;
  7. using System.Text;
  8. using System.Web;
  9.  
  10. namespace 发送邮件ZJ.Helpers
  11. {
  12. /// <summary>
  13. /// 发送邮件帮助类
  14. /// </summary>
  15. public class MailHelper
  16. {
  17. /// <summary>
  18. ///
  19. /// </summary>
  20. /// <param name="recEmail">收件地址</param>
  21. /// <param name="mailBody">发送内容:这里可以传递过来普通内容或模板内容</param>
  22. /// <param name="IsBodyHtml">设置是否以html格式发送</param>
  23. /// <returns></returns>
  24. public static string SendNetMail(string recEmail, string mailBody, bool IsBodyHtml)
  25. {
  26. string result = "no";//返回结果
  27. string sendFrom = ConfigurationManager.AppSettings["sendFrom"]; //生成一个发送地址
  28. string sendUserName = ConfigurationManager.AppSettings["sendUserName"];//发送人的名字
  29. string recUserName = ConfigurationManager.AppSettings["recUserName"];//收件人名字
  30. string sendTitle = ConfigurationManager.AppSettings["sendTitle"];//发送邮件标题
  31. string username = ConfigurationManager.AppSettings["username"];//发送邮箱用户名
  32. string passwd = ConfigurationManager.AppSettings["passwd"];//发送邮箱密码
  33. try {
  34. //确定smtp服务器地址。实例化一个Smtp客户端
  35. System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient("smtp.yeah.net");
  36.  
  37. //构造一个发件人地址对象
  38. MailAddress from = new MailAddress(sendFrom, sendUserName, Encoding.UTF8);//发送地址,发送人的名字
  39. //构造一个收件人地址对象
  40. MailAddress to = new MailAddress(recEmail,recUserName, Encoding.UTF8);//收件地址,收件人的名字
  41. //构造一个Email的Message对象
  42. MailMessage message = new MailMessage(from, to);
  43. //添加邮件主题和内容
  44. message.Subject = sendTitle;
  45. message.SubjectEncoding = Encoding.UTF8;
  46. message.Body = mailBody;
  47. message.BodyEncoding = Encoding.UTF8;
  48. //设置邮件的信息
  49. client.DeliveryMethod = SmtpDeliveryMethod.Network;
  50. message.IsBodyHtml = IsBodyHtml;//设置是否为html格式的值
  51. //如果服务器支持安全连接,则将安全连接设为true。
  52. //gmail支持,163不支持,如果是gmail则一定要将其设为true
  53. client.EnableSsl = true;
  54. //设置用户名和密码。
  55. client.UseDefaultCredentials = false;
  56. //用户登陆信息
  57. NetworkCredential myCredentials = new NetworkCredential(username, passwd);
  58. client.Credentials = myCredentials;
  59. //发送邮件
  60. client.Send(message);
  61. //提示发送成功
  62. result = "ok";
  63. }
  64. catch
  65. {
  66. result = "no";
  67. }
  68. return result;
  69. }
  70. }
  71. }

TemplateHelper.cs(发送模板替换类)

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Collections.Specialized;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Web;
  8.  
  9. namespace 发送邮件ZJ.Helpers
  10. {
  11. public class TemplateHelper
  12. {
  13. /// <summary>
  14. /// 私有构造方法,不允许创建实例
  15. /// </summary>
  16. private TemplateHelper()
  17. {
  18. // TODO: Add constructor logic here
  19. }
  20.  
  21. /// <summary>
  22. /// Template File Helper
  23. /// </summary>
  24. /// <param name="templatePath">Templet Path</param>
  25. /// <param name="values">NameValueCollection</param>
  26. /// <returns>string</returns>
  27. public static string BulidByFile(string templatePath, NameValueCollection values)
  28. {
  29. return BulidByFile(templatePath, values, "[$", "]");
  30. }
  31.  
  32. /// <summary>
  33. ///
  34. /// </summary>
  35. /// <param name="template"></param>
  36. /// <param name="values">NameValueCollection obj</param>
  37. /// <param name="prefix"></param>
  38. /// <param name="postfix"></param>
  39. /// <returns></returns>
  40. public static string Build(string template, NameValueCollection values, string prefix, string postfix)
  41. {
  42. if (values != null)
  43. {
  44. foreach (DictionaryEntry entry in values)
  45. {
  46. template = template.Replace(string.Format("{0}{1}{2}", prefix, entry.Key, postfix), entry.Value.ToString());
  47. }
  48. }
  49. return template;
  50. }
  51.  
  52. /// <summary>
  53. ///
  54. /// </summary>
  55. /// <param name="templatePath"></param>
  56. /// <param name="values"></param>
  57. /// <param name="prefix"></param>
  58. /// <param name="postfix"></param>
  59. /// <returns></returns>
  60. public static string BulidByFile(string templatePath, NameValueCollection values, string prefix, string postfix)
  61. {
  62. StreamReader reader = null;
  63. string template = string.Empty;
  64. try
  65. {
  66. reader = new StreamReader(templatePath);
  67. template = reader.ReadToEnd();
  68. reader.Close();
  69. if (values != null)
  70. {
  71. foreach (string key in values.AllKeys)
  72. {
  73. template = template.Replace(string.Format("{0}{1}{2}", prefix, key, postfix), values[key]);
  74. }
  75. }
  76. }
  77. catch
  78. {
  79.  
  80. }
  81. finally
  82. {
  83. if (reader != null)
  84. reader.Close();
  85. }
  86. return template;
  87. }
  88. }
  89. }

irupoint.txt(自定义模板,这里简单定义就行了,别忘了,格式要直接html里面才起作用哦,具体原因尚未确定)

  1. <div style="background-color:pink;font-size:25px;">
  2. hi [$ename]:<br/>
  3. &nbsp;&nbsp;&nbsp;&nbsp;您收到的是来自[$from]的邮件。 您还好么?<br/>
  4. &nbsp; 详情:<a href='[$link]' target="_blacnk">点击</a>
  5. </div>

Web.config(这里只抽取了邮件配置部分)

  1. <appSettings>
  2. <!--发送邮件配置开始-->
  3. <add key="sendFrom" value="techblog@yeah.net"/><!--发送邮件地址,及要发送邮件所在的域名-->
  4. <add key="sendUserName" value="RYJ"/><!--发送人的名字-->
  5. <add key="recEmail" value="2636922684@qq.com"/><!--收件人地址-->
  6. <add key="recUserName" value="一明"/><!--收件人姓名-->
  7. <add key="sendTitle" value="帅7的标题"/><!--发送邮件标题-->
  8. <add key="username" value="techblog"/><!--发送邮箱用户名-->
  9. <add key="passwd" value="2436chao"/><!--发送邮箱密码-->
  10. <!--发送邮件配置结束-->
  11. </appSettings>

好了,就这么多,大家来看下效果吧(●'◡'●)

看,收到了!

代码下载

zj。。。。。。

C#之发送邮件【模板】+【封装】ZJ版的更多相关文章

  1. 使用requireJS,backboneJS,和underscoreJS完成自定义模板封装

    使用requireJS,backboneJS,和underscoreJS完成自定义模板封装 原来的代码 当我们进行一个列表的数据填充的时候,是这样做的: //获取美食列表 function getFo ...

  2. 瞎j8封装第二版之数据层的封装

    看了以前写的代码,对就是下面这个 手把手封装数据层之DataUtil数据库操作的封装 觉得以前写的代码好烂啊!!!,重新理了一下思路,写得更规范和简练,应该效率也会高很多,用了一下下午写的连接池(半废 ...

  3. BZOJ 2243 染色 | 树链剖分模板题进阶版

    BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...

  4. jenkins 发送邮件模板

    jenkins 发送邮件模板 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  5. JavaWeb_(session和application)用户登录注册模板_进阶版

    用户登录注册模板_基础版 传送门 用户登录注册模板进阶版 添加了获得获得当前登录用户信息及存储登录人数 用户登录后,在首页.注册页.登录页显示登录用户信息和存储登录人数信息 目录结构 <%@pa ...

  6. 分享几套bootstrap后台模板【TP5版】

    分享几套bootstrap后台模板[TP5版],模板来源于网络,需要的拿走.1.AdminLTE 链接: http://pan.baidu.com/s/1o7BXeCM 密码: zfhy 2.Boot ...

  7. 【RTOS】基于V7开发板的uCOS-III,uCOS-II,RTX4,RTX5,FreeRTOS原版和带CMSIS-RTOS V2封装层版全部集齐

    RTOS模板制作好后,后面堆各种中间件就方便了. 1.基于V7开发板的最新版uCOS-II V2.92.16程序模板,含MDK和IAR,支持uC/Probe https://www.cnblogs.c ...

  8. JavaWeb_(request和response)用户登录注册模板_基础版

    用户登录注册模板进阶版 传送门 用户登录注册模板基础版 登录:当用户登录成功时,跳转到personCenter.jsp,当用户登录失败时,跳转到login.jsp并给出提示 注册:当用户注册成功时,跳 ...

  9. C++模板封装Win32 API 动态调用

    起因 花两周通读了一遍<C++ Primer>,积攒的疑惑一扫而光. 前因 利用C++11可变模板,封装调用dll导出函数 本以为已经很好用了,最近抽时间巩固下知识体系,发现自己道行不够! ...

随机推荐

  1. WebAPI接收JSON参数注意事项

    运行环境:ASP.NET 4.5.2. 当我们向GlobalConfiguration.Configuration.MessageHandlers添加一个DelegatingHandler派生类后,很 ...

  2. 制作CAB包

    制作CAB包 inf文件 INF是Device INFormation File的英文缩写,是Microsoft公司为硬件设备制造商发布其驱动程序推出的一种文件格式,INF文件中包含硬件设备的信息或脚 ...

  3. ASP.NET MVC——CodeFirst开发模式

    Entity Framework框架提供了几种开发模式,比如Database First,Model First,Code First.Database First是最老也是应用得最广泛的一种设计方式 ...

  4. Bonobo创建新库出错,解决方案

    创建新库出错如下: Native library pre-loader is trying to load native SQLite library "D:\wwwroot\localho ...

  5. HashMap与HashTable的区别

    HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的问题不涉及到HashSet和H ...

  6. java中动态代理的实现

    动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...

  7. Mysql性能优化一

    下一篇:Mysql性能优化二 mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. Mysql数据库的优化技术 对mysql优化是一个综合性的技术,主要包 ...

  8. 释放Android的函数式能量(I):Kotlin语言的Lambda表达式

    原文标题:Unleash functional power on Android (I): Kotlin lambdas 原文链接:http://antonioleiva.com/operator-o ...

  9. UITabBarController 升级定制

    UITabBarController 定制 特点 用法 1.准备工作: 加入你的相关图片,放入了Assets.xcassets; 导入Categroy文件夹(这个里面的文件,在这里不详细说明了,有疑问 ...

  10. 安装cocoapods遇到两大坑-Ruby版本升级和Podfile的配置

    今天安装cocoapods #移除原有ruby源 $ gem sources --remove https://rubygems.org/ #使用可用的淘宝网 $ gem sources -a htt ...