如果要发送电子邮件,需要使用SMTP(简单邮件传输协议),它也是建立在TCP之上的应用级协议,规定了邮件的发送者如何跟邮件服务器进行通信的细节。Python通过名为
smtplib
的模块将这些操作简化成了SMTP_SSL
对象,通过该对象的login
和send_mail
方法,就能够完成发送邮件的操作。
目录
简单邮件发送:
带附件邮件发送:
封装成函数
利用SMTP服务发送邮件,首先应确保所使用的账号已经开启SMTP服务,这样就相当于获得了邮件服务器。
简单邮件发送:
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# 创建邮件主体对象
email = MIMEMultipart()
# 设置发件人、收件人和主题
email['From'] = 'xxxxxxxxx@qq.com'
email['To'] = '78901@qq.com;12345@163.com'
email['Subject'] = Header('上半年工作情况汇报', 'utf-8')
# 添加邮件正文内容
content = """好好学习,天天向上"""
#默认为“plain”
email.attach(MIMEText(content, 'plain', 'utf-8'))
# 创建SMTP_SSL对象(连接邮件服务器)
smtp_obj = smtplib.SMTP_SSL('smtp.qq.com', 465)
# 通过用户名和授权码进行登录
smtp_obj.login('xxxxxxxxx@qq.com', '邮件服务器的授权码')
# 发送邮件(发件人、收件人、邮件内容(字符串))
smtp_obj.sendmail(
'xxxxxxxxx@qq.com',
['78901@qq.com', '12345@163.com'],
email.as_string()
)
带附件邮件发送:
如果要发送带附件的邮件,只需要将附件的内容处理成BASE64编码,那么它就和普通的文本内容几乎没有什么区别。
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from urllib.parse import quote
# 创建邮件主体对象
email = MIMEMultipart()
# 设置发件人、收件人和主题
email['From'] = 'xxxxxxxxx@qq.com'
email['To'] = '12349@163.com'
email['Subject'] = Header('请查收入职证明文件', 'utf-8')
# 添加邮件正文内容(带HTML标签排版的内容)
content = """<p>尊敬的领导:</p>
<p>你需要的入职证明在附件中,请查收!</p>
<br>
<p>祝,好!</p>
<hr>
<p>小杨 即日</p>"""
email.attach(MIMEText(content, 'html', 'utf-8'))
# 读取作为附件的文件
with open(f'data/入职证明.docx', 'rb') as file:
attachment = MIMEText(file.read(), 'base64', 'utf-8')
# 指定内容类型
attachment['content-type'] = 'application/octet-stream'
# 将中文文件名处理成百分号编码
filename = quote('王大锤离职证明.docx')
# 指定如何处置内容
attachment['content-disposition'] = f'attachment; filename="{filename}"'
# 创建SMTP_SSL对象(连接邮件服务器)
smtp_obj = smtplib.SMTP_SSL('smtp.126.com', 465)
# 通过用户名和授权码进行登录
smtp_obj.login('xxxxxxxxx@qq.com', '邮件服务器的授权码')
# 发送邮件(发件人、收件人、邮件内容(字符串))
smtp_obj.sendmail(
'xxxxxxxxx@qq.com',
'12349@163.com',
email.as_string()
)
封装成函数
为了大家用python实现邮件发送,将上面代码封装成函数。
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from urllib.parse import quote
# 邮件服务器域名(自行修改)
EMAIL_HOST = 'smtp.qq.com'
# 邮件服务端口(通常是465)
EMAIL_PORT = 465
# 登录邮件服务器的账号(自行修改)
EMAIL_USER = 'xxxxxxxxx@126.com'
# 开通SMTP服务的授权码(自行修改)
EMAIL_AUTH = '邮件服务器的授权码'
# “*”后面的参数为key型参数,传参时必须使用“参数名=参数值”的方式,位置不重要
def send_email(*, from_user, to_users, subject='', content='', filenames=[]):
"""发送邮件
:param from_user: 发件人
:param to_users: 收件人,多个收件人用英文分号进行分隔
:param subject: 邮件的主题
:param content: 邮件正文内容
:param filenames: 附件要发送的文件路径
"""
email = MIMEMultipart()
email['From'] = from_user
email['To'] = to_users
email['Subject'] = subject
message = MIMEText(content, 'plain', 'utf-8')
email.attach(message)
for filename in filenames:
with open(filename, 'rb') as file:
pos = filename.rfind('/')
display_filename = filename[pos + 1:] if pos >= 0 else filename
display_filename = quote(display_filename)
attachment = MIMEText(file.read(), 'base64', 'utf-8')
attachment['content-type'] = 'application/octet-stream'
attachment['content-disposition'] = f'attachment; filename="{display_filename}"'
email.attach(attachment)
smtp = smtplib.SMTP_SSL(EMAIL_HOST, EMAIL_PORT)
smtp.login(EMAIL_USER, EMAIL_AUTH)
smtp.sendmail(from_user, to_users.split(';'), email.as_string())
特别鸣谢骆昊博主给予的python学习帮助