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

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

总体预览如下:

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

前台;

@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
请输入您的邮箱:<input type="text" id="email" /> <input type="button" value="获取验证码" id="getYZM" /><br />
返回信息:<input type="text" id="yzm" />
</div>
</body>
</html>
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script>
$("#getYZM").click(function () {
var emailName = $("#email").val().trim();
if (emailName.length <= ) {
alert("请输入邮箱"); return;
}
$.post('@Url.Action("SendYanZhengMa","Home")', { recEmail: emailName }, function (_data) {
if (_data=="no") {
alert("发送失败!");
} else {
$("#yzm").val(_data);
}
})
});
</script>

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

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using 发送邮件ZJ.Helpers; namespace 发送邮件ZJ.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/ public ActionResult Index()
{
return View();
} [HttpPost]
public ActionResult SendYanZhengMa(string recEmail)
{ //调用模板文件 并进行占位符替换
string templetpath = Server.MapPath("../mailtemplate/irupoint.txt");
NameValueCollection myCol = new NameValueCollection();
myCol.Add("ename", "一明");
myCol.Add("from", "地狱之门");
myCol.Add("link", "http://shuai7boy.cn/");
string mailBody = TemplateHelper.BulidByFile(templetpath, myCol);
string result= MailHelper.SendNetMail(recEmail, mailBody, true);
return Content(result);
}
}
}

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

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Text;
using System.Web; namespace 发送邮件ZJ.Helpers
{
/// <summary>
/// 发送邮件帮助类
/// </summary>
public class MailHelper
{
/// <summary>
///
/// </summary>
/// <param name="recEmail">收件地址</param>
/// <param name="mailBody">发送内容:这里可以传递过来普通内容或模板内容</param>
/// <param name="IsBodyHtml">设置是否以html格式发送</param>
/// <returns></returns>
public static string SendNetMail(string recEmail, string mailBody, bool IsBodyHtml)
{
string result = "no";//返回结果
string sendFrom = ConfigurationManager.AppSettings["sendFrom"]; //生成一个发送地址
string sendUserName = ConfigurationManager.AppSettings["sendUserName"];//发送人的名字
string recUserName = ConfigurationManager.AppSettings["recUserName"];//收件人名字
string sendTitle = ConfigurationManager.AppSettings["sendTitle"];//发送邮件标题
string username = ConfigurationManager.AppSettings["username"];//发送邮箱用户名
string passwd = ConfigurationManager.AppSettings["passwd"];//发送邮箱密码
try {
//确定smtp服务器地址。实例化一个Smtp客户端
System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient("smtp.yeah.net"); //构造一个发件人地址对象
MailAddress from = new MailAddress(sendFrom, sendUserName, Encoding.UTF8);//发送地址,发送人的名字
//构造一个收件人地址对象
MailAddress to = new MailAddress(recEmail,recUserName, Encoding.UTF8);//收件地址,收件人的名字
//构造一个Email的Message对象
MailMessage message = new MailMessage(from, to);
//添加邮件主题和内容
message.Subject = sendTitle;
message.SubjectEncoding = Encoding.UTF8;
message.Body = mailBody;
message.BodyEncoding = Encoding.UTF8;
//设置邮件的信息
client.DeliveryMethod = SmtpDeliveryMethod.Network;
message.IsBodyHtml = IsBodyHtml;//设置是否为html格式的值
//如果服务器支持安全连接,则将安全连接设为true。
//gmail支持,163不支持,如果是gmail则一定要将其设为true
client.EnableSsl = true;
//设置用户名和密码。
client.UseDefaultCredentials = false;
//用户登陆信息
NetworkCredential myCredentials = new NetworkCredential(username, passwd);
client.Credentials = myCredentials;
//发送邮件
client.Send(message);
//提示发送成功
result = "ok";
}
catch
{
result = "no";
}
return result;
}
}
}

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

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Web; namespace 发送邮件ZJ.Helpers
{
public class TemplateHelper
{
/// <summary>
/// 私有构造方法,不允许创建实例
/// </summary>
private TemplateHelper()
{
// TODO: Add constructor logic here
} /// <summary>
/// Template File Helper
/// </summary>
/// <param name="templatePath">Templet Path</param>
/// <param name="values">NameValueCollection</param>
/// <returns>string</returns>
public static string BulidByFile(string templatePath, NameValueCollection values)
{
return BulidByFile(templatePath, values, "[$", "]");
} /// <summary>
///
/// </summary>
/// <param name="template"></param>
/// <param name="values">NameValueCollection obj</param>
/// <param name="prefix"></param>
/// <param name="postfix"></param>
/// <returns></returns>
public static string Build(string template, NameValueCollection values, string prefix, string postfix)
{
if (values != null)
{
foreach (DictionaryEntry entry in values)
{
template = template.Replace(string.Format("{0}{1}{2}", prefix, entry.Key, postfix), entry.Value.ToString());
}
}
return template;
} /// <summary>
///
/// </summary>
/// <param name="templatePath"></param>
/// <param name="values"></param>
/// <param name="prefix"></param>
/// <param name="postfix"></param>
/// <returns></returns>
public static string BulidByFile(string templatePath, NameValueCollection values, string prefix, string postfix)
{
StreamReader reader = null;
string template = string.Empty;
try
{
reader = new StreamReader(templatePath);
template = reader.ReadToEnd();
reader.Close();
if (values != null)
{
foreach (string key in values.AllKeys)
{
template = template.Replace(string.Format("{0}{1}{2}", prefix, key, postfix), values[key]);
}
}
}
catch
{ }
finally
{
if (reader != null)
reader.Close();
}
return template;
}
}
}

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

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

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

