详细介绍Python使用SMTP发送邮件实例
YPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
YPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
《详细介绍Python使用SMTP发送邮件实例》
电子邮件是现代通信的重要方式,Python通过内置的smtplib库和email模块,可以轻松实现邮件发送功能。本文将详细介绍如何使用Python的SMTP协议发送纯文本邮件、HTML格式邮件、带附件的邮件,以及如何处理邮件认证、异常和批量发送等高级场景。
一、SMTP协议基础与Python库
SMTP(Simple Mail Transfer Protocol)是用于发送邮件的协议,默认端口为25(非加密)或587(TLS加密)、465(SSL加密)。Python通过smtplib库实现SMTP客户端功能,email模块用于构造邮件内容。
安装必要的库(通常Python标准库已包含):
# 无需额外安装,但若需处理复杂附件可安装:
# pip install secure-smtplib # 增强安全性(非必须)
二、发送纯文本邮件
最简单的邮件发送场景,仅包含文本内容。
1. 基本步骤
(1)创建SMTP连接
(2)登录邮箱(若需认证)
(3)构造邮件内容
(4)发送邮件
(5)关闭连接
2. 代码实现
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 邮箱配置
sender = 'your_email@example.com'
receivers = ['recipient@example.com'] # 可为列表发送多人
password = 'your_password' # 或应用专用密码
smtp_server = 'smtp.example.com' # 如smtp.qq.com、smtp.163.com
smtp_port = 587 # 或465(SSL)
try:
# 创建邮件对象
message = MIMEText('这是一封测试邮件', 'plain', 'utf-8')
message['From'] = Header(sender)
message['To'] = Header(','.join(receivers))
message['Subject'] = Header('Python SMTP测试')
# 连接SMTP服务器(TLS加密)
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls() # 启用TLS
server.login(sender, password)
# 发送邮件
server.sendmail(sender, receivers, message.as_string())
print("邮件发送成功")
except smtplib.SMTPException as e:
print(f"发送失败: {e}")
finally:
server.quit() # 确保关闭连接
3. 关键点说明
(1)starttls():升级为加密连接(推荐)
(2)MIMEText:第一个参数为内容,第二个参数为格式(plain/html),第三个为编码
(3)Header:处理中文标题和发件人显示
三、发送HTML格式邮件
HTML邮件支持富文本格式,如加粗、颜色、超链接等。
1. 代码实现
from email.mime.text import MIMEText
# 修改MIMEText的subtype为html
html_content = """
这是HTML邮件
点击这里访问示例网站
"""
message = MIMEText(html_content, 'html', 'utf-8')
# 其余部分与纯文本邮件相同
四、发送带附件的邮件
通过MIMEMultipart组合文本和附件。
1. 代码实现
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# 创建带附件的邮件对象
msg = MIMEMultipart()
msg['From'] = Header(sender)
msg['To'] = Header(','.join(receivers))
msg['Subject'] = Header('带附件的邮件')
# 添加文本部分
text = MIMEText('请查收附件', 'plain', 'utf-8')
msg.attach(text)
# 添加附件
file_path = 'report.pdf' # 附件路径
with open(file_path, 'rb') as f:
part = MIMEApplication(f.read())
part.add_header('Content-Disposition', 'attachment', filename=os.path.basename(file_path))
msg.attach(part)
# 发送代码(与之前相同)
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(sender, password)
server.sendmail(sender, receivers, msg.as_string())
server.quit()
2. 多附件处理
通过循环添加多个附件:
attachment_paths = ['file1.pdf', 'file2.jpg']
for file_path in attachment_paths:
with open(file_path, 'rb') as f:
part = MIMEApplication(f.read())
part.add_header('Content-Disposition', 'attachment', filename=os.path.basename(file_path))
msg.attach(part)
五、高级功能实现
1. 批量发送邮件
使用邮件列表和循环发送:
receivers_list = [
['user1@example.com', '用户1'],
['user2@example.com', '用户2']
]
for receiver in receivers_list:
msg = MIMEText(f'尊敬的{receiver[1]},您好!', 'plain', 'utf-8')
msg['To'] = Header(receiver[0])
# 发送逻辑...
2. 异常处理增强
捕获特定异常:
try:
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(sender, password)
except smtplib.SMTPAuthenticationError:
print("认证失败,请检查用户名密码")
except smtplib.SMTPConnectError:
print("无法连接到SMTP服务器")
except Exception as e:
print(f"未知错误: {e}")
3. 使用环境变量存储敏感信息
避免在代码中硬编码密码:
import os
from dotenv import load_dotenv # pip install python-dotenv
load_dotenv()
sender = os.getenv('EMAIL_SENDER')
password = os.getenv('EMAIL_PASSWORD')
六、完整示例:综合功能实现
以下是一个包含HTML内容、附件和异常处理的完整示例:
import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.header import Header
def send_email_with_attachment():
# 配置信息(建议从环境变量读取)
sender = 'your_email@example.com'
receivers = ['recipient@example.com']
password = 'your_password'
smtp_server = 'smtp.example.com'
smtp_port = 587
try:
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = Header(sender)
msg['To'] = Header(','.join(receivers))
msg['Subject'] = Header('综合邮件示例')
# 添加HTML内容
html_content = """
月度报告
附件中包含详细数据,请查收。
"""
text_part = MIMEText(html_content, 'html', 'utf-8')
msg.attach(text_part)
# 添加附件
attachment_path = 'monthly_report.xlsx'
if os.path.exists(attachment_path):
with open(attachment_path, 'rb') as f:
attachment = MIMEApplication(f.read())
attachment.add_header('Content-Disposition', 'attachment', filename=os.path.basename(attachment_path))
msg.attach(attachment)
else:
print("警告:附件不存在,继续发送无附件邮件")
# 发送邮件
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(sender, password)
server.sendmail(sender, receivers, msg.as_string())
print("邮件发送成功")
except smtplib.SMTPAuthenticationError:
print("错误:邮箱认证失败")
except FileNotFoundError:
print("错误:附件文件未找到")
except Exception as e:
print(f"发送失败: {str(e)}")
if __name__ == '__main__':
send_email_with_attachment()
七、常见问题解决
1. 连接被拒绝
(1)检查SMTP服务器地址和端口是否正确
(2)确认邮箱服务商是否开放SMTP服务(如QQ邮箱需开启IMAP/SMTP)
(3)检查防火墙是否阻止了连接
2. 认证失败
(1)确认用户名和密码正确
(2)部分邮箱(如QQ、163)需要使用授权码而非登录密码
(3)检查是否启用了两步验证
3. 邮件被标记为垃圾邮件
(1)避免在短时间内发送大量邮件
(2)设置合理的发件人名称和回复地址
(3)内容中避免过多营销词汇和链接
八、最佳实践建议
1. 安全性:始终使用TLS/SSL加密连接,不要在代码中硬编码密码
2. 错误处理:捕获特定异常并提供有意义的错误信息
3. 性能:批量发送时考虑使用异步或队列机制
4. 可维护性:将邮件配置与业务逻辑分离
5. 测试:先发送给自己测试,再正式使用
关键词
Python、SMTP、邮件发送、email模块、MIMEText、HTML邮件、附件发送、批量邮件、异常处理、TLS加密
简介
本文详细介绍了Python通过SMTP协议发送邮件的完整实现方法,包括纯文本邮件、HTML格式邮件、带附件邮件的发送技术,以及批量发送、异常处理和安全认证等高级功能。通过代码示例和场景分析,帮助开发者快速掌握Python邮件发送的核心技巧。