邮件群发工具(C#版)
引言
经常会参与组织一些社区活动,涉及到和不同的人进行交流,微信当然是必须的,同样邮件也是一种不可或缺的方式。
一般群发的邮件不是很友好,如果是一对一的,收到邮件的人是不是会比较重视,而且还有他的名字在里面。
所以抽点时间写了一个工具,使用C#做个发邮件的工具非常简单。
完整代码
class Program { private static string baseDir = ""; private static string email = ""; static void Main(string[] args) { Console.WriteLine("--- 开始执行 --- "); baseDir = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; email = ConfigurationManager.AppSettings["email"]; var date = DateTime.Now.ToString("yyyy-MM-dd"); FileStream fs = new FileStream($"{baseDir}\\[Log]{date}.txt", FileMode.Create); StreamWriter sw = new StreamWriter(fs); sw.WriteLine("===== 发送日志 ====="); List<Contact> contacts = GetContacts(); var smtpClient = GetSmtpClient(); foreach (var contact in contacts) { SendMail(smtpClient, contact, sw); } sw.WriteLine("===== 执行完成 ====="); sw.Flush(); sw.Close(); fs.Close(); Console.WriteLine("--- 执行完成 --- "); Console.ReadLine(); } private static SmtpClient GetSmtpClient() { string server = ConfigurationManager.AppSettings["server"]; string port = ConfigurationManager.AppSettings["port"]; string password = ConfigurationManager.AppSettings["password"]; SmtpClient smtpClient = new SmtpClient(); smtpClient.Host = server; smtpClient.Port = Convert.ToInt32(port); smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.EnableSsl = true; smtpClient.Credentials = new NetworkCredential(email, password); return smtpClient; } private static void SendMail(SmtpClient smtpClient, Contact contact, StreamWriter sw) { try { var mailMessage = GetMailMessage(contact); smtpClient.Send(mailMessage); Console.WriteLine($" --- 发送成功, Email = {contact.Email} --- "); sw.WriteLine($" --- 发送成功, Email = {contact.Email} --- "); } catch (Exception ex) { Console.WriteLine($" === 发送失败, Email = {contact.Email} === "); sw.WriteLine($" === 发送失败, Email = {contact.Email} === "); } } private static MailMessage GetMailMessage(Contact contact) { string subject = ConfigurationManager.AppSettings["subject"]; string introduce = ConfigurationManager.AppSettings["introduce"]; string link = ConfigurationManager.AppSettings["link"]; string content = "<p style=\"font - size:16px\">Dear " + contact.Name + " , </p> " + "<p style=\"font - size:16px\">" + introduce + "</p>"+ "<p style=\"font - size:16px\">报名链接:<a target=\"_blank\" href=\"" + link + "\">"+ link + "</a></p>" + GetContent(); MailMessage mailMessage = new MailMessage(email, contact.Email); mailMessage.Subject = subject; mailMessage.Body = content; mailMessage.BodyEncoding = Encoding.UTF8; mailMessage.IsBodyHtml = true; mailMessage.Priority = MailPriority.Normal; return mailMessage; } private static string GetContent() { var dir = baseDir + "\\content.txt"; StreamReader sr = new StreamReader(dir, Encoding.UTF8); string content = sr.ReadToEnd(); sr.Close(); return content; } private static List<Contact> GetContacts() { List<Contact> contacts = new List<Contact>(); var dir = baseDir + "\\contacts.txt"; StreamReader sr = new StreamReader(dir, Encoding.UTF8); string line; while ((line = sr.ReadLine()) != null) { line = line.Replace(",", ","); var contact = line.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries); if (contact.Length == 2 && !string.IsNullOrEmpty(contact[0]) && !string.IsNullOrEmpty(contact[1])) { contacts.Add(new Contact() {Name = contact[0], Email = contact[1]}); } } sr.Close(); return contacts; } public class Contact { public string Name { get; set; } public string Email { get; set; } } }
app.config
<appSettings> <add key="server" value="smtp.live.com" /> <add key="port" value="25" /> <add key="email" value="***@hotmail.com" /> <add key="password" value="" /> <add key="subject" value="敏捷个人北京2016年6月活动:玩转生涯狂想曲" /> <add key="introduce" value="欢迎参加敏捷个人北京2016年6月活动:玩转生涯狂想曲活动!" /> <add key="link" value="http://www.hdb.com/party/qz1eu?h_share_uid=f0bv" /> </appSettings>
注意
1)读取app.config的配置信息
2)读取程序根目录下的联系人文件:contacts.txt
--------------------------------
测试1,***@gmail.com
测试2,***@qq.com
测试3,***@163.com
--------------------------------
3)读取程序根目录下的内容文件,包含Html代码:content.txt
发送结果截图
1)控制台输出日志
2)收到邮件内容,dear **
代码下载
邮件群发工具(C#版)的更多相关文章
- 通什翡翠商城大站协议邮件群发系统日发20-30万封不打码不换ip不需发件箱100%进收件箱
用一种新的技术思维去群发邮件一种不用换IP,不需要任何发件箱的邮件群发方式一种不需要验证码,不需要**代码变量的邮件群发方式即使需要验证码也能全自动识别验证码的超级智能软件教你最核心的邮件群发思维和软 ...
- 懒人邮件群发日发50-100万封不打码不换IP不需发件箱大站协议系统营销软件100%进收件箱
用一种新的技术思维去群发邮件 一种不用换IP,不需要任何发件箱的邮件群发方式 一种不需要验证码,不需要**代码变量的邮件群发方式 即使需要验证码也能全自动识别验证码的超级智能软件 教你最核心的邮件群发 ...
- 各大免费邮箱邮件群发账户SMTP服务器配置及SMTP发送量限制情况
网络产品推广和新闻消息推送时,经常用到的工具就是用客户邮箱发送邮件了,如果是要发送的邮件量非常大的话,一般的建议是搭建自己的邮局服务器,或者是花钱购买专业的邮件群发服务,免费邮箱的SMTP适合少量的邮 ...
- Visual Studio 版本转换工具WPF版开源了
想法的由来 入职一家新公司,领导给了个任务,要编写一个视频监控软件,等我编写调试好,领导满意了以后,这个软件要加入到公司的一个软件系统中去(这个添加工作不用我来做,嘻嘻,看着自己的软件被别人使用,心情 ...
- C++实现邮件群发的方法
这篇文章主要介绍了C++实现邮件群发的方法,较为详细的分析了邮件发送的原理与C++相关实现技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了C++实现邮件群发的方法.分享给大家供大家参考.具 ...
- GnuPG 1.4.15 发布,邮件加密工具
GnuPG 1.4.15 改进包括: * Fixed possible infinite recursion in the compressed packet parser. [CVE-2013-44 ...
- 邮件发送工具类 SendMail.java
package com.util; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.Simp ...
- QC邮件转发工具Mail Direct安装配置手册
QC邮件转发工具Mail Direct安装配置手册 2010-06-11 10:00:56| 分类: 软件测试 | 标签: |举报 |字号大中小 订阅 QC邮件转发工具安装配置手册 由于公司没有独立的 ...
- java 邮件发送工具类
首先需要下载mail.jar文件,我个人通常是使用maven中心库的那个: <dependency> <groupId>javax.mail</groupId> & ...
随机推荐
- Hadoop第6周练习—在Eclipse中安装Hadoop插件及测试(Linux操作系统)
1 运行环境说明 1.1 硬软件环境 1.2 机器网络环境 2 :安装Eclipse并测试 2.1 内容 2.2 实现过程 2.2.1 2.2.2 ...
- C++中指针和引用的区别
①指针可以为空,引用不能为空: ②指针可以被赋值,引用必须在声明时赋值,之后不能被赋值: ③指针可以指向堆中空间,引用不能指向堆中空间,如int &p=new int; 会编译出错.
- SQL SERVER 分布式事务(DTC)
BEGIN DISTRIBUTED TRANSACTION指定一个由 Microsoft 分布式事务处理协调器 (MS DTC) 管理的 Transact-SQL 分布式事务的起始. 语法BEGIN ...
- Python+Selenium进行UI自动化测试项目中,常用的小技巧4:日志打印,longging模块(控制台和文件同时输出)
在前段时间,为了给项目中加入日志功能,就想到了 logging 模块,百度logging一大推,都是各种复制的,并没有找到自己想要的结果:我的目的很简单,就是:在把日志写入文件的同时在控制台输出,更加 ...
- Scrum团队成立3.0
博客园 首页 新随笔 联系 订阅 管理 随笔 - 23 文章 - 0 评论 - 26 0428-Scrum团队成立3.0 ------------------------------3.0---- ...
- 快捷获取浏览器(navigator对象)的全部属性
理论: navigator对象包含关于web浏览器的信息,浏览器的类型,版本信息都可以从该对象获取. 属性 说明 appCodeName 浏览器代码说明 appName 浏览器名称 appVe ...
- Python入门笔记(19):Python函数(2):函数/方法装饰器
一.装饰器(decorators) 装饰器的语法以@开头,接着是装饰器函数的名字.可选参数. 紧跟装饰器声明的是被装饰的函数和被装饰的函数的可选参数,如下: @decorator(dec_opt_ar ...
- jQuery实现隐藏标签
要求:用户进入该页面时,品牌列表默认是精简显示,用户可以单击商品列表下方的“显示全部品牌”按钮来显示全部的品牌. <%@ Page Language="C#" Inherit ...
- KMP的原理详细讲解
1.kmp算法的原理: 本部分内容转自:http://www.cnblogs.com/c-cloud/p/3224788.html及 http:// ...
- mariadb connector bug
为了解决http://www.cnblogs.com/zhjh256/p/5807086.html的问题测试mariadb connector,常规的增删改查没有问题. 这货本来是为了解决存储过程bu ...