maily:命令行邮件(批量)发送工具

2020年7月24日 / 51次阅读 / Last Modified 2020年10月28日
Email开源项目

实在是觉得Linux下的mail和mailx工具难用,太复杂,于是自己用Python写了个简单的,maily,练练手。

项目地址:https://github.com/xinlin-z/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 --

本文链接:https://www.pynote.net/archives/2308

留言区

《maily:命令行邮件(批量)发送工具》有1条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    来自另一个项目的感受:如果让用户编写json文件作为输入,处理起来实在太费劲了,要做无数的合法性判断。。。json非常适合系统之间的数据交换! [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top