引言

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

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

所以抽点时间写了一个工具,使用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. iOS-多线程-GCD

    一. 名词解释: 1. 进程和线程 进程是指在系统中正在运行的一个应用程序.每个进程之间都是独立的,每个进程均运行在期专用而且受到保护的内存空间中. 线程是指一个进程想要执行任务,就必须要有线程.线程 ...

  2. 设计模式之Iterator模式(2)

    这篇文章比较简单,作一个笔记. 模拟Iterator. Iterator接口: package cn.asto.Interator; public interface Iterator { publi ...

  3. CART(分类回归树)原理和实现

    前面我们了解了决策树和adaboost的决策树墩的原理和实现,在adaboost我们看到,用简单的决策树墩的效果也很不错,但是对于更多特征的样本来说,可能需要很多数量的决策树墩 或许我们可以考虑使用更 ...

  4. LeetCode - 30. Substring with Concatenation of All Words

    30. Substring with Concatenation of All Words Problem's Link --------------------------------------- ...

  5. 【原创随笔】Sql2008 R2 做CQRS小结

    1.做数据同步,订阅服务器只要把数据库建好就可以了,至于表和存储过程以及其它的都不管,订阅的时候会自动创建这些信息. 2.选择事务发布(如果同步表,表至少要带主键,不然不能选择) 3.在发布的时候,用 ...

  6. 重新想象 Windows 8 Store Apps (43) - 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel)

    [源码下载] 重新想象 Windows 8 Store Apps (43) - 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel) 作者:webabcd 介绍重新想象 W ...

  7. python-set集合类方法

    s1=set([11,22,33,44,'Tom','tony',11,77,2.5,])返回的是{11,22,33,44,'Tom','tony',77,2.5}(注意:返回的并不是一个字典,只是告 ...

  8. ningx配置ModSecurity重启出现兼容性问题:ModSecurity: Loaded PCRE do not match with compiled!的解决方法

    nginx开启错误日志,然后重启nginx,出现如下信息: 2016/12/03 09:40:38 [notice] 18858#0: ModSecurity for nginx (STABLE)/2 ...

  9. Oracle 中 call 和 exec的区别

    今天发现了一个小东西,觉得很有意思,查找了一些资料,跟大家分享一下: 在sqlplus中: 在第三方提供的工具(如:plsqldev) 总结: exec是sqlplus的命令,只能在sqlplus中使 ...

  10. 关于网络上的各种mysql性能测试结论

    关于网上的各种性能测试帖子,我想说以下几点: 1.为了使性能测试更加的客观.实际,应该说明针对什么场景进行测试,查询.还是修改,是否包含了主键,包含了几个索引,各自的差别是什么.因为不同的mysql分 ...