一、SMTP发送邮件介绍
SMTP(Simple Mail Transfer Protocol)即简单邮件传送协议,是一种用于发送电子邮件的常用协议。
使用Python可以通过SMTP协议来发送邮件,本文将介绍Python中SMTP邮件发送的方法,包括邮件的构造及其发送。
二、SMTP发送邮件的基本流程
Python中SMTP发送邮件的基本流程如下:
- 连接邮件服务器
- 构造邮件
- 发送邮件
- 检查SMTP服务地址和端口是否正确
- 检查SMTP服务是否开启
- 检查网络是否正常
- 设置SSL加密连接
- 检查邮件格式是否符合规范
- 检查编码格式是否正确
- 设置附件
import smtplib
smtp_server = 'smtp.qq.com'
smtp_port = 465 # qq邮箱SMTP端口
smtp_user = 'xxx@qq.com' # 邮箱账户
smtp_password = 'xxxxx' # 邮箱密码
# SSL加密连接
smtp = smtplib.SMTP_SSL(smtp_server, smtp_port)
# 登录邮箱账户
smtp.login(smtp_user, smtp_password)
from email.mime.text import MIMEText
sender = 'xxx@qq.com'
receivers = ['xxx@qq.com', 'xxx@163.com'] # 邮件收件人列表
# 构造邮件内容
text = '测试邮件'
msg = MIMEText(text, 'plain', 'utf-8')
msg['From'] = sender
msg['To'] = ','.join(receivers)
msg['Subject'] = 'Python SMTP测试'
# 添加附件
with open('sample.txt', 'rb') as f:
attachment = MIMEText(f.read(), 'base64', 'utf-8')
attachment['Content-Type'] = 'application/octet-stream'
attachment['Content-Disposition'] = 'attachment; filename="sample.txt"'
msg.attach(attachment)
# 发送邮件
smtp.sendmail(sender, receivers, msg.as_string())
# 关闭连接
smtp.quit()
三、SMTP发送邮件常见问题解决方法
1. SMTP连接报错
有时可能会遇到SMTP连接异常的情况,一般有以下解决方法:
smtp_server = 'smtp.qq.com'
smtp_port = 465 # qq邮箱SMTP端口
smtp_user = 'xxx@qq.com' # 邮箱账户
smtp_password = 'xxxxx' # 邮箱密码
有些SMTP服务需要手动开启,如QQ邮箱的SMTP服务需要在邮箱设置中手动开启。
网络异常也可能导致SMTP连接异常,需要检查网络是否正常。
一些SMTP服务需要通过SSL加密连接,需要在连接SMTP时设置SSL加密。
smtp = smtplib.SMTP_SSL(smtp_server, smtp_port)
2. 邮件内容报错
当邮件内容不符合SMTP协议规范时,可能会发生邮件发送失败的情况,一般有以下解决方法:
邮件格式需要符合SMTP协议规范,如邮件头部需要包含From、To、Subject等字段。
邮件内容主体需要使用正确的编码格式,一般使用utf-8编码。
如果需要发送附件,需要使用MIMEText添加附件并设置正确的Content-Type和Content-Disposition。
with open('sample.txt', 'rb') as f:
attachment = MIMEText(f.read(), 'base64', 'utf-8')
attachment['Content-Type'] = 'application/octet-stream'
attachment['Content-Disposition'] = 'attachment; filename="sample.txt"'
msg.attach(attachment)
四、完整代码示例
import smtplib
from email.mime.text import MIMEText
smtp_server = 'smtp.qq.com'
smtp_port = 465 # qq邮箱SMTP端口
smtp_user = 'xxx@qq.com' # 邮箱账户
smtp_password = 'xxxxx' # 邮箱密码
# SSL加密连接
smtp = smtplib.SMTP_SSL(smtp_server, smtp_port)
# 登录邮箱账户
smtp.login(smtp_user, smtp_password)
sender = 'xxx@qq.com'
receivers = ['xxx@qq.com', 'xxx@163.com'] # 邮件收件人列表
# 构造邮件内容
text = '测试邮件'
msg = MIMEText(text, 'plain', 'utf-8')
msg['From'] = sender
msg['To'] = ','.join(receivers)
msg['Subject'] = 'Python SMTP测试'
# 添加附件
with open('sample.txt', 'rb') as f:
attachment = MIMEText(f.read(), 'base64', 'utf-8')
attachment['Content-Type'] = 'application/octet-stream'
attachment['Content-Disposition'] = 'attachment; filename="sample.txt"'
msg.attach(attachment)
# 发送邮件
smtp.sendmail(sender, receivers, msg.as_string())
# 关闭连接
smtp.quit()