当前位置:首页 > Python > 正文

Python发送邮件教程:所需库及代码示例 - 实用指南

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需要特殊设置:

  1. 确保在Google账号设置中启用了"低安全性应用"访问
  2. 或者使用应用专用密码(推荐)
  3. 检查是否启用了两步验证

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发送邮件,您可以实现各种自动化场景:系统监控报警、定期报告发送、用户注册验证等。立即尝试上面的代码示例吧!

发表评论