首页 > 编程 > C# > 正文

C#邮件定时群发工具Atilia用法实例

2020-01-24 01:31:36
字体:
来源:转载
供稿:网友

本文实例讲述了C#邮件定时群发工具Atilia用法。分享给大家供大家参考。具体如下:

一、Atilia可以做什么

Atilia是一个基于命令行的C#程序,可以发送邮件给一个或多个人。Atilia通过QQ的SMTP服务发送邮件,可以发送附件,可以在配置文件中手动配置收信人。

二、运行Atilia需要什么

在Atilia应用程序的同一目录下,有如下文件

1)一个Attachments文件夹,Atilia会将里面所有的子文件(不含子文件夹及其中文件)视作附件发送给收信人

2)AddressBook.xml文件,用于配置收信人

3)Atilia.html文件,是被发送的邮件文本

这三个文件都位于编译环境中的根目录下,在“程序集属性→生成事件→后期生成事件命令行”中可以将编译环境中的文件复制到Debug目录中

xcopy "$(ProjectDir)Atilia.html" "$(TargetDir)" /Yxcopy "$(ProjectDir)AddressBook.xml" "$(TargetDir)" /Yxcopy "$(ProjectDir)Attachments/*" "$(TargetDir)/Attachments/" /Y

三、收信人的配置

收信人配置的规则很简单,保存在AddressBook.xml中

<?xml version="1.0" encoding="gb2312"?><!--通讯录--><Root Subject="测试邮件"> <Person Name="江有汜" Email="1239063237@qq.com" /> <Person Name="淫侠" Email="****@qq.com" /></Root>

每一个Person代表了一个人,Name是后面Email的一个标识,Email是收信人的地址

Atilia运行后会将邮件发给通信录中存在的每一个Person

四、输入参数

1)没有输入参数:当即准备发送所有的邮件,发送前询问是否发送:要求输入(y/n)

2)两个输入参数:8位的年月日 和 6位的时分秒,如2014年9月30日23时40分00秒,就需要输入如下命令运行:Atilia 20140930 234000

五、程序代码

