C#之发送邮件【模板】+【封装】ZJ版

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 <= 0) {
                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="[email protected]"/><!--发送邮件地址,及要发送邮件所在的域名-->
    <add key="sendUserName" value="RYJ"/><!--发送人的名字-->
    <add key="recEmail" value="[email protected]"/><!--收件人地址-->
    <add key="recUserName" value="一明"/><!--收件人姓名-->
    <add key="sendTitle" value="帅7的标题"/><!--发送邮件标题-->
    <add key="username" value="techblog"/><!--发送邮箱用户名-->
    <add key="passwd" value="2436chao"/><!--发送邮箱密码-->
   <!--发送邮件配置结束-->
</appSettings>

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

看,收到了!

代码下载

zj。。。。。。

时间: 2024-10-16 13:34:18

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

费用流mcmf模板2.0版

题目地址:HDU 3488 今晚才发现以前的费用流模板居然是错的.......有漏洞....但是居然都AC了那么多题..想想也是..做的费用流也不多,而且都是流量为1的,这个漏洞是不会影响的.因为以前在每次最小费用增广后找到的最小流量是经过的所有路的最小流量,不一定是可以到达汇点的最小流量..但是如果流量都为1的话..那只要边没有全部流过,那肯定最小流量会是1.而如果已经全部流过的话..那也没意义了..已经到达了最大流了.所以说这个漏洞一直都没被发现... 那么应该如何改进呢.那就是跟最短路的方

运维常见统计表模板(word版)

运维常见统计表模板(word版) 背景: IT从业者工作繁忙,本身人员不够使,领导还天天催着各种报表.总结,做技术的就想着搞些实际的东西,不愿意整天沉浸在写总结的气氛里.下面例举了一些常见的运维报表模板,希望能给正在制表的同志一点启发或借鉴. 表格下载: http://down.51cto.com/data/2223916 51CTO学院优秀讲师评选中,我期待您的宝贵一票! http://edu.51cto.com/lecturer/user_id-350944.html

寿星天文历Java封装整理版

由于生活和工作的原因,"寿星天文历"我一直没有动,长时间的丢弃后,当重新拾起时,比较费劲.编程就是这样,思维的火花只在当初的那一瞬,一旦熄灭,重新再点燃断掉的思维是很困难的.因为人的"忘记"能力,真的是挺强的,有时回顾或维护以前的代码时,常常会感叹道:这是我写的吗?够牛逼,看不懂!呵呵,这时候注释的作用的凸显出来了,尽管如此有时仅仅靠注释找以前的思路也是很困难. 跑题了,那么,首先对于等着"寿星天文历"封装整理版代码的各位,说声抱歉.这回整理的代

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

BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上还是原树上,把两个区间的信息合并的时候,要注意中间相邻两个颜色是否相同. 这代码好长啊啊啊啊 幸好一次过了不然我估计永远也De不出来 #include <cstdio> #include <cstring> #include <algorithm> using namesp

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

看了以前写的代码,对就是下面这个 手把手封装数据层之DataUtil数据库操作的封装 觉得以前写的代码好烂啊!!!,重新理了一下思路,写得更规范和简练,应该效率也会高很多,用了一下下午写的连接池(半废品...) 瞎j8封装第二版之数据库连接池 下面直接上代码,代码很好理解,就是用了简单的反射,注解的部分我都写了注释 package jdbc; import util.StringUtil; import java.lang.reflect.Field; import java.lang.refl

IJH江湖家居装修门户系统V5.0商业破解版,再赠送12套商业模板,带手机版

IJH江湖家居装修门户系统,一直倍受关注,今天在这里完全免费分享这套最新的家装门户系统V5.0,另外再赠送12套商业模板,在这里是完全免费哦.而且源码程序是非常干净,并非外面VIP源码论坛在里面加入大量大量广告文件那种,甚至是植入加密的广告代码和后门. IJH江湖家居装修门户系统是一套采用PHP+MYSQL开发的家居O2O系统,全站SEO,适合做家居垂直领域网站使用.网站主要栏目包括:我要装修(装修招标).找装修(公司.设计师等.优惠信息).我搜我家(小区.楼盘).效果图.学装修(装修日记.问答

瞎j8封装第二版之用xml文件来代理dao接口

也是重新整理了之前的那篇 模仿Mybatis用map per.xml实现Dao层接口的功能 话不多说直接上代码 首先是结构 依赖pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-insta

SPFA模板 Bellmanford优化版

SPFA模板: queue<int>Q; bool inq[510]; int dis[510],sumv[510]; int n,v[510*3],__next[510*3],e,w[510*3],first[510],cnts[510]; void AddEdge(int U,int V,int W) { v[++e]=V; w[e]=W; __next[e]=first[U]; first[U]=e; } bool spfa(const int &s) { memset(dis,

【块状链表】AutSky_JadeK的块状链表模板+总结(STL版)

Part 1.块状链表.   定位 插入 删除 数组 O(1) O(n) O(n) 链表 O(n) O(1) O(1) 对于线性表的以上常见操作来说,数组和链表都无法有效地解决.但是,若我们将链表的每个节点存成一个数组,使得链表里每个节点的数据拼接起来就是原先的线性表中的内容(即块状链表),并且数组的大小合适的话,以上的操作都能比较好地解决了.根据均值不等式,若每个块的大小定为sqrt(n)左右最优,此时块数也是sqrt(n)左右,易证.以下是块状链表的基础操作的思想.复杂度和代码. 一.声明.