实在是觉得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@qq.com --fromaddr from@qq.com --passwd your_password
--smtp smtp.qq.com

还有更多的参数:

-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@qq.com",
"passwd": "password",
"server": "smtp.qq.com",
"msg": [
{
"subject": "send to me",
"to": [
"to@qq.com"
]
}
]
},
{
"fromaddr": "account@163.com",
"passwd": "password",
"server": "smtp.163.com",
"port": 587,
"connect": "tls",
"timeout": 3,
"debuginfo": false,
"interval": 3,
"msg": [
{
"subject": "test json email 11",
"to": [
"to1@qq.com",
"to2@qq.com"
],
"cc": [],
"contype": "plain",
"content": [
"\u4eba\u751fhahaha...lalala...\n",
"This is second line,\n",
"third line..."
]
},
{
"subject": "test json file 12",
"to": [
"tototo@hotmail.com"
],
"cc": [
"cc@qq.com"
],
"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保持不变。

版本

2020年10月28日:V0.21

更多对于infile模式的输入检查,可以更容易发现格式方面的问题;

infile模式下,tpye修改为contype,与inline模式对齐;

2020年10月9日:V0.20

对infile子命令输入的json文件最更多的检查;

content修改为一个string list;

2020年9月8日:V0.19

bugfix版本

2020年8月21日:V0.18

增加infile子命令

重构部分代码,bugfix

2020年7月24日:V0.17

在inline子命令中,增加--tlayer选项,支持自定义port

bugfix

2020年7月22日:V0.16

第1个版本,提供inline子命令。

-- EOF --