邮件可能是办公中最重要的通讯工具了,Python 提供了一系列的库来收发邮件,为自动化邮件提供了非常丰富的选择。本文介绍 Python 收发邮件最便捷的方式,希望对你的自动化办公有所帮助。
先介绍一下 djangomail,它是一个第三方库,从 Django 里把 mail 模块独立出来,就是 djangomail,使用方法和 Django 官方文档一模一样,用它发邮件易如反掌,比标准库 smtplib 不知道要好用多少倍。不信,请往下看。
安装:
pip install djangomail
配置
发邮件要用户名密码和邮件服务器,对吧,直接写在配置文件里。在我们的程序的目录中,新建 settings.py
写入以下信息:
EMAIL_USE_LOCALTIME = True
EMAIL_USE_SSL = True
EMAIL_HOST = 'smtp.163.com' #可以换其他邮箱,注意修改确认端口
EMAIL_PORT = 465
EMAIL_HOST_USER = 'your-username'
EMAIL_HOST_PASSWORD = '********'
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
发送普通文本邮件
只需要导入 send_mail,send_mass_mail,设置下环境变量 DJANGO_SETTINGS_MODULE
, 这是 Django 读取自定义配置文件的内容所需要的。
示例代码如下:
from djangomail import send_mail,send_mass_mail
import settings
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
receivers = ['somenzz@163.com']
send_mail(
subject="如何使用 django mail",
message="djangomail 发送邮件从未如此简单,来自 「Python七号」",
from_email=settings.DEFAULT_FROM_EMAIL,
recipient_list=receivers
)
查看下邮箱:
还可以一次发送不同的邮件给不同的人:
datatuple = (
('Subject', 'Message.', 'from@example.com', ['john@example.com']),
('Subject', 'Message.', 'from@example.com', ['jane@example.com']),
)
send_mass_mail(datatuple)
发送带附件的邮件
发送附件需要使用 EmailMessage 类,其实常用的 send_mail,send_mass_mail 函数只对 EmailMessage 少数成员函数的封装。也就是说发送附件,我们需要创建 EmailMessage 对象。
示例代码如下:
from djangomail import EmailMessage
import settings
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
receivers = ['somenzz@163.com']
email = EmailMessage(
subject='如何使用 djangomail 发送附件',
body='这里有附件',
from_email=settings.DEFAULT_FROM_EMAIL,
to = receivers,
reply_to=['897665600@qq.com']
)
email.attach_file("/Users/aaron/Documents/python-seven.jpg", mimetype="image/jpeg")
email.attach_file("./settings.py")
email.send()
检查下邮箱:
发送多彩的 html 邮件
html 可以显示丰富多彩的内容,这里以发送一个含图片的 html 为例。
需要用到标准库里的 email 模块,添加图片信息,示例代码如下:
from djangomail import EmailMultiAlternatives
from email.mime.image import MIMEImage
import settings
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
subject = 'djangomail 发送带图片的 html 邮件'
body_html = '''
<html>
<body>
<p>「Python七号」每周分享一个小技巧 </p>
<img src="cid:qrcode.jpg" />
</body>
</html>
'''
msg = EmailMultiAlternatives(
subject,
body_html,
from_email=settings.DEFAULT_FROM_EMAIL,
to=['somenzz@163.com']
)
msg.mixed_subtype = 'related'
msg.attach_alternative(body_html, "text/html")
img_dir = 'images/'
image = 'qrcode.jpg'
file_path = os.path.join(img_dir, image)
with open(file_path, 'rb') as f:
img = MIMEImage(f.read())
img.add_header('Content-ID', '<{name}>'.format(name=image))
img.add_header('Content-Disposition', 'inline', filename=image)
msg.attach(img)
msg.send()
检查下邮箱,发现图片直接显示在了邮件内容中:
扩展
其实不止发送邮件,通过实现自己的 Backend,就可以将消息发送到任何平台。
django 自己的 global_settings 其实已经有以下配置:
EMAIL_BACKEND = 'djangomail.mail.backends.smtp.EmailBackend'
只要我们按照 EmailBackend 的格式编写自己的 Backend 就可以实现自定义的消息发送,比如说发送到微信。
然后修改 settings.py 文件,将 EMAIL_BACKEND 配置为自己的 Backend 即可。
EmailBackend 继承自类 BaseEmailBackend,假如我们编写自己的 MyBackend,只需要继承 BaseEmailBackend 实现它的 send_messages 方法即可:
def send_messages(self, email_messages):
"""
Send one or more EmailMessage objects and return the number of email
messages sent.
"""
raise NotImplementedError(
"subclasses of BaseEmailBackend must override send_messages() method"
)
有个 server酱 可以发送到微信,你可以自己扩展下,我这里就不展开了。
zmail 接收邮件
Zmail 使得在 Python3 中发送和接受邮件变得更简单。你不需要手动添加服务器地址、端口以及适合的协议,zmail 会帮你完成。此外,使用一个字典来代表邮件内容也更符合直觉。
Zmail 仅支持 Python3,不依赖任何三方库。安装方法:
pip install zmail
特性:
- 自动寻找服务器地址以及端口
- 自动使用可靠的链接协议
- 自动将一个python字典映射成MIME对象(带有附件的)
- 自动添加头文件以及localhostname来避免服务器拒收你的邮件
- 轻松自定义你的头文件
- 支持使用HTML作为邮件内容
- 仅需 python>=3.5,你可以将其嵌入你的项目而无需其他的依赖
示例代码:
import zmail
server = zmail.server('yourmail@example.com', 'yourpassword')
# Send mail
server.send_mail('yourfriend@example.com',{'subject':'Hello!','content_text':'By zmail.'})
# Or to a list of friends.
server.send_mail(['friend1@example.com','friend2@example.com'],{'subject':'Hello!','content_text':'By zmail.'})
# Retrieve mail
latest_mail = server.get_latest()
zmail.show(latest_mail)
可以看出,接收最新的邮件只需要两行代码:
latest_mail = server.get_latest()
zmail.show(latest_mail)
执行结果如下:
很简洁,很好用。
文档:https://github.com/zhangyunhao116/zmail/blob/master/README-cn.md