Email Sender
使用 Python 3 实现的简单邮件发送工具。
Version: 0.1.2 (Beta)
主要功能
- 使用 SMTP 协议发送邮件
- 支持 SSL/TLS 、 STARTTLS 加密(为保证安全,强制加密发送)
- 支持邮件模板与邮件生成
- 支持向多人群发邮件
- 日志记录
- 脚本执行
- 多线程发送邮件
邮件模板介绍
使用HTML格式编写模板,遵循如下正则表达式实现文本替换:
\{\s*%\s*(label)\s*%\s*\}
例如:
{% name %}
其中,label
为定位用于替换的标签,遵守 Python 变量名命名规则,且不为 receiver, subject, receiver_name, attachments, email_id 中的任意一个, 如例子中的 name
。
替换内容位于配置文件的 receivers.replace 和 template.global.replace 中, 可以分别设置每位接收者的替换信息和全局的替换信息。
当提供了不存在的 label
会被忽略,当模板中的标签没有可替换的项时会原样输出。
当发生替换时,整个标签都会被替换,如 {% name %},你好
当 name=Holger
时会替换为 Holger,你好
。
template 目录中提供了一个模板可供参考。
配置文件介绍
使用 Yaml 作为配置文件,其具体格式如下:
mail: # 发件方信息
host: smtp.example.com # smtp 服务器,请询问邮件服务提供商
port: 587 # smtp 发送端口,请询问邮件服务提供商
starttls: true # 是否开启 starttls,默认为 false
user: [email protected] # 发送方 Email
passwd: password # 发送方密码或授权码
name: Your name # 可选,发送方名字
template: # 邮件模板信息
use_file: true # 是否提供一个 html 文件作为模板
file: /path/to/template/filename.html
# 当 use_file=false, 须提供 content 作为模板的内容
global: # 全局配置,可选(每一项都可选),下方接收者的配置会将其覆盖
subject: For Test # 邮件主题,和下方的至少一个不为空
attachments: [] # 附件文件路径列表
replace: # 替换内容 格式为 `label: 替换的文本` 下同
message: This is a test email.
receivers: # 接收者信息,为 yaml 数组
-
email: [email protected] # 接收者 Email
name: User # 可选,接收者名字
subject: For Test, Email Sender # 邮件主题,和上方的至少一个不为空
attachments: [] # 可选,附件文件路径列表
replace: # 替换内容 格式为 `label: 替换的文本`
name: User
(计划内)测试的(发送)邮箱:
由于精力有限,欢迎提供不在列表内的其他邮箱测试!
- Outlook
- host: smtp.office365.com
- port: 587
- starttls: true
- QQ Mail / foxmail.com
- host: smtp.qq.com
- port: 587 (starttls: true) 或 465 (starttls: false)
- passwd: 填写授权码,请参考官方文档
- 163 Mail
- host: smtp.163.com
126,yeah.net 邮箱请自行更换服务器地址中相关参数。例如 smtp.126.com 和 smtp.yeah.net
- port: 465
- starttls: false
- passwd: 填写授权码,请参考官方文档
- host: smtp.163.com
- Gmail (需要更多测试)
- host: smtp.gmail.com
- port: 587 (starttls: true) 或 465 (starttls: false)
需要能够正常访问 Gmail 的网络环境。若无法登录,请参考官方文档
- SUDA 学生邮箱 stu.suda.edu.cn (使用该邮箱发送的邮件可能被认为是垃圾邮件)
- host: smtp.stu.suda.edu.cn
- port: 465
- starttls: false
运行方法
-
从控制台运行:
运行 console-tool.py 或者下载二进制文件,默认读取运行目录下的 config.ini 文件;可以指定 -c/--config 参数给出 Yaml 配置文件路径。
-
作为 package 附加于其他项目运行:
参考 console-tool.py 的代码。实际上,可以将配置项存储为字典,调用 Poster.sender.send_email 并传入配置项即可。
Q&A
-
遇到错误:SMTPAuthenticationError: (535, b'5.7.3 Authentication unsuccessful ...').
请检查邮箱是否能够正常登录。
-
遇到错误:SMTPServerDisconnected: Connection unexpectedly closed
请检查端口是否有误。