目录
[1. 登录邮箱](#1. 登录邮箱)
[2. 准备数据](#2. 准备数据)
[3. 发送邮件](#3. 发送邮件)
[1. 发送附件](#1. 发送附件)
[2. 发送图片](#2. 发送图片)
[3. 发送超文本内容](#3. 发送超文本内容)
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是⼀组⽤于由源地址到⽬的地址传送
邮件的规则,由它来控制信件的中转⽅式。
python的smtplib提供了⼀种很⽅便的途径发送电⼦邮件。它对smtp协议进⾏了简单的封装。
一、准备需要发送邮件的邮箱账号
如果是163邮箱只需要准备账号和密码;如果是QQ邮箱,需要准备账号和授权码(密码不好⽤),可以
去QQ邮箱官⽹的帮助中⼼去查看授权码的获取⽅式。
二、发送邮箱的基本步骤
1. 登录邮箱
2. 准备数据
数据指的需要发送的内容。邮件内容的构建需要涉及到另外⼀个库email ,它可以⽤来构建邮件主
题以及各种形式的邮件内容(包括⽂字内容、图⽚内容、html内容、附件)等,这⼉先简单说⼀
个邮件主题和⽂本内容,其他形式的内容在后⾯邮件内容部分详细讲解。
3. 发送邮件
示例:
python
import smtplib
from email.mime.multipart import MIMEMultipart # 邮件类
from email.header import Header # 主题类
from email.mime.text import MIMEText # 邮件内容类
# 1.连接邮箱服务器
# smtplib.SMTP_SSL(邮箱服务器地址, 端口号)
connect = smtplib.SMTP_SSL('smtp.qq.com', 465)
# 2.登录邮箱
# 连接对象.login(邮箱账号, 授权码)
connect.login('xxxxxxxxxx@qq.com', 'frcdoguixnbgiffd')
# 3.发送邮件
# 1) 准备邮件内容
# a.创建邮件对象(点击写信按钮)
message = MIMEMultipart()
# b.设置邮件主题
message['Subject'] = Header('第一份自动发送的邮件', 'utf-8').encode()
# 设置收件人信息
message['To'] = 'xxxxxxxxxx@qq.com'
# 设置发件人信息
# 注意尖括号前必须用英文
message['From'] = 'WMX<xxxxxxxxxx@qq.com>'
# 设置正文内容
# MIMEText(正文内容, 正文类型, 编码方式)
# 正文类型:plain(普通文本)、html(超文本内容)、base64(文件-附件)
content = MIMEText('hello, handsome boy!', 'plain', 'utf-8')
# 将邮件内容关联到邮件中
message.attach(content)
# 2) 发送邮件
# connect.sendmail(发件人邮箱, 收件人邮箱, 邮件对象.as_string())
connect.sendmail('xxxxxxxxxx@qq.com', 'xxxxxxxxxx@qq.com', message.as_string())
# 关闭连接
connect.close()
三、特殊内容的发送
1. 发送附件
以附件的形式发送本地图⽚
发送附件
示例:
python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.text import MIMEText
# 准备账号信息
sender = '726550822@qq.com'
to = 'y_t209@163.com'
pw = 'zaizvxadkftnbfda'
# 连接邮箱服务器
connect = smtplib.SMTP_SSL('smtp.qq.com', 465)
# 登录邮箱
connect.login(sender, pw)
# 创建一个空的邮件
message = MIMEMultipart()
# 设置主题
message['Subject'] = Header('发送附件', 'utf-8').encode()
# 设置收件人和发件人信息
message['To'] = to
message['From'] = f'YuTing <{sender}>'
# ================================添加附件=======================================
# 1. 打开需要作为附件发送的文件,并读取文件内容
f1 = open('files/01-Excel快速入门(上).xlsx', 'rb').read()
f2 = open('files/im1.png', 'rb').read()
f3 = open('files/pyecharts的使用.pdf', 'rb').read()
# 2. 创建附件
attachment1 = MIMEText(f1, 'base64', 'utf-8') # 创建附件对象
attachment1['Content-Disposition'] = 'attachment; filename="Excel.xlsx"' # 设置附件的显示位置和方式
message.attach(attachment1) # 将附件添加到邮件中
attachment2 = MIMEText(f2, 'base64', 'utf-8')
attachment2['Content-Disposition'] = 'attachment; filename="im1.png"'
message.attach(attachment2)
# =================================================================================
# 添加正文
# MIMEText(正文内容, 正文类型, 编码方式)
# 正文类型:plain(普通文本)、html(超文本内容)、base64(文件-附件)
text = MIMEText('相关内容请查看附件!', 'plain', 'utf-8')
message.attach(text)
# 发送邮件
connect.sendmail(sender, to, message.as_string())
# 关闭连接
connect.quit()
2. 发送图片
如果想要叫本地图⽚作为邮件中的内容,需要将图⽚以 <img src='cid:图⽚id'/> 的形式关联到
html⽂本中
python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
# 准备账号信息
sender = 'xxxxxxxx@qq.com'
to = 'xxxxxx@163.com'
pw = 'zaizvxadkftnbfda'
# 连接邮箱服务器
connect = smtplib.SMTP_SSL('smtp.qq.com', 465)
# 登录邮箱
connect.login(sender, pw)
# 创建一个空的邮件
message = MIMEMultipart()
# 设置主题
message['Subject'] = Header('发送图片', 'utf-8').encode()
# 设置收件人和发件人信息
message['To'] = to
message['From'] = f'YuTing <{sender}>'
# ========================在正文中发送图片================================
# ========第一步:准备图片=======
# 1. 打开图片文件,读文件内容(准备图片数据)
image_data = open('files/im1.png', 'rb').read()
# 2. 创建图片对象
image = MIMEImage(image_data)
# 3. 添加图片ID
image.add_header('Content-ID', '<img1>')
# 4. 将图片对象添加到邮件中
message.attach(image)
# =======第二步:在正文中使用图片=======
# <img src="cid:图片ID">
# <br> - 换行
text = MIMEText('尊敬的各位领导,您好!<br>请欣赏下面的图片:<br> <img src="cid:img1" style="width:300px;"> <br>谢谢大家!', 'html', 'utf-8')
message.attach(text)
# =============================================================================================
# 发送邮件
connect.sendmail(sender, to, message.as_string())
# 关闭连接
connect.quit()
3. 发送超文本内容
HTML格式的邮件本质还是⽂本格式的邮件,所有⽂件的构建⽅式和普通⽂本⽂件的构建⽅式差不多:
示例:
python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
# 准备账号信息
sender = 'xxxxxxxxx@qq.com'
to = 'xxxxx@163.com'
pw = 'zaizvxadkftnbfda'
# 连接邮箱服务器
connect = smtplib.SMTP_SSL('smtp.qq.com', 465)
# 登录邮箱
connect.login(sender, pw)
# 创建一个空的邮件
message = MIMEMultipart()
# 设置主题
message['Subject'] = Header('网上购票系统-用户支付通知', 'utf-8').encode()
# 设置收件人和发件人信息
# 注意尖括号前必须用英文
message['To'] = to
message['From'] = f'12306@rails.com.cn <{sender}>'
# ==========================发送超文本内容========================
# 1. 从html文件中读取网页内容
# 'rt' - 读、文本
html_content = open('files/12306.html', 'rt', encoding='utf-8').read()
# 2. 构建正文内容
text = MIMEText(html_content, 'html', 'utf-8')
message.attach(text)
# ================================================================
# 发送邮件
connect.sendmail(sender, to, message.as_string())
# 关闭连接
connect.quit()
4.邮件模板内容
可以实现准备一个模版,变动的用%s替代,然后代码编写正文的时候再填充
python
# 准备账号信息
sender = 'xxxxxxx@qq.com'
to = 'xxxxxxxx@163.com'
pw = 'zaizvxadkftnbfda'
# 连接邮箱服务器
connect = smtplib.SMTP_SSL('smtp.qq.com', 465)
# 登录邮箱
connect.login(sender, pw)
# 创建一个空的邮件
message = MIMEMultipart()
# 设置主题
message['Subject'] = Header('网上购票系统-用户支付通知', 'utf-8').encode()
# 设置收件人和发件人信息
message['To'] = to
message['From'] = f'12306@rails.com.cn <{sender}>'
# ==============================================================
# name = input('请输入购票人姓名:')
# gender = input('请输入购票人性别(男/女):')
# date = input('请输入购票日期:')
# price = input('请输入购票金额:')
# html_content = open('files/12307.html', 'rt', encoding='utf-8').read()
# text = MIMEText(html_content % (name, gender, date, price), 'html', 'utf-8')
# message.attach(text)
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~华~丽~丽~的~分~割~线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
text_content = open('files/邮件模版.txt', 'rt', encoding='utf-8').read()
text = MIMEText(text_content % ('xxxxxxxxxxxxxxxx'), 'plain', 'utf-8')
message.attach(text)
# ================================================================
# 发送邮件
connect.sendmail(sender, to, message.as_string())
# 关闭连接
connect.quit()