引言

经常会参与组织一些社区活动,涉及到和不同的人进行交流,微信当然是必须的,同样邮件也是一种不可或缺的方式。

一般群发的邮件不是很友好,如果是一对一的,收到邮件的人是不是会比较重视,而且还有他的名字在里面。

所以抽点时间写了一个工具,使用C#做个发邮件的工具非常简单。

完整代码

  1. class Program
  2. {
  3. private static string baseDir = "";
  4. private static string email = "";
  5.  
  6. static void Main(string[] args)
  7. {
  8. Console.WriteLine("--- 开始执行 --- ");
  9. baseDir = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
  10. email = ConfigurationManager.AppSettings["email"];
  11.  
  12. var date = DateTime.Now.ToString("yyyy-MM-dd");
  13. FileStream fs = new FileStream($"{baseDir}\\[Log]{date}.txt", FileMode.Create);
  14. StreamWriter sw = new StreamWriter(fs);
  15. sw.WriteLine("===== 发送日志 =====");
  16.  
  17. List<Contact> contacts = GetContacts();
  18. var smtpClient = GetSmtpClient();
  19. foreach (var contact in contacts)
  20. {
  21. SendMail(smtpClient, contact, sw);
  22. }
  23.  
  24. sw.WriteLine("===== 执行完成 =====");
  25. sw.Flush();
  26. sw.Close();
  27. fs.Close();
  28. Console.WriteLine("--- 执行完成 --- ");
  29. Console.ReadLine();
  30. }
  31.  
  32. private static SmtpClient GetSmtpClient()
  33. {
  34. string server = ConfigurationManager.AppSettings["server"];
  35. string port = ConfigurationManager.AppSettings["port"];
  36. string password = ConfigurationManager.AppSettings["password"];
  37.  
  38. SmtpClient smtpClient = new SmtpClient();
  39. smtpClient.Host = server;
  40. smtpClient.Port = Convert.ToInt32(port);
  41. smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
  42. smtpClient.EnableSsl = true;
  43. smtpClient.Credentials = new NetworkCredential(email, password);
  44. return smtpClient;
  45. }
  46.  
  47. private static void SendMail(SmtpClient smtpClient, Contact contact, StreamWriter sw)
  48. {
  49. try
  50. {
  51. var mailMessage = GetMailMessage(contact);
  52. smtpClient.Send(mailMessage);
  53. Console.WriteLine($" --- 发送成功, Email = {contact.Email} --- ");
  54. sw.WriteLine($" --- 发送成功, Email = {contact.Email} --- ");
  55. }
  56. catch (Exception ex)
  57. {
  58. Console.WriteLine($" === 发送失败, Email = {contact.Email} === ");
  59. sw.WriteLine($" === 发送失败, Email = {contact.Email} === ");
  60. }
  61. }
  62.  
  63. private static MailMessage GetMailMessage(Contact contact)
  64. {
  65. string subject = ConfigurationManager.AppSettings["subject"];
  66. string introduce = ConfigurationManager.AppSettings["introduce"];
  67. string link = ConfigurationManager.AppSettings["link"];
  68. string content = "<p style=\"font - size:16px\">Dear " + contact.Name + " , </p> " +
  69. "<p style=\"font - size:16px\">" + introduce + "</p>"+
  70. "<p style=\"font - size:16px\">报名链接:<a target=\"_blank\" href=\"" + link + "\">"+ link + "</a></p>"
  71. + GetContent();
  72. MailMessage mailMessage = new MailMessage(email, contact.Email);
  73. mailMessage.Subject = subject;
  74. mailMessage.Body = content;
  75. mailMessage.BodyEncoding = Encoding.UTF8;
  76. mailMessage.IsBodyHtml = true;
  77. mailMessage.Priority = MailPriority.Normal;
  78. return mailMessage;
  79. }
  80.  
  81. private static string GetContent()
  82. {
  83. var dir = baseDir + "\\content.txt";
  84. StreamReader sr = new StreamReader(dir, Encoding.UTF8);
  85. string content = sr.ReadToEnd();
  86. sr.Close();
  87. return content;
  88. }
  89.  
  90. private static List<Contact> GetContacts()
  91. {
  92. List<Contact> contacts = new List<Contact>();
  93. var dir = baseDir + "\\contacts.txt";
  94. StreamReader sr = new StreamReader(dir, Encoding.UTF8);
  95. string line;
  96. while ((line = sr.ReadLine()) != null)
  97. {
  98. line = line.Replace(",", ",");
  99. var contact = line.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries);
  100. if (contact.Length == 2 && !string.IsNullOrEmpty(contact[0]) && !string.IsNullOrEmpty(contact[1]))
  101. {
  102. contacts.Add(new Contact() {Name = contact[0], Email = contact[1]});
  103. }
  104. }
  105. sr.Close();
  106. return contacts;
  107. }
  108.  
  109. public class Contact
  110. {
  111. public string Name { get; set; }
  112.  
  113. public string Email { get; set; }
  114. }
  115. }

