位置: 文档库 > Python > 文档下载预览

《详解python之用smtplib模块实现第三方smtp发送邮的实例.doc》

1. 下载的文档为doc格式,下载后可用word或者wps进行编辑;

2. 将本文以doc文档格式下载到电脑,方便收藏和打印;

3. 下载后的文档,内容与下面显示的完全一致,下载之前请确认下面内容是否您想要的,是否完整.

点击下载文档

详解python之用smtplib模块实现第三方smtp发送邮的实例.doc

《详解python之用smtplib模块实现第三方smtp发送邮件的实例》

电子邮件作为互联网通信的核心方式之一,其发送机制涉及SMTP协议(简单邮件传输协议)。Python通过内置的smtplib模块,为开发者提供了便捷的邮件发送接口。本文将系统讲解如何使用smtplib结合第三方SMTP服务(如QQ邮箱、163邮箱、Gmail等)实现邮件发送,涵盖基础配置、安全认证、附件添加、HTML邮件等完整流程。

一、SMTP协议与第三方服务基础

SMTP是用于发送邮件的协议,默认端口为25(非加密)和465/587(加密)。第三方邮件服务商(如腾讯、网易、谷歌)通常要求使用加密连接,并提供专属的SMTP服务器地址和认证方式。例如:

  • QQ邮箱:smtp.qq.com,端口465(SSL)或587(TLS)
  • 163邮箱:smtp.163.com,端口465或587
  • Gmail:smtp.gmail.com,端口465或587

使用前需在邮箱设置中开启SMTP服务,并获取授权码(非邮箱密码)。例如QQ邮箱需通过“设置→账户→开启POP3/SMTP服务”生成16位授权码。

二、基础邮件发送实现

1. 导入必要模块

import smtplib
from email.mime.text import MIMEText
from email.header import Header

2. 创建邮件内容

# 纯文本邮件
message = MIMEText('这是邮件正文内容', 'plain', 'utf-8')
message['From'] = Header('发件人昵称')
message['To'] = Header('收件人昵称')
message['Subject'] = Header('邮件主题')

3. 配置SMTP连接并发送

try:
    # 使用SSL加密连接(以QQ邮箱为例)
    smtp_server = 'smtp.qq.com'
    smtp_port = 465
    sender_email = 'sender@qq.com'
    password = '你的授权码'  # 不是邮箱密码!
    
    with smtplib.SMTP_SSL(smtp_server, smtp_port) as server:
        server.login(sender_email, password)
        server.sendmail(sender_email, ['receiver@example.com'], message.as_string())
    print('邮件发送成功')
except Exception as e:
    print(f'发送失败: {e}')

三、进阶功能实现

1. 发送HTML格式邮件

将MIMEText的subtype改为'html'即可发送富文本邮件:

html_content = '''

HTML邮件示例

这是一封带链接的邮件

''' message = MIMEText(html_content, 'html', 'utf-8')

2. 添加附件

需结合email.mime.multipart和email.mime.base模块:

from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

# 创建带附件的邮件对象
msg = MIMEMultipart()
msg['From'] = Header('发件人')
msg['To'] = Header('收件人')
msg['Subject'] = Header('带附件的邮件')

# 添加正文
text = MIMEText('请查收附件', 'plain', 'utf-8')
msg.attach(text)

# 添加附件
with open('report.pdf', 'rb') as f:
    part = MIMEBase('application', 'octet-stream')
    part.set_payload(f.read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition', 'attachment', filename='report.pdf')
    msg.attach(part)

3. 发送给多个收件人

在sendmail方法中,收件人参数接受列表格式:

recipients = ['user1@example.com', 'user2@example.com']
server.sendmail(sender_email, recipients, msg.as_string())

4. 使用TLS加密(非SSL)

部分服务商(如Gmail)推荐使用STARTTLS加密:

with smtplib.SMTP('smtp.gmail.com', 587) as server:
    server.starttls()  # 启用TLS加密
    server.login('user@gmail.com', '授权码')
    server.send_message(msg)

四、完整实例:带附件的HTML邮件

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from email.header import Header

def send_email():
    # 邮件配置
    sender = 'your_email@qq.com'
    receiver = 'recipient@example.com'
    password = '你的QQ邮箱授权码'  # 重要:不是邮箱密码!
    
    # 创建多部分邮件
    msg = MIMEMultipart()
    msg['From'] = Header('系统通知')
    msg['To'] = Header('用户')
    msg['Subject'] = Header('月度报告(带附件)')
    
    # HTML正文
    html = """
    
      
        

尊敬的客户:

附件为2023年10月数据报告,请查收。

""" msg.attach(MIMEText(html, 'html', 'utf-8')) # 添加PDF附件 try: with open('report.pdf', 'rb') as f: part = MIMEBase('application', 'octet-stream') part.set_payload(f.read()) encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment', filename='report.pdf') msg.attach(part) except FileNotFoundError: print("警告:未找到附件文件,继续发送无附件邮件") # 发送邮件 try: with smtplib.SMTP_SSL('smtp.qq.com', 465) as server: server.login(sender, password) server.sendmail(sender, receiver, msg.as_string()) print("邮件发送成功") except Exception as e: print(f"发送失败: {e}") if __name__ == '__main__': send_email()

五、常见问题与解决方案

1. 认证错误(535 Error)

  • 检查是否使用授权码而非邮箱密码
  • 确认邮箱已开启SMTP服务
  • QQ邮箱需在授权码生成后10分钟内使用

2. 连接超时

  • 检查防火墙是否阻止出站连接
  • 尝试更换端口(465/587)
  • 确认SMTP服务器地址正确

3. 附件编码错误

  • 确保使用MIMEBase处理二进制文件
  • 对附件调用encode_base64()
  • 中文文件名需使用Header编码:
filename = Header('中文文件名.pdf', 'utf-8').encode()

六、安全最佳实践

1. 敏感信息保护

  • 不要在代码中硬编码密码,建议使用环境变量或配置文件
  • 示例:使用os.environ获取授权码
import os
password = os.getenv('EMAIL_PASSWORD')

2. 异常处理完善

  • 捕获smtplib.SMTPException及其子类
  • 记录详细错误日志

3. 邮件发送频率控制

  • 避免短时间内发送大量邮件触发反垃圾邮件机制
  • 建议添加延迟(time.sleep)

七、扩展应用场景

1. 自动化报告系统

  • 结合pandas生成数据分析报告
  • 使用matplotlib生成图表并作为附件发送

2. 批量邮件发送

  • 从CSV/Excel读取收件人列表
  • 使用邮件模板个性化内容

3. 邮件队列系统

  • 实现失败重试机制
  • 使用数据库记录发送状态

关键词:Python、smtplib模块、SMTP协议、第三方邮箱、邮件发送、HTML邮件、附件添加、SSL加密、TLS加密、授权码认证

简介:本文详细介绍了Python中smtplib模块的使用方法,通过实例演示如何连接QQ邮箱、163邮箱等第三方SMTP服务发送邮件,涵盖纯文本邮件、HTML邮件、带附件邮件的实现,并提供了安全认证、异常处理等最佳实践,适合需要实现邮件自动化功能的开发者参考。

《详解python之用smtplib模块实现第三方smtp发送邮的实例.doc》
将本文以doc文档格式下载到电脑,方便收藏和打印
推荐度:
点击下载文档