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

本文实例讲述了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)" /Y
xcopy "$(ProjectDir)AddressBook.xml" "$(TargetDir)" /Y
xcopy "$(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#程序设计有所帮助。

(0)

相关推荐

  • PHP实现邮件群发的源码

    复制代码 代码如下: <?php  // 请求 PHPmailer类 文件  require_once("class.phpmailer.php"); //发送Email函数  function smtp_mail ( $sendto_email, $subject, $body, $extra_hdrs, $user_name) {  $mail = new PHPMailer();   $mail->IsSMTP();                          

  • Delphi7中群发Email邮件的方法

    本文实例讲述了Delphi7中群发Email邮件的方法.分享给大家供大家参考.具体分析如下: 这段时间需要对所有参加考试的考生将考生信息及考试信息通过电子邮件群发,经过多次调试,算是成功了,发来给大家参考一下: 总的思路是: 1.安装局域网版的邮件服务器,并通过设置DNS使得给服务器能给网外用户发送电邮,这方面的软件比较多,例如WinWebMail就不错,可以从官网下载:   2.需要使用到的控件:Indy10.0.15,可以通过百度搜索下载:   3.设置需要发送的电子邮箱服务器及账号信息 复

  • Python群发邮件实例代码

    直接上代码了 复制代码 代码如下: import smtplibmsg = MIMEMultipart() #构造附件1att1 = MIMEText(open('/home/a2bgeek/develop/python/hello.py', 'rb').read(), 'base64', 'gb2312')att1["Content-Type"] = 'application/octet-stream'att1["Content-Disposition"] = '

  • C#简单邮件群发通用类

    本文实例为大家介绍了C#邮件群发通用类,供大家参考,具体内容如下 public static class Email { /// <summary> /// 发件人 /// </summary> public static string mailFrom { get; set; } /// <summary> /// 收件人 /// </summary> public static string[] mailToArray { get; set; } ///

  • C++实现邮件群发的方法

    本文实例讲述了C++实现邮件群发的方法.分享给大家供大家参考.具体如下: 关于生成随机QQ邮箱不精确的问题,在之后版本打算另写一个采集器插件进行帐号采集,所以,这个软件只用来进行内容发送,邮箱进行随机生成 如果你已经有采集来的QQ号,请复制到SendList.txt 替换内容即可 可以直接复制HTML代码到邮件内容,保存即可.目前邮件内容最大设置为10000字节,如果有增大的必要,欢迎提交留言. 这是我学习后VC编程中涉及到多线程,socket,及一些WINDOWS API的宗合应用 使用说明:

  • PHP邮件群发机实现代码

    原理: 第一:申请大量的邮箱帐号 腾讯的 126的 163的 新浪的 雅虎的 谷歌的 等等提供smtp服务的 第二:收集你要发送邮件的邮件列表 第三:遍历邮件列表,每一个邮件发送邮件 第四:用linux下定时脚本后台运行 我跑了两天 哈哈 ,因为为了尽可能的保证每一个都发送成功 原理是很简单,但是其中还是遇到很多的问题. 第一:邮件失败的问题,我这里采用两个方式解决,第一把大量的那些邮箱帐号依次去发送,直到成功.然后每次发送500封邮件 后把发送邮箱列表随机打散(避免一个持续失败). 我用的是p

  • 我的群发邮件程序

    <HTML> <TITLE> UNTITLED </TITLE> <?php  include "connect.inc.php"; if ($subject) { $query = "select name,email from user"; $res = mysql_query($query);  $row = mysql_fetch_array($res);  while ($row) { mail($row['ema

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

    本文实例讲述了C#邮件定时群发工具Atilia用法.分享给大家供大家参考.具体如下: 一.Atilia可以做什么 Atilia是一个基于命令行的C#程序,可以发送邮件给一个或多个人.Atilia通过QQ的SMTP服务发送邮件,可以发送附件,可以在配置文件中手动配置收信人. 二.运行Atilia需要什么 在Atilia应用程序的同一目录下,有如下文件 1)一个Attachments文件夹,Atilia会将里面所有的子文件(不含子文件夹及其中文件)视作附件发送给收信人 2)AddressBook.x

  • Python的批量远程管理和部署工具Fabric用法实例

    本文实例讲述了Python的批量远程管理和部署工具Fabric用法.分享给大家供大家参考.具体如下: Fabric是Python中一个非常强大的批量远程管理和部署工具,常用于在多个远程PC上批量执行SSH任务. 常见的使用方法大概总结如下: 1. 首先,要将批量执行的任务写入到一个fabfile.py中, 复制代码 代码如下: # -*- coding:utf-8 -*-    from fabric.api import run, local, roles, env, cd  env.host

  • Java实现的获取和判断文件头信息工具类用法示例

    本文实例讲述了Java实现的获取和判断文件头信息工具类用法.分享给大家供大家参考,具体如下: package test; import java.io.FileInputStream; import java.io.IOException; import java.util.HashMap; /** * 获取和判断文件头信息 * * @author Sud * */ public class GetTypeByHead { // 缓存文件头信息-文件头信息 public static final

  • java编程实现邮件定时发送的方法

    本文实例讲述了java编程实现邮件定时发送的方法.分享给大家供大家参考,具体如下: 最近做项目时客户提出了一个需求:系统定时发送E-mail到其客户,达到通知的效果.先将实例分享给大家,如果确实有一些帮助的话,请大家来点掌声! 首先介绍java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask) 如: 每隔一个小时执行任务 timer.schedule(TimerTask,

  • php的curl封装类用法实例

    本文实例讲述了两个php curl封装类的用法实例,这两个函数可以让我们非常的方便的使用php curl相关函数.分享给大家供大家参考.具体如下: 使用函数之前我们要需要把php curl模块打开(libeay32.dll, ssleay32.dll, php5ts.dll, php_curl.dll) 开启php curl函数库的步骤 1).去掉windows/php.ini 文件里;extension=php_curl.dll前面的; /*用 echo phpinfo();查看php.ini

  • Android 中WallpaperManager用法实例

    Android 中WallpaperManager用法实例 注意:壁纸的设置得加入权限: <uses-permission android:name="android.permission.SET_WALLPAPER"/> 1.WallpaperManager  对象的获得: wallpaperManager =WallpaperManager.getInstance(this); 2.设置壁纸的方法: 方法一:wallpaperManager.setBitmap(); /

  • Vue2.0基于vue-cli+webpack Vuex的用法(实例讲解)

    在这之前,我已经分享过组件与组件的通信机制以及父子组件之间的通信机制,而我们的vuex就是为了解决组件通信问题的 vuex是什么东东呢? 组件通信的本质其实就是在组件之间传递数据或组件的状态(这里将数据和状态统称为状态),但可以看到如果我们通过最基本的方式来进行通信,一旦需要管理的状态多了,代码就会变得十分臃肿和庞大.对所有状态的管理便会显得力不从心,因此,vuex出现了,他就是帮助我们把公用的状态全抽出来放在vuex的容器中,然后根据一定的规则来进行管理,我们赶紧来用一下吧,想要掌握vuex的

  • Java编程BigDecimal用法实例分享

    Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类. BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念. float和Double只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigIn

  • Python定时执行之Timer用法示例

    本文实例讲述了Python定时执行之Timer用法.分享给大家供大家参考.具体分析如下: java中Timer的作用亦是如此.python中的线程提供了java线程功能的子集. #!/usr/bin/env python from threading import Timer import time timer_interval=1 def delayrun(): print 'running' t=Timer(timer_interval,delayrun) t.start() while T

  • Thinkphp自定义代码生成工具及用法说明(附下载地址)

    本文实例讲述了Thinkphp自定义代码生成工具及用法说明.分享给大家供大家参考,具体如下: 我最近沮丧的发现在使用Thinkphp很多时候我都在做重复的事情,比如重复写最简单的CRUD方法,编写表单,写前台样式表等等. Thinkphp对于后台操作的支持已经非常强大,再加上最近非常流行的Bootstrap框架让前台样式也变得容易遵循一个标准,于是我决定开始写一个属于自己的代码生成器. 我希望它操作足够简单,让人一看就懂,对MySql和Sqlite数据库都能够稳定生成CRUD代码就好,还如果还能

随机推荐