SMTP库实现邮件发送
SMTPLIB服务配置
自动化邮件发送,首先需要将邮箱的配置存放在代码之中,才可以实现通过代码访问邮箱,来进行邮件的发送功能。
不同的邮箱有不同的配置,对应邮箱的设置,建议百度搜索一下,课程中会以QQ邮箱为例。
QQ邮箱的授权流程:
- 进入QQ邮箱
- 进入设置页
- 找到第三方服务选项
- 将IMAP/SMTP服务启动(需要验证码进行启动校验)
- 生成授权码(需要严重,但是在第一次开启时会默认生成授权码)
- 保存授权码到本地即可
邮箱的授权码不是你的邮箱登录密码,这是两个完全不同的东西。在代码实现中需要的是授权码,不是登录密码。
各类邮件发送实现
SMTPLIB库是python官方自带的库,所以不需要安装。可以实现邮件的发送。可以对邮件的内容进行各种类型的定义。
文本邮件发送
最常规的邮件发送形态,邮件内容全部是文本的形式。也是smtp库最基本的邮件发送形态。
py
import smtplib
from email.header import Header
from email.mime.text import MIMEText
# 定义邮箱相关信息
sender = '[email protected]' # 发件人
receiver = '[email protected]' # 收件人
pass_code = 'akbbytiioguqbbjg' # 授权码
# 邮箱服务连接
conn = smtplib.SMTP('smtp.qq.com', 25)
# 邮件内容定义
text = '这是一封文本邮件,基于SMTP来实现的邮件发送' # 邮件正文
context = MIMEText(text, 'plain', 'utf-8')
# 定义收件人和发件人
context['From'] = sender
context['To'] = receiver
# 定义邮件主题
email_theme = '这是邮件主题'
context['Subject'] = Header(email_theme, 'utf-8')
# 发送邮件
conn.login(sender, pass_code) # 登录smtp服务,用帐号和授权码登录
conn.sendmail(sender, receiver, context.as_string()) # 邮件发送
# 关闭服务
conn.close()
HTML格式的邮件发送
发送HTML格式的邮件其实与文本邮件的发送是差不多的。唯一需要注意的就是要将邮件内容定义为HTML格式。让SMTPLIB支持这种格式。
py
import smtplib
from email.header import Header
from email.mime.text import MIMEText
sender = '[email protected]'
receiver = '[email protected]'
pass_code = 'akbbytiioguqbbjg'
conn = smtplib.SMTP('smtp.qq.com',25)
text = '''
<html>
<p>
<a href="www.baidu.com.cn">这是html链接</a>
</p>
</html>
'''
contect = MIMEText(text,'html','utf-8')
contect['From'] = sender
contect['To'] = receiver
mail_temet = '这是邮件主题'
contect['Subject'] = Header(mail_temet,'utf-8')
conn.login(sender,pass_code)
conn.sendmail(sender,receiver,contect.as_string())
conn.close()
带有附件的邮件发送
发送带有附件的邮件,最大的不同在于附件本身。因为附件的调用方法和内容,与普通邮件的发送有区别。其余内容基本没有太大差别。
py
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# 定义邮箱相关信息
sender = '[email protected]' # 发件人
receiver = '[email protected]' # 收件人
pass_code = 'akbbytiioguqbbjg' # 授权码
# 邮箱服务连接
conn = smtplib.SMTP('smtp.qq.com', 25)
# 邮件内容定义
text = '这是一封文本邮件,基于SMTP来实现的邮件发送' # 邮件正文
content = MIMEText(text, 'plain', 'utf-8')
email = MIMEMultipart()
# 附件1
att = MIMEText(open('./attach/timg.gif', 'rb').read(), 'base64', 'utf-8')
att.add_header('Content-Type', 'octet-stream')
att.add_header('Content-Disposition', 'attachment', filename='attach_first.gif')
email.attach(att)
# 附件2
with open('./attach/timg.jpg', 'rb') as file:
att1 = MIMEText(file.read(), 'base64', 'utf-8')
att1.add_header('Content-Type', 'octet-stream')
att1.add_header('Content-Disposition', 'attachment', filename='attach_first.jpg')
email.attach(att1)
email.attach(content)
# 定义收件人和发件人
email['From'] = sender
email['To'] = receiver
# 定义邮件主题
email_theme = '这是邮件主题'
email['Subject'] = Header(email_theme, 'utf-8')
# 发送邮件
conn.login(sender, pass_code) # 登录smtp服务,用帐号和授权码登录
conn.sendmail(sender, receiver, email.as_string()) # 邮件发送
# 关闭服务
conn.close()
配置项设置
在实际邮件发送的时候,不同的项目组会有不同的项目组成员,一般组员都是固定的。所以我们有更好的方式来实现邮件的发送,就是通过配置项的定义,让邮件发送的时候直接通过读取配置项,来完成对收件人的配置。
收发件人配置文件email_conf.ini
py
[email_project_a]
sender = 1026260455@qq.com
receiver = 1026260455@qq.com,1017386624@qq.com
pass_code = akbbytiioguqbbjg
邮件内容配置文件email_text.ini
py
[email_text]
theme = 这是邮件的主题哦
text = 这是一封邮件正文哈哈哈哈哈
html = <html>
<p>
<t>点击一下跳转百度</t>
<a href="www.baidu.com">这是html链接</a>
</p>
</html>
发送邮件
py
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from step4.mail.read_conf import read_conf
from step4.mail.smtp_demo.read_text_conf import read_text_conf
# 定义邮件发件人、收件人、授权码
data = read_conf()
sender = data['sender']
receivers = []
for r in data['receiver'].split(','):
receivers.append(r)
receiver = receivers
pass_code = data['pass_code']
# 邮件服务连接
conn = smtplib.SMTP('smtp.qq.com', 25)
# 定义邮件正文
data_text = read_text_conf()
text = data_text['text']
# print(text)
# 定义邮件超链接内容
html = data_text['html']
content = MIMEText(html, 'html', 'utf-8')
content['From'] = sender
content['To'] = data['receiver']
# 定义邮件主题
theme = data_text['theme']
# print(theme)
content['Subject'] = Header(theme, 'utf-8')
# 登录
conn.login(sender, pass_code)
# 发送邮件
conn.sendmail(sender, receiver, content.as_string())
# 关闭邮件
conn.close()