内容题要
- 用
SMTP_SSL()
或者.starttls()
进行与服务器的安全连接 - 用python内置的
smtplib
测试发送基本的邮件 - 发送HTML格式的内容
- 发送附件
- 结合CSV文件发送匹配到人的文件信息
- 比如名字,ID,等等
- 使用
Yagmail
更方便的发送邮件(傻瓜式)
准备步骤
Python内置的smtplib
模块使用的是SMTP协议(Simple Mail Transfer Protocol)。方便起见,我们就以QQ邮箱的SMTP设置来一步一步的讲解。
第一步,设置QQ邮箱。
- 点击左上角的【设置】选项
- 点击【账户】,然后拉到下面,看到如下设置
-
保证SMTP服务处于开启状态。同时,点击生成授权码
-
生成的授权码就是通过python登录邮箱的密码
老少爷们儿,上硬菜啦
为了保证零基础也能明白每个代码的作用,我会尽量把前戏做足,保证整个过程sweet and slow。毕竟九浅一深才是最好的教学。
当然,我也考虑到很多人并不想要教学,所以我会给大家推荐一个傻瓜式的插件Yagmail,非常的方便以及人性化。如果你不想看我BB原理,可以直接跳到Yagmail。
稍显复杂的办法
发送邮件之前
在发邮件之前,首先你得保证SMTP链接是加密的,为了安全,多层膜总是好的。SMTP有两种加密协议:
- SSL (Secure Sockets Layer)
- TLS (Transport Layer Security)
对应的在代码中的两种加密方式:
- 在连接时就用
SMTP_SSL()
方法加密 - 在连接后用
.starttls()
方法加密
具体怎么用后文会有代码讲解。
不过需要注意的是,我们在使用SSL加密的时候,还需要使用creat_default_context()
正确的配置SSL的环境。说人话就是,有膜,也要戴紧。
使用SMTP_SSL()
import smtplib, ssl
email_host = "smtp.qq.com" # 邮箱服务器地址
port = 465 # QQ邮箱端口
account = "my@qq.com" # 登录账号
password = "" # 密码,即授权码
# 配置SSL加密设置
context = ssl.create_default_context()
with smtplib.SMTP_SSL(host=email_host, port=port, context=context) as server:
server.login(account, password)
# TODO: Send email here
这里使用with as
是因为发送邮件后,我们希望它能自动关闭。with as
本质上就是__enter__
和__exit__
的结合,同时它还可以重复循环。
有不理解的地方可以看我上传的资源和笔记。
使用.starttls()
如前文所说,我们除了在连接开始时就加密以外,也可以连接以后再进行加密。
我个人不是很推荐这种方式,不太方便,也容易出错。
注意,SSL和TLS的端口不一样。
import smtplib, ssl
email_host = "smtp.qq.com" # 邮箱服务器地址
port = 587 # QQ邮箱TLS端口
account = "my@qq.com" # 登录账号
password = "" # 密码,即授权码
# 配置SSL加密设置
context = ssl.create_default_context()
# 尝试登录和发送邮件
try:
server = smtplib.SMTP(email_host, port)
server.ehlo() # 给服务器打个招呼,可以省略
server.starttls(context = context)
server.login(account, password)
# TODO: Send email here
except Exception as e:
# Print any error messages to stdout
print(e)
finally:
server.quit()
发送纯文字的邮件
发送邮件的命令需要三个最基本的参数设置,分别是:发件人,收件人,内容。这个不难理解吧?所以我们需要设置好这三个变量,然后调用.sendmail()
方法。
sender_email = "my@qq.com"
receiver_email = "your@qq.com"
message = '''\
Subject:greetings from Zauner
Welcome to Zaun, asshole'''
server.sendmail(sender_email, receiver_email, message)
而实际使用中,文本类型为中文或者英文的设置是不同的,所以我会分开讲解。