使用Python发邮件(顺便写了一个小工具以方便实验室服务器运维)

前言:

命令行方式发邮件是非常重要的一个功能,搞过服务器运维的同学们肯定深有感触。如果一台服务器的 ip 设置为自动分配,服务器每次重启都会改变 ip ,经常去机房查ip是一件非常抓狂的事情。我今天参考了一些资料学习了一下 sendmail ,写了个小脚本,支持发送图片/附件/html等,可以用来发送日志等。
源代码在这里:

我基于这个函数做了一个自动获取IP(ifconfig)和服务器日志(dmesg)的小脚本,在这里:

大致的用法:

只需要构造三个字典变量:
  1. sender: 记录发送者的信息,包括smtp服务器地址(比如qq,163什么的一般都会提供,不过需要在设置里面开启smtp才行)
  2. receivers: 记录收邮件的人的信息,可以指定多个邮件接收者
  3. mail: 定义邮件的内容,包括附件等信息。

配置示例:

sender = {
'address': 'sender@domain.tld',
'nickname': 'My Name',
'password': 'password',
'smtp_server': 'smtp.domain.tld',
'smtp_port': 465, }
receivers = [('Your Name', 'receiver@domain.tld')]
mail = {
'content': 'Email Content',
'content_html': '<html><body><h1>HTML Email Content</h1><img src="cid:image1"></body></html>',
'subject': 'Email subject',
'attachments': [('filename', 'string_or_bytes_like_data')],
'images': [{
'Content-ID': 'image1',
'data': '''bytes which is read from file, i.e. open("pic.png", "rb").read(),
and use html type mail with <img src="cid:image1">'''}],
}

前两个变量的配置大家大概都能明白,receivers 是个 list,往后面多 append 几个 tuple 就可以实现发送给多个邮件接收者了。其中 list 中每个元素都是一个 tuple,第一个元素为接收者的名字,第二个元素是接收者的邮箱。

mail里面,Subject(主题)肯定必须填写,其他的都可以不填。content 和 content_html 两个填一个就行,没必要两个都写入。其中,顾名思义,content 就是纯文本的邮件正文,content_html 是 html 格式的(可以有标题、表格、图片什么的)

attachments (附件)和 images (图片)中,首先都会有一个 id,比如 attachments 的 filename 也可以换成别的(比如 log.txt),你收到的邮件附件就会是这个名字;图像的 Content-ID 是为了能够在 html 格式的正文中能引用,引用方式为 <img src="cid:Content-ID">。

attachments 和 images 的内容应当为字符串或bytes(其实还是字符串),这样设计是为了提升通用性,方便使用 open 函数读取本地文件/图片,或直接从 shell 中获取日志,或使用 requests 获取网络上的内容。

另外,本脚本可以充当一个 Python 模块,在写一些小程序发送服务端或客户端日志的时候也很方便(有兴趣的朋友也可以将它和我的自动获取免费ssr帐号的项目)结合到一起,自动向自己的邮箱定时发送ssr帐号:)

服务器运维:

我在前言放了一个可以自动发送 dmesg 和 ifconfig 的小脚本,可以把它放到某个位置(比如/sbin)然后chown root: sendmail.py; chmod 500 sendmail.py; chattr +i sendmail.py (加可执行权限&&你肯定不想让别人知道你的邮箱密码吧,当然管理员还是能看得到)
放到PATH中并且有可执行权限之后,就可以发挥你的想象力在合适的时机触发这个工具了。
  1. 比如开机的时候发一封邮件:编辑 /etc/rc.local 并加一行:sendmail.py &
  2. 定时发送:链接到/etc/cron.daily, /etc/cron.hourly....
  3. 想自己设定特别的周期:sudo crontab -e 编写 cronjob
另外,使用校园网的服务器通常无法访问外网,如果你们学校提供内网可以使用的 edu 邮箱,就用这个邮箱发信。

参考资料:

SMTP发送邮件

此博客中的热门博文

免费爬墙网站项目(ShadowSocksShare)开发简记

Ubuntu Gnome 酷炫完整指南(一):小工具篇