app.config

  1. <appSettings>
  2. <add key="server" value="smtp.live.com" />
  3. <add key="port" value="25" />
  4. <add key="email" value="***@hotmail.com" />
  5. <add key="password" value="" />
  6. <add key="subject" value="敏捷个人北京2016年6月活动:玩转生涯狂想曲" />
  7. <add key="introduce" value="欢迎参加敏捷个人北京2016年6月活动:玩转生涯狂想曲活动!" />
  8. <add key="link" value="http://www.hdb.com/party/qz1eu?h_share_uid=f0bv" />
  9. </appSettings>

注意

1)读取app.config的配置信息

2)读取程序根目录下的联系人文件:contacts.txt

--------------------------------

测试1,***@gmail.com
测试2,***@qq.com
测试3,***@163.com

--------------------------------

3)读取程序根目录下的内容文件,包含Html代码:content.txt

发送结果截图

1)控制台输出日志

2)收到邮件内容,dear **

代码下载

下载地址

邮件群发工具(C#版)的更多相关文章

  1. 通什翡翠商城大站协议邮件群发系统日发20-30万封不打码不换ip不需发件箱100%进收件箱

    用一种新的技术思维去群发邮件一种不用换IP,不需要任何发件箱的邮件群发方式一种不需要验证码,不需要**代码变量的邮件群发方式即使需要验证码也能全自动识别验证码的超级智能软件教你最核心的邮件群发思维和软 ...

  2. 懒人邮件群发日发50-100万封不打码不换IP不需发件箱大站协议系统营销软件100%进收件箱

    用一种新的技术思维去群发邮件 一种不用换IP,不需要任何发件箱的邮件群发方式 一种不需要验证码,不需要**代码变量的邮件群发方式 即使需要验证码也能全自动识别验证码的超级智能软件 教你最核心的邮件群发 ...

  3. 各大免费邮箱邮件群发账户SMTP服务器配置及SMTP发送量限制情况

    网络产品推广和新闻消息推送时,经常用到的工具就是用客户邮箱发送邮件了,如果是要发送的邮件量非常大的话,一般的建议是搭建自己的邮局服务器,或者是花钱购买专业的邮件群发服务,免费邮箱的SMTP适合少量的邮 ...

  4. Visual Studio 版本转换工具WPF版开源了

    想法的由来 入职一家新公司,领导给了个任务,要编写一个视频监控软件,等我编写调试好,领导满意了以后,这个软件要加入到公司的一个软件系统中去(这个添加工作不用我来做,嘻嘻,看着自己的软件被别人使用,心情 ...

  5. C++实现邮件群发的方法

    这篇文章主要介绍了C++实现邮件群发的方法,较为详细的分析了邮件发送的原理与C++相关实现技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了C++实现邮件群发的方法.分享给大家供大家参考.具 ...

  6. GnuPG 1.4.15 发布,邮件加密工具

    GnuPG 1.4.15 改进包括: * Fixed possible infinite recursion in the compressed packet parser. [CVE-2013-44 ...

  7. 邮件发送工具类 SendMail.java

    package com.util; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.Simp ...

  8. QC邮件转发工具Mail Direct安装配置手册

    QC邮件转发工具Mail Direct安装配置手册 2010-06-11 10:00:56| 分类: 软件测试 | 标签: |举报 |字号大中小 订阅 QC邮件转发工具安装配置手册 由于公司没有独立的 ...

  9. java 邮件发送工具类

    首先需要下载mail.jar文件,我个人通常是使用maven中心库的那个: <dependency> <groupId>javax.mail</groupId> & ...

随机推荐

  1. Appium移动自动化测试(二)--安装Android开发环境

    继续Appium环境的搭建. 第二节  安装Android开发环境 如果你的环境是MAC那么可以直接跳过这一节.就像我们在用Selenium进行web自动化测试的时候一样,我们需要一个浏览器来执行测试 ...

  2. Direct3D11学习:(六)渲染管线

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 这篇文章主要讲解渲染管线(rendering pipeline)的理论知识. 渲染管线是指:在给定一个3D场景的 ...

  3. Hibernate核心类用法-使用Transaction管理事务

    一个典型的事务应该使用下面的形式 在创建完Session对象后即使用beginTransaction()启动事务 从此开始直到commit()之间的代码 都会处于同一个事务中 这两个函数之间所有的数据 ...

  4. Linux内核知识

    版本 linus树 Linux内核最初创始人--Linus Torvalds管理一个Linus树,linus树也称为主线(mainline).一般指的upstream,"上游",也 ...

  5. Angular系列----AngularJS入门教程01:AngularJS模板 (转载)

    是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模 ...

  6. angularJs自定义服务

    在AngularJS中,系统内置的服务都是以$开头,所以我们的自定义服务尽量避免以$开头.自定义服务的方式有如下几种: 使用Module的provider方法 使用Module的factory方法 使 ...

  7. mysql update中需要根据条件列更新写法update case

    以下两条语句是否可以合并成一条: where b>'2015-10-12'; , e='2015-01-01' where b='2015-10-12'; 既然来写博客了,那答案肯定是可以的, ...

  8. 6/19 sprint3 看板和燃尽图的更新

  9. ok6410 android driver(12)

    In this essay, I will talk about how to write the service libraries. TIPS : I won't discuss the name ...

  10. 一些经典===>>用SQL语句操作数据

    用SQL语句操作数据 结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言 ...