引言

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

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

所以抽点时间写了一个工具,使用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#版)的更多相关文章

  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. 【Spring】利用AOP来做系统性能监控

    需求: 假设已经有了一些类,现在想统计每个方法调用花了多长时间,该怎么做? 思路: 我第一个想法就是去每个方法执行前后记录一下当前的时间戳,然后相减统计到日志. OK,没问题,那么这样做合理吗? 首先 ...

  2. Ember Charts – 基于 Ember & D3 的图表库

    Ember Charts 是一个基于 Ember.js 和 D3.js 的图表库.它包括时间序列.柱状图.饼图.点图,很容易扩展和修改.这些图表组件代表图表交互性和演示的最佳实践,是高度可定制和可扩展 ...

  3. RandomUser – 生成随机用户 JSON 数据的 API

    RandomUser 是一个 API,它为您提供了一个或者一批随机生成的用户.这些用户可以在 Web 应用程序原型中用作占位符,将节省您创建自己的占位符信息的时间.您可以使用 AJAX 或其他方法来调 ...

  4. 用emacs的org2blog组件写cnblogs博客 -- 环境配置及使用

    Table of Contents 配置 使用 创建一篇博文并发布 更新一篇博文 删除一篇博文 待办 本文给出了一个安装.配置org2blog的方法,实现在emacs中书写blog文章.并发布到cnb ...

  5. java抽象类和接口区别

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  6. EF封装类,供参考!

    以下是我对EF DB FIRST 生成的ObjectContext类进行封装,代码如下,供参考学习: using System; using System.Collections.Generic; u ...

  7. [C#高级编程].NET体系结构

    本章内容: 编译和运行面向 .NET的代码 MSIL的优点 值类型和引用类型 数据类型化 理解错误处理和特性 程序集..NET基类和命名空间 本章主要介绍一些概念,内容不多. C#是专门为Micros ...

  8. java 版的复利计算器(张俊毅 周修文)

    (带有本金的选项卡的意思就是计算你在知道利率.年限和本息的情况下计算本金) 在利率的输入中能限制小数点的输入并且输入字母会被直接去除 每一个选项卡都有复利和单利的计算,并且在你计算之后会立即更新在下面 ...

  9. CSS 最核心的四个概念

    本文将讲述 CSS 中最核心的几个概念,包括:盒模型.position.float等.这些是 CSS 的基础,也是最常用的几个属性,它们之间看似独立却又相辅相成.为了掌握它们,有必要写出来探讨一下,如 ...

  10. IIS 503日志文件在哪

    概述  503:“服务不可用”错误是一个非自定义的错误,该错误表示服务器当前无法处理该请求. 可能原因:1.管理员可能关闭应用程序池以执行维护.2.当请求到达时应用程序池队列已满.3.应用程序池标识没 ...