asp.net 客户邮件群发功能 SendMail 发送静态化html
背景:现在几乎每个企业都要用到邮箱,而在大客户量情况下,为我们的不同等级的客户送上节日关怀,以及把我们的喜讯、新品通知到他们是我们急需解决的问题。效果如图

思路:
1、静态化网页模版,首先考虑需要发送什么,把需要的东西做成小而精美的html静态化页面以待发送时候用到;
2、关于发送问题,点击“发送邮件”弹出群发邮件的框,填写主题、html的服务器所在地址、收件人(多个);
3、群发的实现。
代码C#:
/// <summary>
/// 发送失败的邮箱地址搜集参数
/// </summary>
private string errorMail;
群发邮件点击事件
protected void BtnSendMail_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(txTopic.Value))
{
MessageShow("邮件主题必填");
return;
}
if (string.IsNullOrEmpty(txUrl.Value))
{
MessageShow("URL内容必填");
return;
}
if (string.IsNullOrEmpty(txTo.Value))
{
MessageShow("收件人必填");
return;
}
string email = ConfigurationManager.AppSettings["ManagerSendMailUserName"].ToString(); //登录用户邮箱
string emailpwd = ConfigurationManager.AppSettings["ManagerSendMailUserPwd"].ToString(); //登录用户邮箱密码
string s = GetHtmlCode(txUrl.Value, "gb2312");
bool restr = Sendmail(email, txTo.Value, txTopic.Value, true, s, "smtp.exmail.qq.com", email, emailpwd);
if (restr)
{
ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('全部发送成功!');</script>");
}
else
{
ClientScript.RegisterStartupScript(this.GetType(), "",
"<script>alert('已发送,但以下地址发送失败:" + errorMail + "可能是地址不存在!');</script>");
}
}
/// <summary>
/// 发送邮件
/// </summary>
/// <param name="from">发送人邮件地址</param>
/// <param name="to">接收人邮件地址</param>
/// <param name="subject">邮件主题</param>
/// <param name="isBodyHtml">是否是Html</param>
/// <param name="body">邮件体</param>
/// <param name="smtpHost">SMTP服务器地址,例如:smtp.163.com</param>
/// <param name="userName">用户名</param>
/// <param name="password">密码</param>
/// <returns>是否成功</returns>
public bool Sendmail(string from, string to, string subject, bool isBodyHtml, string body, string smtpHost, string userName, string password)
{
bool isSuccess = true;
string[] ts = null;
if (!string.IsNullOrEmpty(to))
{
if (to.Contains(";"))
ts = to.Split(';');
else
ts = new string[] { to };
foreach (string t in ts)
{
if (!string.IsNullOrEmpty(t))
{
MailMessage mm = new MailMessage();
mm.From = new MailAddress(from);
mm.To.Add(new MailAddress(t));
mm.Subject = subject;
mm.IsBodyHtml = isBodyHtml;
mm.Body = body;
SmtpClient sc = new SmtpClient();
sc.Host = smtpHost;
sc.Port = 25;
sc.EnableSsl = false;
sc.Credentials = new NetworkCredential(userName, password);
sc.UseDefaultCredentials = true;
sc.Credentials = new System.Net.NetworkCredential(userName, password);
sc.DeliveryMethod = SmtpDeliveryMethod.Network;
try
{
sc.Send(mm);
}
catch (Exception x)
{
errorMail += t + ";";
isSuccess = false;
continue;
}
}
}
}
return isSuccess;
}
/// <summary>
/// 获取指定路径下的模板的HTML源代码
/// </summary>
/// <param name="TemplatePath">模板的路径</param>
/// <param name="EncodingType">网页类型(有些是UTF8,有些是GB2312)</param>
/// <returns>源代码</returns>
private string GetHtmlCode(string TemplatePath, string EncodingType)
{
try
{
if (TemplatePath != string.Empty)
{
string ForesideUriPath = string.Empty;
if (!TemplatePath.ToLower().StartsWith("http://"))
ForesideUriPath = HttpContext.Current.Server.MapPath("~/") + TemplatePath;
else
ForesideUriPath = TemplatePath;
WebClient webClient = new WebClient();
//设置网络凭证为系统凭证
webClient.Credentials = CredentialCache.DefaultCredentials;
//获取指定URI的网页的源代码
byte[] byteDataBuffer = webClient.DownloadData(ForesideUriPath);
string htmlCode = "";
if (EncodingType == "UTF8")
{
htmlCode = Encoding.UTF8.GetString(byteDataBuffer);
}
else
{
htmlCode = Encoding.GetEncoding(EncodingType).GetString(byteDataBuffer);
}
htmlCode = Regex.Replace(htmlCode, @"<!DOCTYPE\s*HTML\s*PUBLIC[^>]+>", "", RegexOptions.Singleline);
htmlCode = Regex.Replace(htmlCode, @"\s+", " ", RegexOptions.Singleline);
return htmlCode;
}
else
{
return "";
}
}
catch (Exception ee)
{
throw (ee);
}
}
总结:这个功能还是非常有用的,大家可以扩展,定时发送什么,实现各种烂漫的功能。最后说一声,祝大家羊年大吉,心想事成!
asp.net 客户邮件群发功能 SendMail 发送静态化html的更多相关文章
- asp.net mvc 性能优化——(1)静态化
asp.net mvc 性能优化--(1)静态化 在改善页面性能的同时,可能会采用静态化的策略,对于不能实时静态化的内容,则采用缓存.本文主要讨论如何实现cshtml的静态化(实际上还不是完全的htm ...
- ASP.NET MVC使用SSI来实现页面静态化
页面静态化分为两种:伪静态和真静态,这里主要介绍的是真静态. 进入正题之前先简单介绍一下SSI和shtml: 1).SSI是Server Side Include的简称(服务器端嵌入) 2).shtm ...
- 【转】比较详细的Asp伪静态化方法及Asp静态化探讨
目前,各大搜索引擎如google.百度.雅虎已经对动态页面诸如asp,php有着不错的支持了,只要动态页面后面的参数不要太长,如控制在3个参数内,页面内容做点优化,各大搜索对该类页面收录甚至不比静态h ...
- ASP.NET MVC 页面静态化操作的思路
本文主要讲述了在asp.net mvc中,页面静态化的几种思路和方法.对于网站来说,生成纯html静态页面除了有利于seo外,还可以减轻网站的负载能力和提高网站性能.在asp.net mvc中,视图的 ...
- U-Mail邮件群发触发器功能助力营销自动化
小编在朋友圈看到的人工智能讨论越来越多,越来越多的上班族惶恐不安,担心自己的饭碗不保将被人工智能所取代,这说明智能化.自动化正成为各行业的趋势,营销也概莫能外.营销的自动化意味着将大大节省从业人员的精 ...
- 如何利用sendmail发送外部邮件?
在写监控脚本时,为了更好的监控服务器性能,如磁盘空间.系统负载等,有必要在系统出现瓶颈时,及时向管理员进行报告.在这里通常采用邮件报警,同时,邮件设置为收到邮件,即向指定手机号码发送短信.这样可以实现 ...
- 通什翡翠商城大站协议邮件群发系统日发20-30万封不打码不换ip不需发件箱100%进收件箱
用一种新的技术思维去群发邮件一种不用换IP,不需要任何发件箱的邮件群发方式一种不需要验证码,不需要**代码变量的邮件群发方式即使需要验证码也能全自动识别验证码的超级智能软件教你最核心的邮件群发思维和软 ...
- 懒人邮件群发日发50-100万封不打码不换IP不需发件箱大站协议系统营销软件100%进收件箱
用一种新的技术思维去群发邮件 一种不用换IP,不需要任何发件箱的邮件群发方式 一种不需要验证码,不需要**代码变量的邮件群发方式 即使需要验证码也能全自动识别验证码的超级智能软件 教你最核心的邮件群发 ...
- 2017U-Mail邮件营销平台新邮件模板功能
据U-Mail调查表明,企业用户中普遍最关心群发邮件会不会被列入垃圾箱?的确,哪怕你最用功,一旦邮件进了垃圾箱,意味着全盘尽废.业界知名服务商U-Mail一直想用户之所想,急用户之所急,十几年如一日, ...
随机推荐
- NGUI ERROR:UnityException: Sprite is not rectangle-packed. TextureRect is invalid.解决
在使用Ngui 3.4.9的时候,使用“Unity 2D Sprite”控件的时候,出现了UnityException: Sprite is not rectangle-packed. Texture ...
- Android平台上长连接的实现
Android 平台上长连接的实现 为了不让 NAT 表失效,我们需要定时的发心跳,以刷新 NAT 表项,避免被淘汰. Android 上定时运行任务常用的方法有2种,一种方法用 Timer,另一种是 ...
- Android横竖屏切换及其相应布局载入问题
第一.横竖屏切换连带载入多屏布局问题: 假设要让软件在横竖屏之间切换.因为横竖屏的高宽会发生转换,有可能会要求不同的布局. 能够通过下面两种方法来切换布局: 1)在res文件夹下建立layout-la ...
- KMP算法具体解释(转)
作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解 ...
- 精品教程--IOS零基础开发环境搭建
下载源码 技术要点: 1. 启动XCODE开始开发 2. IOS项目文件结构分析 3. 添加视图label组件 4. 程序的入口以及启动流程 5. 源码详细的中文注释 ...... 详细介绍: 1. ...
- Linux数据归档和解压缩tar,cpio,gzip,bzip,lzma,zip命令使用
转载:http://www.1987.name/659.html 数据压缩归档和备份是系统管理的日常工作,定期备份不可小视,归档和压缩对于系统管理员或是普通用户来说都经常用到的操作,有很多中压缩格式, ...
- 关于解决[INSTALL_FAILED_UPDATE_INCOMPATIBLE]
通过adb install安装apk,报错Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]. 说明没有正常卸载原apk,基本都是直接通过rm XXX.apk所造 ...
- git的一些命令
因为项目的原因,大家把项目托管到git上,然后我不会,队友就传了一个廖雪峰的git教程,讲的很详细,不会用git的同学,可以在http://pan.baidu.com/s/1pKizolP上下载,这是 ...
- c#winform将全局异常抛出,不用大量写try()catch()
一.在program.cs处完善成如下,但是这样后只能抛出主线程(UI)的错误,所以请看第二步 /// 应用程序的主入口点. /// </summary> [STAThread] stat ...
- Play on Words 欧拉通路(回路)判断
Play on Words note: 判断一下连通性. #include <iostream> #include <cstdio> #include <cstring ...