using System;using System.Collections.Generic;using System.Linq;using System.Net.Mail;using System.Text;using System.Threading.Tasks;using System.IO;using System.Net.Mime;using System.Xml;using System.Text.RegularExpressions;namespace Atilia{  class Program  {    static void Main(string[] args)    {      MailMessage mlmssg = new MailMessage();      mlmssg.From = new MailAddress("1254355584@qq.com");      //读取收信人列表      Console.WriteLine("正在读取收信人列表");      XmlDocument xdoc = new XmlDocument();      xdoc.Load("AddressBook.xml");      XmlNode xroot = xdoc.SelectSingleNode("Root");      foreach (var xe in xroot.ChildNodes)      {        //判断读取到的是XmlElement而不是注释        if (xe is XmlElement)        {          mlmssg.To.Add((xe as XmlElement).GetAttribute("Email"));          Console.WriteLine("增加收信人 {0} 邮箱地址为 {1}",            (xe as XmlElement).GetAttribute("Name"),            (xe as XmlElement).GetAttribute("Email"));        }      }      Console.WriteLine("正在生成邮件主题,设定编码格式");      mlmssg.Subject = (xroot as XmlElement).GetAttribute("Subject");      mlmssg.SubjectEncoding = System.Text.Encoding.UTF8;      Console.WriteLine("正在读取邮件内容(Atilia.html),设定编码格式");      mlmssg.Body = File.ReadAllText(        "Atilia.html", Encoding.GetEncoding("gb2312"));      mlmssg.BodyEncoding = System.Text.Encoding.UTF8;      mlmssg.IsBodyHtml = true;      Console.WriteLine("设定邮件发送级别:Normal");      mlmssg.Priority = MailPriority.Normal;      //mailMessage.ReplyTo = new MailAddress("1239063237@qq.com"); //已过时      //读取附件列表      Console.WriteLine("正在读取附件列表");      if (System.IO.Directory.Exists("Attachments"))      {        System.IO.DirectoryInfo dif = new DirectoryInfo("Attachments");        if (dif.GetFiles().Count() != 0) //只读取文件,不查看子文件夹        {          System.Net.Mail.Attachment att = null;          //查询文件夹中的各个文件          foreach (FileInfo f in dif.GetFiles())          {            //分类讨论几种文件类型            switch (f.Extension.ToLower())            {              case ".rar":              case ".zip":                {                  att = new Attachment(f.FullName,                     MediaTypeNames.Application.Zip);                }                 break;              case ".pdf":                {                  att = new Attachment(f.FullName,                    MediaTypeNames.Application.Pdf);                }                break;              case ".rtf":                {                  att = new Attachment(f.FullName,                    MediaTypeNames.Application.Rtf);                }                break;              default: //其他格式不指定格式                {                  att = new Attachment(f.FullName,                    MediaTypeNames.Application.Octet);                }                break;            }            ContentDisposition cd = att.ContentDisposition;            cd.CreationDate = File.GetCreationTime(f.FullName);            cd.ModificationDate = File.GetLastWriteTime(f.FullName);            cd.ReadDate = File.GetLastAccessTime(f.FullName);            Console.WriteLine("成功添加附件 {0}", f.Name);            mlmssg.Attachments.Add(att);          }        }      }      //设定SMTP服务器      Console.WriteLine("准备设置SMTP服务");      SmtpClient smtpclt = new SmtpClient();      smtpclt.DeliveryMethod = SmtpDeliveryMethod.Network;      Console.WriteLine("正在填写SMTP服务器地址");      smtpclt.Host = "smtp.qq.com";      Console.WriteLine("正在填写登录账户和登录密码");      smtpclt.Credentials =         new System.Net.NetworkCredential("1254355584", "****");      //没有指定时间      if (args.Length == 0)      {        //发送邮件前的最后提示        while (true)        {          Console.WriteLine("您确实要发送这些邮件吗? (y/n)");          string result;          result = Console.ReadLine();          result = result.ToLower().Trim();          if (result == "y")          {            break;          }          else if (result == "n")          {            Environment.Exit(0);          }          else          {            Console.WriteLine("输入错误");          }        }      }      else       {        int time_a = 0; //年月日        int time_b = 0; //时分秒        int time_now_a;        int time_now_b;        try        {          //时间分为两部分          //前一部分是8位数字表示的时间 如:20140930          //后一部分是4位数字表示的时间 如:210755          if (args.Length != 2)          {            throw new Exception("参数不正确");          }          //年月日          if (!Regex.IsMatch(args[0], "^[0-9]{8}$"))          {            throw new Exception("错误的时间数据");          }          bool b1 = int.TryParse(args[0], out time_a);          //时分秒          if (!Regex.IsMatch(args[1], "^[0-9]{6}$"))          {            throw new Exception("错误的时间数据");          }          bool b2 = int.TryParse(args[1], out time_b);          if ((!b1) || (!b2))          {            throw new Exception("时间数据转换失败");          }        }        catch (Exception ex)        {          Console.WriteLine(ex.Message);          Console.WriteLine("命令示例: Atilia 20140930 210755");          //按任意键继续          Console.WriteLine("按任意键继续...");          Console.ReadKey();          Console.WriteLine("/b");          Environment.Exit(0);        }        int counter = 0;        while (true)        {          time_now_a = DateTime.Now.Year * 10000 +             DateTime.Now.Month * 100 + DateTime.Now.Day;          time_now_b = DateTime.Now.Hour * 10000 +            DateTime.Now.Minute * 100 + DateTime.Now.Second;          if (time_now_a < time_a ||             (time_now_a >= time_a && time_now_b < time_b))          {            System.Threading.Thread.Sleep(500);            counter++;            if (counter % 10 == 0)            {              Console.WriteLine("正在等待发信时间 {0} {1}",                time_a, time_b);              counter = 0;            }          }          else          {            break;          }        }      }      //发送邮件      Console.WriteLine("正在发送邮件,请稍候 ...");      smtpclt.Send(mlmssg);      //mail from address must be same as authorization user      //QQ邮箱→设置→账户→POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务      //勾选POP3/SMTP服务      Console.WriteLine("邮件发送完毕,正在释放资源");      smtpclt.Dispose();      mlmssg.Dispose();      Console.WriteLine("按任意键继续...");      Console.ReadKey();      Console.WriteLine("/b");    }  }}

附:庆祝国庆节的Atilia.html内容

<html>  <head>    <title>      国庆快乐!    </title>     <style>       body{text-align:center}     </style>  </head>   <body>    <span style="color:red;font-size:250%;font-weight:800">      江有汜 携 Atilia 恭祝大家 国庆快乐!!!    </span>    <hr />      <img src="http://upload.wikimedia.org/wikipedia/commons/c/ce/Chinese_flag_%28Beijing%29_-_IMG_1104.jpg"         alt="中华人民共和国国旗" height="400" width="660"/>    <hr>    <b>十一小长假,可要注意好好休息啊~~~</b><br>    <p>      图片来源:      <a href="http://upload.wikimedia.org/wikipedia/commons/c/ce/Chinese_flag_%28Beijing%29_-_IMG_1104.jpg">        维基共享资源:飘扬在北京的五星红旗      </a>    </p>    <p>      程序源码:      <a href="http://my.oschina.net/Tsybius2014/blog/323703">        源码地址      </a>    </p>    刮开涂层赢千万大奖:    <span style="background-color:black;color:black">      Atilia 很萌的,乃们不要黑她 :P    </span>   </body></html>

发送后的效果展示:

希望本文所述对大家的C#程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表