<appSettings>
<!--发送邮件配置开始-->
<add key="sendFrom" value="techblog@yeah.net"/><!--发送邮件地址,及要发送邮件所在的域名-->
<add key="sendUserName" value="RYJ"/><!--发送人的名字-->
<add key="recEmail" value="2636922684@qq.com"/><!--收件人地址-->
<add key="recUserName" value="一明"/><!--收件人姓名-->
<add key="sendTitle" value="帅7的标题"/><!--发送邮件标题-->
<add key="username" value="techblog"/><!--发送邮箱用户名-->
<add key="passwd" value="2436chao"/><!--发送邮箱密码-->
<!--发送邮件配置结束-->
</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. 详解javascript的类

    前言 生活有度,人生添寿. 原文地址:详解javascript的类 博主博客地址:Damonare的个人博客 Javascript从当初的一个"弹窗语言",一步步发展成为现在前后端 ...

  2. 利用javascript跨域访问cookie之广告推广

    在上一篇<说一说javascript跨域和jsonp>中,利用JSONP进行了跨域的数据访问,利用JS本身的跨域能力在远端生成HTML结构的方式完成了一个小广告. 在实际应用中, 跨域使用 ...

  3. Unity 3D json嵌套使用以及多种类型匹配

    我们控制端要发送很多命令给终端设备,其中有速度,方向,开关门,开关灯....方法千万种,我只取一瓢.我还小,不知道其他人是怎么写的.我喜欢把有规律的东西放在一起写!为了我的强迫症! using Uni ...

  4. 【无私分享:ASP.NET CORE 项目实战(第五章)】Repository仓储 UnitofWork

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 本章我们来创建仓储类Repository 并且引入 UnitOfWork 我对UnitOfWork的一些理解  UnitOfW ...

  5. 学习之路~sqh

    推荐博客 Edison Chou: Vamei: 算法∙面试专题 - 简书: 设计模式 极速理解设计模式系列[目录索引]- Caleung: Net设计模式 - 灵动生活: 宅男程序员给老婆的计算机课 ...

  6. [译]Google官方关于Android架构中MVP模式的示例

    概述 该示例(TODO-MVP)是后续各种示例演变的基础,它主要演示了在不带架构性框架的情况下实现M-V-P模式.其采用手动依赖注入的方式来提供本地数据源和远程数据源仓库.异步任务通过回调处理. 注意 ...

  7. linux添加启动器图标(Ubuntu为例)

     添加启动器图标,以eclipse为例,%表示命令提示符,shell命令:%nano /usr/share/applications/eclipse.desktop-----------[Deskto ...

  8. 解决 Tomcat Server in Eclipse unable to start within 45 seconds 不能启动的问题

    1.在 Eclipse 下方  Servers TAB页,双击 "Tomcat 7.0 at localhost": 2.在右上角处点开 Timeouts 的设定,修改Start( ...

  9. go-使用 unsafe 修改 struct 中的 field 的值

    以下是方法,不要纠结原理,等东西积累多了,你才有能力纠结原理: 首先,你需要有一个这样的函数,这是在 nsq 的源码里直接抄过来的: func unsafeValueOf(val reflect.Va ...

  10. Java第三方数据库连接池库-DBCP-C3P0-Tomcat内置连接池

    连接池原理 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定连接池 ...