Python发送邮件教程:所需库及代码示例 - 实用指南
- Python
- 2025-08-11
- 424
Python发送邮件完全指南
学习使用Python发送邮件所需的核心库、配置步骤和完整实现代码
作者:Python开发者
最后更新:2023年10月
Python是自动化任务的绝佳工具,其中自动发送邮件是常见需求。本教程将指导您如何使用Python发送邮件,从基础配置到高级功能,包括HTML内容和附件发送。
1. Python发送邮件所需库
Python内置了发送邮件所需的核心库,无需额外安装:
- smtplib - 用于连接SMTP服务器并发送邮件
- email - 用于构建邮件内容(主题、发件人、收件人、正文等)
- email.mime - 用于创建多部分邮件(文本+HTML+附件)
这些库都是Python标准库的一部分,无需使用pip额外安装。
2. SMTP协议简介
SMTP(Simple Mail Transfer Protocol)是发送电子邮件的标准协议。Python通过smtplib库与SMTP服务器通信。
常见SMTP服务器设置
- Gmail: smtp.gmail.com, 端口587 (TLS) 或 465 (SSL)
- Outlook/Hotmail: smtp-mail.outlook.com, 端口587
- QQ邮箱: smtp.qq.com, 端口465
- 163邮箱: smtp.163.com, 端口465
安全注意事项
- 避免在代码中直接写入密码
- 使用环境变量存储敏感信息
- 对于Gmail需开启"低安全性应用"或生成应用专用密码
- 建议使用SSL/TLS加密连接
3. 发送纯文本邮件
这是最基本的邮件发送方式,适用于简单的通知和提醒。
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 邮件配置
smtp_server = 'smtp.example.com' # SMTP服务器地址
smtp_port = 587 # 端口号
sender_email = 'your_email@example.com'
sender_password = 'your_password'
receiver_email = 'recipient@example.com'
# 创建邮件内容
subject = 'Python邮件测试'
content = '这是一封来自Python的测试邮件。'
# 构建邮件
message = MIMEText(content, 'plain', 'utf-8')
message['From'] = Header(sender_email)
message['To'] = Header(receiver_email)
message['Subject'] = Header(subject, 'utf-8')
# 发送邮件
try:
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls() # 启用TLS加密
server.login(sender_email, sender_password)
server.sendmail(sender_email, [receiver_email], message.as_string())
print("邮件发送成功!")
except Exception as e:
print(f"邮件发送失败: {e}")
finally:
server.quit()
4. 发送HTML格式邮件
发送带格式的邮件,可以包含链接、图片和样式,提供更好的用户体验。
# 创建HTML邮件内容
html_content = """
<html>
<body>
<h1 style="color: #3498db;">Python邮件测试</h1>
<p>这是一封来自Python的<strong>HTML格式</strong>测试邮件。</p>
<p>您可以通过Python自动化发送各种通知:</p>
<ul>
<li>系统监控警报</li>
<li>每日报告</li>
<li>注册确认邮件</li>
</ul>
<p><a href="https://www.python.org">访问Python官网</a></p>
</body>
</html>
"""
# 构建HTML邮件
message = MIMEText(html_content, 'html', 'utf-8')
message['From'] = Header(sender_email)
message['To'] = Header(receiver_email)
message['Subject'] = Header('Python HTML邮件测试', 'utf-8')
# 发送代码与纯文本邮件相同
HTML邮件最佳实践
- 使用内联CSS样式(外部样式表可能被邮件客户端阻止)
- 避免复杂的布局和JavaScript(邮件客户端不支持)
- 为图片使用绝对URL路径
- 添加纯文本版本以提升兼容性
5. 添加邮件附件
Python可以轻松添加各种类型的附件,包括文档、图片和压缩文件。
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
# 创建多部分消息
message = MIMEMultipart()
message['From'] = Header(sender_email)
message['To'] = Header(receiver_email)
message['Subject'] = Header('带附件的测试邮件', 'utf-8')
# 添加邮件正文
text_content = MIMEText('请查看附件中的文件。', 'plain', 'utf-8')
message.attach(text_content)
# 添加附件
file_path = 'report.pdf'
with open(file_path, 'rb') as file:
attachment = MIMEApplication(file.read(), Name='月度报告.pdf')
attachment['Content-Disposition'] = f'attachment; filename="月度报告.pdf"'
message.attach(attachment)
# 发送带附件的邮件(发送代码相同)
6. 使用安全连接
保护您的凭据和邮件内容不被窃取,建议始终使用加密连接。
TLS加密(推荐)
使用587端口和starttls()
方法:
server = smtplib.SMTP(smtp_server, 587) server.starttls() server.login(sender_email, sender_password)
SSL加密
使用465端口和SMTP_SSL
:
server = smtplib.SMTP_SSL(smtp_server, 465) server.login(sender_email, sender_password)
7. 完整示例代码
结合所有功能的完整示例:发送带HTML内容、纯文本备选和附件的邮件。
import smtplib
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(sender, password, receiver, subject, html_content, text_content=None, attachments=None):
# 创建多部分消息
msg = MIMEMultipart('alternative')
msg['From'] = Header(sender)
msg['To'] = Header(receiver)
msg['Subject'] = Header(subject, 'utf-8')
# 添加纯文本版本(可选)
if text_content:
part1 = MIMEText(text_content, 'plain', 'utf-8')
msg.attach(part1)
# 添加HTML版本
part2 = MIMEText(html_content, 'html', 'utf-8')
msg.attach(part2)
# 添加附件
if attachments:
for file_path in attachments:
with open(file_path, 'rb') as f:
file_data = f.read()
file_name = file_path.split('/')[-1]
attachment = MIMEApplication(file_data, Name=file_name)
attachment['Content-Disposition'] = f'attachment; filename="{file_name}"'
msg.attach(attachment)
# 发送邮件
try:
# 使用Gmail作为示例
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(sender, password)
server.sendmail(sender, receiver, msg.as_string())
return True
except Exception as e:
print(f"发送失败: {e}")
return False
finally:
server.quit()
# 使用示例
if __name__ == "__main__":
sender = "your_email@gmail.com"
password = "your_app_password" # 使用Gmail的应用专用密码
receiver = "recipient@example.com"
subject = "完整Python邮件示例"
html_content = """
<html>
<body>
<h1 style="color: #3498db;">Python自动邮件</h1>
<p>这是一封包含HTML内容和附件的测试邮件。</p>
<p><strong>请注意查收附件!</strong></p>
</body>
</html>
"""
text_content = "这是一封包含HTML内容和附件的测试邮件。请查收附件!"
attachments = ['report.pdf', 'data.xlsx']
if send_email(sender, password, receiver, subject, html_content, text_content, attachments):
print("邮件发送成功!")
else:
print("邮件发送失败")
8. 常见问题解答
Q: 为什么我的Gmail无法发送邮件?
A: Gmail需要特殊设置:
- 确保在Google账号设置中启用了"低安全性应用"访问
- 或者使用应用专用密码(推荐)
- 检查是否启用了两步验证
Q: 如何避免被标记为垃圾邮件?
A: 遵循这些最佳实践:
- 使用真实的发件人邮箱和名称
- 避免使用垃圾邮件常见词汇(如"免费"、"立即行动"等)
- 保持合理的发送频率
- 添加退订链接(对批量发送尤为重要)
Q: 可以发送给多个收件人吗?
A: 可以,在msg['To']中使用逗号分隔多个邮箱地址:
msg['To'] = 'user1@example.com, user2@example.com'
或者在sendmail方法中使用列表:
server.sendmail(sender, ['user1@example.com', 'user2@example.com'], msg.as_string())
开始自动化您的邮件任务!
通过Python发送邮件,您可以实现各种自动化场景:系统监控报警、定期报告发送、用户注册验证等。立即尝试上面的代码示例吧!
本文由HuaZhen于2025-08-11发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20257885.html
发表评论