位置: 文档库 > Python > 详细介绍Python使用SMTP发送邮件实例

详细介绍Python使用SMTP发送邮件实例

麒麟 上传于 2022-06-19 06:28

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邮件发送的核心技巧。