1.导入模块和包,分别是邮件发送服务器模块、邮件对象模块、邮件标题包、邮件内容包
import smtplib # 邮件发送服务器
from email.mime.multipart import MIMEMultipart # 创建一个邮件对象
from email.header import Header # 邮件标题包
from email.mime.text import MIMEText # 邮件内容包
2.用函数封装功能:发邮件
包含:发送人、接收人、主题、内容、附件
def send_email(from_user, to_user, subject='', content='', files=[]):
"""
发送邮件
:param from_user: 发送人
:param to_user: 接收人 abc@qq.com;def@163.com
:param subject: 主题
:param content: 内容
:param file: 附件
:return:
"""
HOST = 'smtp.qq.com'
email = MIMEMultipart() # 创建一个邮件对象
email['From'] = from_user # 设置邮件发送者
email['To'] = to_user # 设置邮件接收者
email['Subject'] = Header(subject, 'utf-8').encode() # 设置邮件主题
# 邮件内容 plain 是纯文本格式 utf-8 是编码格式
content = MIMEText(content, 'plain', 'utf-8')
3.添加附件时注意:
a. 将附件转成base64编码格式
b.对附件的中文件名进行gbk编码
代码如下:
# 添加邮件附件
email.attach(content)
if files:
for file in files:
with open(file, 'rb') as f:
file_name = file.rfind('/')
display_filename = file[file_name + 1:] if file_name != -1 else file
# 将附件转成base64编码格式
att = MIMEText(f.read(), 'base64', 'utf-8')
# 设置附件类型 通知服务器这是附件
att["Content-Type"] = 'application/octet-stream'
# 设置附件的文件名称,告诉服务器附件的文件名称 并显示在邮件中,并对附件的中中文件名gbk编码
att.add_header('Content-Disposition', 'attachment',
filename=('gbk', '', os.path.basename(display_filename)))
# 将附件附加到 邮件对象
email.attach(att)
4.发送邮件
# 链接邮件发送服务器,查询邮箱的SMTP的端口号QQ和163邮箱的端口号都是465
connect = smtplib.SMTP_SSL(HOST, 465) # 链接邮件发送服务器,查询邮箱的SMTP的端口号QQ邮箱的是465
# 登录邮件发送服务器,需要准备邮箱号和授权码,在邮箱设置中找到POP3/SMTP/IMAP,开启所有服务,会生成授权码,保存授权码
connect.login('XXXXXXX@qq.com', '邮箱授权码')
# to_user.split(';')接受者邮箱号按照 ";" 分割后正好得到一个列表
connect.sendmail(from_user, to_user.split(';'), email.as_string())
# 退出
connect.quit()
5.完整代码如下:
import smtplib # 邮件发送服务器
from email.mime.multipart import MIMEMultipart # 创建一个邮件对象
from email.header import Header # 邮件标题包
from email.mime.text import MIMEText # 邮件内容包
import os
def send_email(from_user, to_user, subject='', content='', files=[]):
"""
发送邮件
:param from_user: 发送人
:param to_user: 接收人 abc@qq.com;def@163.com
:param subject: 主题
:param content: 内容
:param file: 附件
:return:
"""
HOST = 'smtp.qq.com'
email = MIMEMultipart() # 创建一个邮件对象
email['From'] = from_user # 设置邮件发送者
email['To'] = to_user # 设置邮件接收者
email['Subject'] = Header(subject, 'utf-8').encode() # 设置邮件主题
# 邮件内容 plain 是纯文本格式 utf-8 是编码格式
content = MIMEText(content, 'plain', 'utf-8')
# 添加邮件附件
email.attach(content)
if files:
for file in files:
with open(file, 'rb') as f:
file_name = file.rfind('/')
display_filename = file[file_name + 1:] if file_name != -1 else file
# 将附件转成base64编码格式
att = MIMEText(f.read(), 'base64', 'utf-8')
# 设置附件类型 通知服务器这是附件
att["Content-Type"] = 'application/octet-stream'
# 设置附件的文件名称,告诉服务器附件的文件名称 并显示在邮件中,并对附件的中中文件名gbk编码
att.add_header('Content-Disposition', 'attachment',
filename=('gbk', '', os.path.basename(display_filename)))
# 将附件附加到 邮件对象
email.attach(att)
# 链接邮件发送服务器,查询邮箱的SMTP的端口号QQ和163邮箱的端口号都是465
connect = smtplib.SMTP_SSL(HOST, 465) # 链接邮件发送服务器,查询邮箱的SMTP的端口号QQ邮箱的是465
# 登录邮件发送服务器,需要准备邮箱号和授权码,在邮箱设置中找到POP3/SMTP/IMAP,开启所有服务,会生成授权码,保存授权码
connect.login('xxxxxxx@qq.com', '邮箱授权码')
# to_user.split(';')接受者邮箱号按照 ";" 分割后正好得到一个列表
connect.sendmail(from_user, to_user.split(';'), email.as_string())
# 退出
connect.quit()
6.将发送邮件这个函数封装起来作为一个包导入,方便今后调用
# 导入模块和包
from myutils import send_email
# 传参
send_email('XXXXXXX@qq.com',
"XXXXXXX@163.com", # 发送对象的邮箱,可以传入列表
subject='这是标题', # 标题
content='这是内容', # 内容
files=[r"文件路径1";r"文件路径2";r"文件路径3"]) #附件路径