实在是觉得Linux下的mail和mailx工具难用,太复杂,于是自己用Python写了个简单的,maily,练练手。
maily分两个模式,inline和infile,即两个subcommand。
inline,发送邮件的所有参数都在命令行输入,不会去读取任何配置文件,除了命令行指定的一个或多个附件。
infile,发送邮件的所有参数都从一个JSON配置文件中读出来,可批量发送。JSON文件中可以设置多个邮件发送账号,每个发送账号可以带多个Email消息内容。(需求来自公司每个月要给员工发送工资条)
inline子命令
既然所有参数都在命令,命令就一定很长,没办法,不过有些参数有默认值,可以不输入。
$ python3 maily.py inline --subject a_title --content test_content
--to to@ --fromaddr from@ --passwd your_password
--smtp
还有更多的参数:
-a,添加附件;
--cc和--bcc,添加抄送和密送名单;
还有 --port, --tlayer 等参数,具体请看:python3 maily.py inline -h
python3 maily.py inline -h
值得一说的是,maily可以接收通过管道过来的数据作为 --content 参数的内容,比如你可以在命令行这样:
$ python3 maily.py inline ... < content.txt
$ echo 'your content' | python3 maily.py inline ...
--content 参数内容中的 \n,就是换行。而通过echo命令过来的内容,如果不使用-e参数,\n就是\n两个字符。
--contype 可以是 html,此时 --content 的内容就是一串自己定义的html格式的字符串。
infile子命令
$ python3 maily.py infile msg.json
infile模式的命令行就很简单了,只需要带上一个JSON格式的文件即可。repo中提供了一个简单的msg.json文件作为示例。
msg.json的内容如下:
$ cat msg.json
[
{
"fromaddr": "account@",
"passwd": "password",
"server": "",
"msg": [
{
"subject": "send to me",
"to": [
"to@"
]
}
]
},
{
"fromaddr": "account@",
"passwd": "password",
"server": "",
"port": 587,
"connect": "tls",
"timeout": 3,
"debuginfo": false,
"interval": 3,
"msg": [
{
"subject": "test json email 11",
"to": [
"to1@",
"to2@"
],
"cc": [],
"contype": "plain",
"content": [
"\u4eba\u751fhahaha...lalala...\n",
"This is second line,\n",
"third line..."
]
},
{
"subject": "test json file 12",
"to": [
"tototo@"
],
"cc": [
"cc@"
],
"bcc": [],
"contype": "html",
"content": [
"
2222...hahaha...lalala..."
],
"attachment": [
"/home/pi/test/hh1.c",
"/home/pi/test/hh1"
]
}
]
}
]
应该都能看懂哈。。。
整体是一个list,每个smtp账号对应一个object,object内用msg这个list来包含一个或多个Email!其中有一些item是optional的,可以不出现,maily会直接使用默认值。
interval这个参数表示,对于每一个账号,每发送一封Email后的间隔时间。(也许能够有一点点anti-spam的效果)
我在公司制作的发工资条系统是这样的:用一个独立的工具,将财务那边的Excel文件转换成maily能够识别的JSON格式,--contype 用 html,--content 内有一个表格......最后用maily跑一遍即可。不管财务制作的工资Excel文件的格式是什么样的,只需要调整那个用于转换的工具,而maily保持不变。
版本
10月28日:V0.21
更多对于infile模式的输入检查,可以更容易发现格式方面的问题;
infile模式下,tpye修改为contype,与inline模式对齐;
10月9日:V0.20
对infile子命令输入的json文件最更多的检查;
content修改为一个string list;
9月8日:V0.19
bugfix版本
8月21日:V0.18
增加infile子命令
重构部分代码,bugfix
7月24日:V0.17
在inline子命令中,增加--tlayer选项,支持自定义port
bugfix
7月22日:V0.16
第1个版本,提供inline子命令。
-- EOF --