一、核心基础

1. 核心模块与类

模块 / 类 作用描述
smtplib 封装 SMTP 协议,提供服务器连接、登录、发送邮件功能(核心对象:SMTP/SMTP_SSL
email.mime.text.MIMEText 构造邮件内容(支持纯文本plain、HTML 格式html
email.mime.multipart.MIMEMultipart 构造混合类型邮件(带附件、HTML 嵌入图片,参数:related/ 默认)
email.mime.image.MIMEImage 处理邮件中嵌入的图片(需配合Content-ID引用)
email.header.Header 规范邮件头部(发件人、收件人、主题)的编码格式,避免中文乱码

2. 核心流程(固定模板)

3. 关键参数速记

参数类型 核心参数 示例值
服务器配置 mail_host QQ:smtp.qq.com;网易:smtp.163.com
mail_port SSL:465;非 SSL:25
认证信息 mail_user 发送者邮箱账号(如123456@qq.com
mail_pass 邮箱授权码(非登录密码!)
邮件内容 sender 发送者邮箱(同mail_user
receivers 收件人列表(如["a@qq.com", "b@163.com"]
msg 邮件对象(需用as_string()转换)

二、分类实例总结

1. 纯文本邮件(最基础)

核心代码
# 构造邮件内容
msg = MIMEText("邮件正文", 'plain', 'utf-8')
# 服务器连接(QQ邮箱示例)
smtp_obj = smtplib.SMTP_SSL(mail_host, 465)
关键要点
  • subtype必须设为plain,编码统一用utf-8
  • 支持换行、特殊符号,无需额外排版

2. HTML 格式邮件(带排版 / 链接)

核心代码
html_content = "<h1 style='color:red'>HTML邮件</h1><a href='https://www.baidu.com'>百度</a>"
msg = MIMEText(html_content, 'html', 'utf-8')
关键要点
  • subtype设为html,内容支持所有 HTML 标签(表格、样式、超链接等)
  • 需注意 HTML 语法正确性,否则可能显示异常

3. 带附件邮件(单个 / 多个)

核心代码
# 1. 创建混合邮件对象
msg = MIMEMultipart()
# 2. 添加正文
msg.attach(MIMEText("带附件邮件", 'plain', 'utf-8'))
# 3. 添加附件
att = MIMEText(open("test.txt", 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename="test.txt"'  # 附件显示名
msg.attach(att)
关键要点
  • 必须用MIMEMultipart对象,附件需通过attach方法绑定
  • 支持任意文件类型(txt、图片、Excel 等),读取方式均为rb(二进制)

4. HTML 嵌入图片(非附件)

核心代码
# 1. 创建related类型邮件对象
msg = MIMEMultipart('related')
# 2. HTML正文(通过cid引用图片)
html_content = "<img src='cid:image1'>"
msg.attach(MIMEText(html_content, 'html', 'utf-8'))
# 3. 嵌入图片
with open("test.png", 'rb') as f:
    img = MIMEImage(f.read())
    img.add_header('Content-ID', '<image1>')  # 与cid一致
    msg.attach(img)
关键要点
  • 邮件对象类型必须为MIMEMultipart('related')
  • Content-ID需用<>包裹,与 HTML 中的cid严格对应

三、易错点与解决方案

常见问题 原因分析 解决方案
中文乱码 邮件头部未指定编码 Header类包装:message['Subject'] = Header("主题", 'utf-8')
连接失败(超时 / 拒绝) 端口错误或 SMTP 服务未开启 1. SSL 用 465 端口,非 SSL 用 25;2. 开启邮箱 POP3/SMTP 服务
登录失败(认证错误) 用了邮箱登录密码而非授权码 登录邮箱→设置→账户→生成授权码,替换mail_pass
附件无法打开 / 乱码 未用二进制读取或编码错误 读取文件用rb模式,编码指定为utf-8
图片不显示(嵌入形式) cid 与 Content-ID 不匹配或邮件对象类型错误 1. 确保cid:image1<image1>一致;2. 用MIMEMultipart('related')

四、实战技巧

  1. 配置项抽离:将服务器地址、账号、授权码单独封装为配置文件(如config.py),便于维护和复用。

    # config.py
    MAIL_HOST = "smtp.qq.com"
    MAIL_PORT = 465
    MAIL_USER = "123456@qq.com"
    MAIL_PASS = "abcdefghijklmnop"
    
  2. 异常捕获优化:细化异常类型,便于定位问题。

    try:
        # 发送逻辑
    except smtplib.SMTPAuthenticationError:
        print("认证失败:请检查授权码是否正确")
    except smtplib.SMTPConnectError:
        print("连接失败:请检查服务器地址和端口")
    except FileNotFoundError:
        print("文件不存在:请检查附件路径")
    except Exception as e:
        print(f"其他错误:{str(e)}")
    
  3. 多收件人 / 抄送receivers支持列表格式,抄送可通过添加Cc头部实现。

    receivers = ["a@qq.com", "b@163.com"]  # 收件人
    cc_list = ["c@qq.com"]  # 抄送
    message['Cc'] = Header(",".join(cc_list), 'utf-8')
    smtp_obj.sendmail(sender, receivers + cc_list, message.as_string())  # 发送时需合并列表
    

五、拓展应用

  1. 自动化邮件:结合定时任务(schedule模块),实现每日 / 每周报表自动发送(如实验数据统计、日志汇总)。
  2. 日志告警:在程序异常时自动发送邮件告警(含错误信息、堆栈跟踪),便于及时排查问题。
  3. 批量邮件发送:结合 Excel 读取(pandas模块),批量向收件人发送个性化邮件(如通知、报告)。

六、核心考点速记口诀

  1. 模块两核心:smtplib连服务器,email造内容;
  2. 授权码是关键,端口 465(SSL)记心间;
  3. 纯文本用plain,HTML 用html,附件要靠MIMEMultipart
  4. 嵌入图片related类型,cid对应Content-ID
  5. 中文乱码别发愁,Header类来解烦忧。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