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

Written by

in

文章目录
  • 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 类型构建工具包,如 MIMEText、MIMEImage、MIMEMultipart。 email.parser: 用于解析原始邮件字符串为 Message 对象。 email.generator: 用于将 Message 对象生成字符串或写入文件。 email.utils: 提供通用工具函数,如地址解析、时间格式化等。
  • email 支持将原始邮件(如 .eml 文件)解析成结构化对象:
  • 类型 说明 text/plain 纯文本邮件 text/html HTML 邮件 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
  • 虽然 email 负责构建邮件,但实际发送需要结合 smtplib: import smtplib with smtplib.SMTP_SSL(‘smtp.example.com’, 465) as smtp: smtp.login(‘user@example.com’, ‘password’) smtp.send_message(msg)
  • from email.utils import parseaddr, formataddr, format_datetime from datetime import datetime, timezone name, email = parseaddr(“小明 <xiaoming@example.com>”) print(name, email) # 格式化地址 print(formataddr((“测试人”, “test@example.com”))) # 格式化时间为邮件头格式 print(format_datetime(datetime.now(timezone.utc)))
  • from 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 模块功能强大、标准化程度高,适合处理各种邮件构建与解析任务。掌握它不仅可以让你自动化报告发送、实现客服回复系统、构建邮件网关,还能与 SMTP/IMAP/POP3 模块联动开发出邮件相关应用。 以上就是Python标准库中email模块的使用方法与内部机制详解的详细内容,更多关于Python email模块使用方法的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: Python网络编程之使用email、smtplib、poplib、imaplib模块收发邮件 python email smtplib模块发送邮件代码实例 Python使用email模块对邮件进行编码和解码的实例教程 python中使用smtplib和email模块发送邮件实例 用smtplib和email封装python发送邮件模块类分享
  • 目录
    • 一、什么是 email 模块?
    • 二、模块结构与核心组件
    • 三、构建电子邮件
      • 3.1 创建纯文本邮件
      • 3.2 创建 HTML 邮件
      • 3.3 添加附件
    • 四、解析电子邮件
      • 4.1 解析原始邮件内容
      • 4.2 遍历多部分邮件内容
    • 五、常见 MIME 类型
      • 六、与 smtplib 联合发送邮件
        • 七、常用工具函数(email.utils)
          • 八、完整示例:发送带附件的 HTML 邮件
            • 九、调试技巧
              • 十、总结

                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: 提供通用工具函数,如地址解析、时间格式化等。

                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())
                

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

                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 文件)解析成结构化对象:

                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'])
                

                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_content())
                

                类型 说明
                text/plain 纯文本邮件
                text/html HTML 邮件
                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
                

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

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

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

                from 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 模块功能强大、标准化程度高,适合处理各种邮件构建与解析任务。掌握它不仅可以让你自动化报告发送、实现客服回复系统、构建邮件网关,还能与 SMTP/IMAP/POP3 模块联动开发出邮件相关应用。

                以上就是Python标准库中email模块的使用方法与内部机制详解的详细内容,更多关于Python email模块使用方法的资料请关注风君子博客其它相关文章!

                您可能感兴趣的文章:

                • Python网络编程之使用email、smtplib、poplib、imaplib模块收发邮件
                • python email smtplib模块发送邮件代码实例
                • Python使用email模块对邮件进行编码和解码的实例教程
                • python中使用smtplib和email模块发送邮件实例
                • 用smtplib和email封装python发送邮件模块类分享

                站内搜索