半小时自制自动邮件收作业系统
James Swineson
已而!已而!
今天听说有一帮学生和助教在吵架,助教说你们交作业邮件不写正文很不尊重人诶,学生说本来交个作业就好的事情何必再假惺惺写个正文问声好,助教说你这样子搞得我们收作业很像机械操作诶……等等!通过电子邮件收作业本来就是个机械操作吧?我说助教们诶你们又何必通过这样的方式来刷一点可怜的存在感呢?今天我来告诉你们怎么半小时自己写出一个完全自动化的邮件收作业系统吧。
技能点需求
- Python 3
- SQLite 3
- POP3 协议基础
- DNS 配置基础
- 会使用电子邮件
系统架构
- 一台邮件转发服务器把所有发送到特定域的电子邮件(比如 homework_label_N@homework.example.com)都转发到某个邮箱;
- 我们的程序从该邮箱拉取邮件列表,然后通过接收地址来区分这是哪一堂课的作业;
- 自动下载附件到同一个文件夹。
搭建邮件转发服务器
这里我们用 @http://experimental.swineson.me 域作为演示用的收作业邮箱域,转发服务器利用免费的 http://improvmx.com/,邮件转发到 emaildispatcher@swineson.me 。
首先花一分钟注册 emaildispatcher@swineson.me 这个邮箱,打开 POP3 功能;(为了方便我用了自己域名下的邮件服务,如果用公用服务的话强烈不推荐 163 系邮箱,因为 163 系邮箱开 POP3 功能强制要求绑定手机号,很不方便;QQ 什么的就挺好嘛。另外能关掉垃圾邮件过滤功能的话尽量关掉,因为只有附件的邮件很容易被当成垃圾邮件,不要问我怎么知道的。)
然后花一分钟在 http://experimental.swineson.me 域下面设置好 MX 记录;
最后花一分钟前往 http://improvmx.com/ 完成转发设置;
自动收取邮件和下载附件
还剩 27 分钟来写程序,我一点都不慌。这个本地程序需要做这么一些事情:
- 隔一段时间轮询新邮件
- 如果新邮件的收件人符合预先定义的 homework_tag@experimental.swineson.me 格式,那么下载该邮件的附件,保存到预设的文件夹中,否则无视之
- 维护一个已下载邮件数据库,因为 POP3 是个“离线工作的协议”,不能和服务器传递已读状态
这一部分我们用 Python 3 来完成,因为写起来方便嘛。代码见 Jamesits/auto-email-homework-fetcher/blob/master/fetch.py,总共不到九十行。
要直接使用的话,
git clone https://github.com/Jamesits/auto-email-homework-fetcher.git
cd auto-email-homework-fetcher
cp config-example.ini config.ini
修改 config.ini,在 mailbox section 填写 emaildispatcher@swineson.me 对应的登录信息,参考最下面的两个 section 增加一个新的 section,再在 config/tasks 里面填入该 section 的名字,最后我们会得到这样一个配置文件:
[mailbox]
server = pop.exmail.qq.com
port = 995
username = emaildispatcher@swineson.me
password = 不告诉你
[config]
;; interval in seconds. set to 0 to disable.
check\_interval = 60
db\_path = data.db
base\_folder = homeworks
tasks = english\_homework\_20160701
[english\_homework\_20160701]
receiver = 20160701@experimental.swineson.me
folder = english\_20160701
运行 fetcher.py,所有发送到 20160701@experimental.swineson.me 这个地址的邮件附件就会被下载到 homeworks/english_20160701 目录了。是不是超级方便呢?
以下是我测试期间的程序运行截图。
完整代码参见:Jamesits/auto-email-homework-fetcher
结语
我觉得吧,这种真・机械化操作,人还是别出来刷存在感了,交给程序来做,你也轻松,其他人也轻松。就像 Reddit 上那个自称入职以后花了 50 小时自动化了所有工作,然后接下来六年什么都没干,六年之后终于被老板发现开除的哥们儿的伟大事迹一样,虽然最后证明整件事情是他在吹牛逼,但这才是我们应该不懈追求的方向嘛!