开发者

Python标准库中email模块的使用方法与内部机制详解

目录
  • 一、什么是 email 模块?
  • 二、模块结构与核心组件
  • 三、构建电子邮件
    • 3.1 创建纯文本邮件
    • 3.2 创建 html 邮件
    • 3.3 添加附件
  • 四、解析电子邮件
    • 4.1 解析原始邮件内容
    • 4.2 遍历多部分邮件内容
  • 五、常见 MIME 类型
    • 六、与 smtplib 联合发送邮件
      • 七、常用工具函数(email.utils)
        • 八、完整示例:发送带附件的 HTML 邮件
          • 九、调试技巧
            • 十、总结

              一、什么是 email 模块?

              email 是 python 内置的标准库,用于构建或解析符合 RFC 5322 标准的电子邮件。该模块支持:

              • 构建 MIME(Multipurpose Internet Mail Extensions)邮件,包括多部分邮件(multipart)、附件、文本/HTML 内容等。
              • 解码和解析原始邮件(如 .eml 文件、POP3/IMAP 下载的数据等)。
              • 支持编码(Base64、Quoted-Printable)、字符集处理、多语言兼容等。

              该模块最早出现在 Python 2.2,经过多次迭代,在 Python 3 中已高度模块化和现代化,使用更加清晰直观。

              二、模块结构与核心组件

              Python 的 email 库结构如下:

              • email.message: 定义邮件的结构(如 EmailMessage 类)。
              • email.mime: MIME 类型构建工具包,如 MIMETextMIMEImageMIMEMultipart
              • email.parser: 用于解析原始邮件字符串为 Message 对象。
              • email.generator: 用于将 Message 对象生成字符串或写入文件。
              • email.utils: 提供通用工具函数,如地址解析、时间格式化等。

              三、构建电子邮件

              3.1 创建纯文本邮件

              from email.message import EmailMessage
              
              msg = EmailMessage()
              msg['Subject'] = '测试邮件'
              msg['From'] = 'sender@example.com'
              msg['To'] = 'receiver@example.com'
              msg.set_content('这是纯文本邮件内容')
              
              print(msg.as_string())
              

              3.2 创建 HTML 邮件

              msg = EmailMessage()
              msg['Subject'] = 'HTML 邮件'
              msg['From'] = 'sender@example.com'
              msg['To'] = 'receiver@example.com'
              
              msg.set_content('这是纯文本备用内容')
              msg.add_alternative("""
              <html>
                <body>
                  <h1>这是一封 HTML 邮件</h1>
                </body>
              </html>
              """, subtype='html')
              

              3.3 添加附件

              with open('demo.pdf', 'rb') as f:
                  file_data = f.read()
                  file_name = f.name
              
              msg.add_attachment(file_data, maintype='application', subtype='pdf', filename=file_name)
              

              四、解析电子邮件

              email 支持将原始邮件(如 .eml&javascriptnbsp;文件)解析成结构化对象:

              4.1 解析原始邮件内容

              from email import policy
              from email.parser import BytesParser
              
              with open('sample.eml', 'rb') as f:
                  msg = BytesParser(policy=policy.default).parse(f)
              
              print('Subject:', msg['subject'])
              print('From:', msg['from'])
              print('To:', msg['to'])
              

              4.2 遍历多部分邮件内容

              if msg.is_multipart():
                  for part in msg.iter_parts():
                      content_type = part.get_content_type()
                      content = part.get_content()
                      print(f'Part: {content_type}\nContent:\n{content}\n')
              else:
                  print(msg.get_contenwww.devze.comt())
              

              五、常见 MIME 类型

              类型说明
              text/plain纯文本邮件
              text/htmlHTML 邮件
              multipart/mixed多部分邮件,通常包含附件
              multipart/alternative文本 + HTML 备用格式
              application/octet-stream任意二进制附件
              image/jpeg / image/png嵌入图像

              你可以使用 email.mime.* 中的各类构造器快速创建这些类型:

              from email.mime.text import MIMEText
              from email.mime.multipart import MIMEMultipart
              from email.mime.application import MIMEApplication
              

              六、与 smtplib 联合发送邮件

              虽然 email 负责构建邮件,但实际发送需要结合 smtplib

              import smtplib
              
              with smtplib.SMTP_SSL('smtp.example.com', 465) as smtp:
                  smtp.login('user@example.com', 'password')
                  smtp.send_message(msg)
              

              七、常用工具函数(email.utils)

              from email.utils import parseaddr, formataddr, format_datetime
              from datetime import datetime, timezone
              
              name, ehttp://www.devze.commail = parseaddr("小明 <xiaoming@example.com>")
              print(name, email)
              
              # 格式化地址
              print(formataddr(("测试人", "test@example.com")))
              
              # 格式化时间为邮件头格式
              print(format_datetime(datetime.now(timezone.utc)))
              

              八、完整示例:发送带附件的 HTML 邮件

              frojavascriptm email.message import EmailMessage
              import smtplib
              
              msg = EmailMessage()
              msg['Subject'] = '周报'
              msg['From'] = 'sender@example.com'
              msg['To'] = 'receiver@example.com'
              
              # 添加 HTML 正文
              msg.set_content('请查看 HTML 格式邮件')
              msg.add_alternative("""
              <html>
                <body>
                  <p>您好,</p>
                  <p>这是本周的周报,请查收附件。</p>
                </body>
              </html>
              """, subtype='html')
              
              # 添加附件
              with open('report.pdf', 'rb') as f:
                  msg.add_attachment(f.read(), maintype='application', subtype='pdf', filename='report.pdf')
              
              # 发送邮件
              with smtplib.SMTP_SSL('smtp.example.com', 465) as smtp:
                  smtp.login('sender@example.com', 'password')
                  smtp.send_message(msg)
              

              九、调试技巧

              • 使用 .as_string() 打印构造后的邮件内容以调试;
              • 若邮件乱码,需设置 charset='utf-8';
              • 多部分邮件优先顺序:multipart/alternative 由客户端选择最合适显示;
              • 若调试发送失败,可打开 smtplib 的调试日志:smtp.set_debuglevel(1)。

              十、总结

              Python 的 email 模块功能强大、标准化程度高,适合处理各种邮件构建与解http://www.devze.com析任务。掌握它不仅可以让你自动化报告发送、实现客服回复系统、构建邮件网关,还能与 SMTP/IMAP/POP3 模块联动开发出邮件相关应用。

              以上就是Python标准库中email模块的使用方法与内部机制详解的详细内容,更多关于Python email模块使用方法的资料请关注编程客栈(www.devze.com)其它相关文章!

              0

              上一篇:

              下一篇:

              精彩评论

              暂无评论...
              验证码 换一张
              取 消

              最新开发

              开发排行榜