C#邮件定时群发工具Atilia用法实例
程序员文章站
2023-11-30 10:29:22
本文实例讲述了c#邮件定时群发工具atilia用法。分享给大家供大家参考。具体如下:
一、atilia可以做什么
atilia是一个基于命令行的c#程序,可以发送邮...
本文实例讲述了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#程序设计有所帮助。