术→技巧, 研发

Python 收发Email电子邮件

钱魏Way · · 156 次浏览
!文章内容如有错误或排版问题,请提交反馈,非常感谢!

标准库中的电子邮件

Python标准库中有几个模块专门用于处理电子邮件的创建、解析、发送和接收。

  • smtplib:用于发送电子邮件。实现了SMTP(Simple Mail Transfer Protocol)协议。允许通过邮件服务器发送邮件。
  • email:提供用于管理电子邮件消息的工具。包含多个子模块,例如mime用于创建MIME(Multipurpose Internet Mail Extensions)对象。支持构建和解析复杂的邮件结构,包括多部分邮件和附件。
  • poplib:用于接收电子邮件。实现了POP3(Post Office Protocol version 3)协议。适用于从邮件服务器上下载邮件。
  • imaplib:用于接收电子邮件。实现了IMAP4(Internet Message Access Protocol version 4)协议。提供更灵活的邮件管理功能,如搜索和部分下载。

smtplib:SMTP协议客户端

Python标准库中的smtplib模块用于实现与SMTP(Simple Mail Transfer Protocol)服务器的通信。SMTP是一种用于发送电子邮件的协议,smtplib模块提供了发送电子邮件所需的工具。你可以使用它来构建邮件消息,并将其发送到指定的邮件服务器进行转发。

smtplib.SMTP

SMTP类用于与SMTP服务器建立连接并执行发送邮件的操作。

构造函数:SMTP(host=”, port=25, timeout=None):创建一个SMTP客户端实例。

  • host:SMTP服务器的主机名或IP地址。
  • port:端口号,默认为25(标准SMTP端口)。
  • timeout:连接超时时间,默认为None(使用系统默认的超时时间)。

主要方法:

  • 连接和登录:
  • login(user, password):使用指定的用户名和密码进行登录(通常用于需要身份验证的SMTP服务器)。
  • quit():退出SMTP会话。
  • 发送邮件:sendmail(from_addr, to_addrs, msg):发送电子邮件。
  • from_addr:发件人地址。
  • to_addrs:收件人地址(可以是单个地址或地址列表)。
  • msg:邮件消息的内容(应该是符合邮件格式的字符串)。
  • 其他操作:
  • ehlo():发送EHLO命令,标识客户端并查询服务器支持的扩展功能。
  • helo():发送HELO命令,标识客户端(兼容性命令,通常ehlo()更常用)。
  • starttls():启动TLS(Transport Layer Security)加密连接。
  • set_debuglevel(level):设置调试级别,显示通信的详细信息。level:调试级别,0表示不输出调试信息,1表示输出调试信息。

示例:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# 创建SMTP客户端实例
smtp = smtplib.SMTP('smtp.example.com', 587)

# 启动TLS加密连接
smtp.starttls()

# 登录到SMTP服务器
smtp.login('username', 'password')

# 构建邮件
msg = MIMEMultipart()
msg['From'] = 'from@example.com'
msg['To'] = 'to@example.com'
msg['Subject'] = 'Test Email'

body = 'This is a test email.'
msg.attach(MIMEText(body, 'plain'))

# 发送邮件
smtp.sendmail('from@example.com', 'to@example.com', msg.as_string())

# 退出会话
smtp.quit()

smtplib.SMTP_SSL

SMTP_SSL类用于通过SSL(安全套接字层)连接到SMTP服务器,提供加密的通信。

构造函数:SMTP_SSL(host=”, port=465, keyfile=None, certfile=None, timeout=None):创建一个SSL连接的SMTP客户端实例。

  • host:SMTP服务器的主机名或IP地址。
  • port:端口号,默认为465(标准SSL端口)。
  • keyfile:用于SSL连接的私钥文件路径,默认为None。
  • certfile:用于SSL连接的证书文件路径,默认为None。
  • timeout:连接超时时间,默认为None(使用系统默认的超时时间)。

示例:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# 创建SMTP_SSL客户端实例
smtp = smtplib.SMTP_SSL('smtp.example.com', 465)

# 登录到SMTP服务器
smtp.login('username', 'password')

# 构建邮件
msg = MIMEMultipart()
msg['From'] = 'from@example.com'
msg['To'] = 'to@example.com'
msg['Subject'] = 'Test Email'

body = 'This is a test email.'
msg.attach(MIMEText(body, 'plain'))

# 发送邮件
smtp.sendmail('from@example.com', 'to@example.com', msg.as_string())

# 退出会话
smtp.quit()

错误处理

在与SMTP服务器交互时,可能会遇到各种错误。可以通过捕获smtplib.SMTPException异常来处理这些错误。

示例:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

try:
    smtp = smtplib.SMTP('smtp.example.com', 587)
    smtp.starttls()
    smtp.login('username', 'password')

    msg = MIMEMultipart()
    msg['From'] = 'from@example.com'
    msg['To'] = 'to@example.com'
    msg['Subject'] = 'Test Email'
    body = 'This is a test email.'
    msg.attach(MIMEText(body, 'plain'))

    smtp.sendmail('from@example.com', 'to@example.com', msg.as_string())
except smtplib.SMTPException as e:
    print(f'SMTP Error: {e}')
finally:
    smtp.quit()

email:电子邮件和MIME处理

email模块是Python标准库中的一个模块,用于创建、解析和处理电子邮件消息。它提供了处理电子邮件的工具,包括构建邮件、解析邮件内容、处理邮件头部和附件等。这个模块支持MIME(多用途互联网邮件扩展)标准,使得处理复杂的邮件内容变得更加容易。

email模块包括几个主要的子模块和类,用于不同的邮件处理任务:

  • message:处理电子邮件的消息部分,包括 MIME 消息的创建和解析。
  • mime:创建 MIME 类型的邮件部分。
  • header:处理邮件头部的编码和解码。
  • utils:提供邮件相关的实用功能,如日期格式化和地址解析。

使用场景

  • 邮件创建:创建和发送复杂的电子邮件,包括文本、HTML、附件等。
  • 邮件解析:解析收到的电子邮件,提取内容、头部信息和附件。
  • 邮件处理:处理邮件内容和头部,进行格式化和编码。

注意事项

  • 邮件格式:确保正确设置邮件的 MIME 类型,以便邮件客户端能够正确显示内容。
  • 编码:处理多字节字符集时,应正确编码邮件头部,以支持国际化字符。
  • 附件管理:处理附件时,确保文件路径和 MIME 类型正确,以便邮件接收方能够正确读取附件内容。

email.message.EmailMessage

功能:表示电子邮件消息的基本类,支持 MIME 消息格式。

主要方法:

  • set_content(content, maintype=’text’, subtype=’plain’, charset=None):设置消息的内容和 MIME 类型。
  • add_attachment(payload, maintype=’application’, subtype=’octet-stream’, filename=None):添加附件。
  • as_string(unixfrom=False):将消息转换为字符串表示。
  • get_payload(decode=False):获取消息的负载内容。

示例:

from email.message import EmailMessage

msg = EmailMessage()
msg.set_content("This is the body of the email")
msg["Subject"] = "Test Email"
msg["From"] = "sender@example.com"
msg["To"] = "receiver@example.com"

print(msg.as_string())

email.mime 子模块

功能:创建 MIME 类型的邮件部分,包括文本、图片、音频等。

常用类:

  • mime.text.MIMEText:用于创建文本内容的 MIME 部分。
  • mime.multipart.MIMEMultipart:用于创建多部分消息(如文本和附件)。
  • mime.image.MIMEImage:用于创建图片附件的 MIME 部分。
  • mime.audio.MIMEAudio:用于创建音频附件的 MIME 部分。
  • mime.base.MIMEBase:用于创建基本的 MIME 部分。

示例:

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

# 创建邮件
msg = MIMEMultipart()
msg["Subject"] = "Test Email with Attachment"
msg["From"] = "sender@example.com"
msg["To"] = "receiver@example.com"

# 添加邮件正文
text = MIMEText("This is the body of the email")
msg.attach(text)

# 添加图片附件
with open("image.jpg", "rb") as f:
    img = MIMEImage(f.read(), name="image.jpg")
    msg.attach(img)

# 添加 PDF 附件
with open("document.pdf", "rb") as f:
    pdf = MIMEApplication(f.read(), name="document.pdf")
    msg.attach(pdf)

print(msg.as_string())

email.header.Header

功能:处理邮件头部的编码和解码,支持多字节字符集(如 UTF-8)。

主要方法:

  • encode(s, charset):将字符串编码为指定字符集的头部格式。
  • decode(header):解码头部字符串。

示例:

from email.header import Header

h = Header("测试邮件", charset='utf-8')
print(h.encode())

email.utils

功能:提供邮件处理的实用功能,如日期格式化和地址解析。

常用函数:

  • formataddr(addr):格式化地址信息。
  • parseaddr(addr):解析地址信息。
  • formatdate(timeval=None, localtime=False, usegmt=False):格式化日期为邮件格式。
  • getaddresses(addrlist):解析地址列表。

示例:

from email.utils import formataddr, parseaddr, formatdate

formatted_address = formataddr(("John Doe", "john.doe@example.com"))
print(formatted_address)

parsed_address = parseaddr("John Doe <john.doe@example.com>")
print(parsed_address)

date_str = formatdate()
print(date_str)

主要常量

email.policy:定义邮件政策,用于解析和生成符合特定标准的邮件。包括 email.policy.default、email.policy.EmailPolicy 等。

示例:创建和发送简单的邮件

import smtplib
from email.message import EmailMessage

# 创建邮件
msg = EmailMessage()
msg.set_content("This is a test email.")
msg["Subject"] = "Test Email"
msg["From"] = "sender@example.com"
msg["To"] = "receiver@example.com"

# 发送邮件
with smtplib.SMTP("smtp.example.com", 587) as server:
    server.starttls()
    server.login("username", "password")
    server.send_message(msg)

示例:解析邮件

from email import policy
from email.parser import BytesParser

# 读取邮件内容
with open("email.eml", "rb") as f:
    msg = BytesParser(policy=policy.default).parse(f)

# 获取邮件内容
print(msg["Subject"])
print(msg.get_body(preferencelist=("plain")).get_content())

poplib:POP协议客户端

Python标准库中的poplib模块用于实现一个客户端,以访问和操作POP3(Post Office Protocol version 3)邮件服务器。POP3是一种用于从邮件服务器检索邮件的协议,主要用于下载邮件到本地客户端。

poplib.POP3

POP3类用于与POP3服务器建立连接并执行各种操作。

构造函数:POP3(host=”, port=0, timeout=None):创建一个POP3客户端实例。

  • host:POP3服务器的主机名或IP地址。
  • port:端口号,默认为0(使用默认端口110)。
  • timeout:连接超时时间,默认为None(即无超时)。

主要方法:

  • 连接和登录:
  • user(user):指定用户名进行身份验证。
  • pass_(passwd):指定密码进行身份验证。
  • quit():退出POP3会话。
  • 邮件操作:
  • list():列出所有邮件的编号和大小。
  • retr(n):检索指定编号的邮件。n:邮件编号。
  • dele(n):标记指定编号的邮件以便删除。n:邮件编号。
  • top(n, num):检索指定编号邮件的头部和前num行内容。n:邮件编号。num:要检索的行数。
  • noop():发送NOOP命令,检查与服务器的连接是否仍然有效。
  • stat():获取当前邮箱的状态信息(例如邮件数量和总大小)。

示例:

import poplib

# 连接到POP3服务器
pop3_server = poplib.POP3('pop.example.com')

# 登录到服务器
pop3_server.user('username')
pop3_server.pass_('password')

# 列出所有邮件
response, mails, octets = pop3_server.list()
print('Mail list:', mails)

# 获取第一封邮件的内容
response, lines, octets = pop3_server.retr(1)
msg = b'\n'.join(lines).decode('utf-8')
print('Message:', msg)

# 删除第一封邮件
pop3_server.dele(1)

# 退出会话
pop3_server.quit()

poplib.POP3_SSL

POP3_SSL类用于通过SSL(安全套接字层)连接到POP3服务器,提供了加密的通信。

构造函数:POP3_SSL(host=”, port=0, timeout=None, keyfile=None, certfile=None):创建一个SSL连接的POP3客户端实例。

  • host:POP3服务器的主机名或IP地址。
  • port:端口号,默认为0(使用默认端口995)。
  • timeout:连接超时时间,默认为None(即无超时)。
  • keyfile:用于SSL连接的私钥文件路径,默认为None。
  • certfile:用于SSL连接的证书文件路径,默认为None。

示例:

import poplib

# 连接到POP3 SSL服务器
pop3_ssl_server = poplib.POP3_SSL('pop.example.com')

# 登录到服务器
pop3_ssl_server.user('username')
pop3_ssl_server.pass_('password')

# 列出所有邮件
response, mails, octets = pop3_ssl_server.list()
print('Mail list:', mails)

# 获取第一封邮件的内容
response, lines, octets = pop3_ssl_server.retr(1)
msg = b'\n'.join(lines).decode('utf-8')
print('Message:', msg)

# 删除第一封邮件
pop3_ssl_server.dele(1)

# 退出会话
pop3_ssl_server.quit()

错误处理

在与POP3服务器交互时,可能会遇到各种错误。可以通过捕获poplib.error_proto异常来处理这些错误。

示例:

import poplib
from poplib import error_proto

try:
    pop3_server = poplib.POP3('pop.example.com')
    pop3_server.user('username')
    pop3_server.pass_('password')
    # 执行其他POP3操作
except error_proto as e:
    print(f"POP3 protocol error: {e}")
finally:
    pop3_server.quit()

imaplib:IMAP4协议客户端

Python标准库中的imaplib模块用于实现与IMAP(Internet Message Access Protocol)邮件服务器的通信。IMAP是一种用于从邮件服务器读取电子邮件的协议,它支持邮件的管理和操作,包括读取、删除、标记邮件等。imaplib模块允许Python程序与IMAP邮件服务器进行交互,执行这些操作。

imaplib.IMAP4

IMAP4类用于与IMAP服务器建立连接并执行各种操作。

构造函数:IMAP4(host=”, port=0):创建一个IMAP4客户端实例。

  • host:IMAP服务器的主机名或IP地址。
  • port:端口号,默认为0(使用默认端口143)。

主要方法:

  • 连接和登录:
  • login(user, password):使用指定的用户名和密码进行登录。
  • logout():退出IMAP会话。
  • 邮箱操作:
  • select(mailbox=’INBOX’):选择邮箱进行操作。mailbox:要选择的邮箱,默认为’INBOX’。
  • create(mailbox):创建新的邮箱。mailbox:要创建的邮箱名称。
  • delete(mailbox):删除指定的邮箱。mailbox:要删除的邮箱名称。
  • rename(old_mailbox, new_mailbox):重命名邮箱。
  • 邮件操作:
  • search(charset, *criteria):搜索符合条件的邮件。charset:字符集,通常使用UTF-8。criteria:搜索条件。
  • fetch(mail_ids, message_parts):获取指定邮件的内容。mail_ids:邮件ID列表。message_parts:要获取的邮件部分(例如’RFC822’表示整个邮件)。
  • store(mail_ids, command, flags):修改指定邮件的标记。mail_ids:邮件ID列表。command:操作命令(如’+FLAGS’或’-FLAGS’)。flags:要添加或删除的标记。
  • 其他操作:
  • noop():发送NOOP命令,检查与服务器的连接是否仍然有效。
  • close():关闭当前选中的邮箱。
import imaplib

# 连接到IMAP服务器
mail = imaplib.IMAP4('imap.example.com')

# 登录到服务器
mail.login('username', 'password')

# 选择邮箱
mail.select('INBOX')

# 搜索所有邮件
status, data = mail.search(None, 'ALL')
mail_ids = data[0].split()

# 获取最新邮件的内容
latest_mail_id = mail_ids[-1]
status, data = mail.fetch(latest_mail_id, '(RFC822)')
raw_email = data[0][1]
print(raw_email.decode('utf-8'))

# 退出会话
mail.logout()

imaplib.IMAP4_SSL

IMAP4_SSL类用于通过SSL(安全套接字层)连接到IMAP服务器,提供了加密的通信。

构造函数:IMAP4_SSL(host=”, port=0, keyfile=None, certfile=None):创建一个SSL连接的IMAP4客户端实例。

  • host:IMAP服务器的主机名或IP地址。
  • port:端口号,默认为0(使用默认端口993)。
  • keyfile:用于SSL连接的私钥文件路径,默认为None。
  • certfile:用于SSL连接的证书文件路径,默认为None。

示例:

import imaplib

# 连接到IMAP SSL服务器
mail = imaplib.IMAP4_SSL('imap.example.com')

# 登录到服务器
mail.login('username', 'password')

# 选择邮箱
mail.select('INBOX')

# 搜索所有邮件
status, data = mail.search(None, 'ALL')
mail_ids = data[0].split()

# 获取最新邮件的内容
latest_mail_id = mail_ids[-1]
status, data = mail.fetch(latest_mail_id, '(RFC822)')
raw_email = data[0][1]
print(raw_email.decode('utf-8'))

# 退出会话
mail.logout()

错误处理

在与IMAP服务器交互时,可能会遇到各种错误。可以通过捕获imaplib.IMAP4.error异常来处理这些错误。

示例:

import imaplib

try:
    mail = imaplib.IMAP4('imap.example.com')
    mail.login('username', 'password')
    mail.select('INBOX')
    status, data = mail.search(None, 'ALL')
    print(data)
except imaplib.IMAP4.error as e:
    print(f'IMAP Error: {e}')
finally:
    mail.logout()

Python邮箱服务器

Modoboa

modoboa是一个开源的电子邮件托管和管理平台,旨在帮助用户轻松部署和管理自己的电子邮件服务器。它提供了一个完整的邮件服务器解决方案,集成了多个开源组件,以便为用户提供丰富的功能。

主要组件

  • Postfix:作为邮件传输代理(MTA),负责邮件的发送和接收。
  • Dovecot:作为邮件投递代理(MDA),负责存储和检索邮件。
  • Roundcube:作为Webmail客户端,提供基于Web的邮件访问。
  • Amavis、SpamAssassin和ClamAV:用于反垃圾邮件和反病毒保护。
  • Nginx:作为Web服务器,处理Webmail和管理界面的请求。
  • Let’s Encrypt:提供免费的SSL/TLS证书,确保邮件传输的安全性。

关键特性

  • 用户和域管理:
    • 提供用户友好的管理界面,可以轻松管理用户账户和邮件域。
    • 支持多域名托管,每个域名可以独立管理。
  • 集成反垃圾邮件和反病毒功能:
    • 集成了SpamAssassin和ClamAV,以检测和过滤垃圾邮件和病毒。
    • 提供了自动化的垃圾邮件过滤和病毒扫描功能。
  • Webmail客户端:
    • 内置了Roundcube作为Webmail客户端,用户可以通过浏览器访问和管理邮件。
    • 提供直观的用户界面,支持常用的邮件操作。
  • 自动化安装和配置:
    • 提供了一个自动安装脚本,可以在常见的Linux发行版上快速部署。
    • 自动配置邮件服务器所需的组件,如Postfix、Dovecot等。
  • 日历和联系人管理:
    • 支持CalDAV和CardDAV协议,可以与日历和联系人应用同步。
    • 提供简单的日历和联系人管理功能。
  • 统计和报告:
    • 提供邮件流量的统计和分析功能。
    • 可以生成关于邮件活动的详细报告。
  • 插件架构:
    • 支持插件扩展,可以根据需要添加额外的功能。
    • 社区提供了许多可用的插件,扩展了Modoboa的功能。

使用场景

  • Modoboa非常适合中小型企业、组织或个人用户,他们希望拥有自己的电子邮件服务器而不依赖于第三方服务。通过Modoboa,用户可以完全控制自己的邮件数据,并根据需要定制邮件服务。
  • 总之,Modoboa是一个功能强大且易于使用的邮件服务器解决方案,适合那些希望自主托管邮件服务的用户。

安装与配置

Modoboa提供了一个自动化安装脚本,可以在Ubuntu、Debian和CentOS等Linux发行版上快速部署。安装过程包括:

  • 下载并运行Modoboa安装脚本。
  • 脚本将自动安装和配置所有必要的组件。
  • 在安装过程中,用户可以选择启用或禁用某些功能。
  • 完成安装后,用户可以通过Web界面进行进一步配置。

Salmon

salmon是一个用Python编写的简单邮件服务器,旨在提供易于使用的邮件服务解决方案。

功能特性

  • 轻量级:Salmon旨在成为一个轻量级的邮件服务器,适合小规模部署和简单的邮件处理需求。
  • SMTP支持:提供基本的SMTP服务,允许接收和发送电子邮件。
  • 灵活性:通过Python实现,Salmon可以根据用户需求进行定制和扩展。
  • 简单配置:该项目的设计目标之一是易于配置和部署,适合开发者和小型团队使用。

使用场景

  • 开发和测试:由于其简单性,Salmon可以用于开发和测试环境中,以模拟邮件发送和接收。
  • 教育目的:对于学习邮件服务器工作原理或Python网络编程的用户来说,Salmon是一个很好的起点。
  • 小型项目:适合需要基本邮件功能的小型项目或个人使用。

Python邮件客户端

imbox

imbox 是一个用 Python 编写的简单而强大的 IMAP 客户端库,用于连接和操作 IMAP 邮件服务器。它可以帮助你轻松地读取、搜索和管理电子邮件。

功能特性

  • IMAP 支持:支持 IMAP4 协议,可以连接到各种主流邮件服务器,如 Gmail、Outlook、Yahoo 等。
  • 邮件搜索:提供强大的邮件搜索功能,支持多种搜索条件,如发件人、主题、日期等。
  • 邮件解析:自动解析邮件内容,包括文本、HTML 和附件。
  • 附件下载:支持下载邮件中的附件,并保存到本地文件系统。
  • 简单易用:提供简洁的 API,使得开发者可以快速上手并集成到自己的项目中。

以下是一些基本的使用示例,展示如何连接到邮件服务器、搜索邮件和下载附件。

连接到邮件服务器

from imbox import Imbox

# 连接到 IMAP 服务器
with Imbox('imap.gmail.com',
username='your_email@gmail.com',
password='your_password',
ssl=True,
ssl_context=None,
starttls=False) as imbox:

# 获取所有未读邮件
all_inbox_messages = imbox.messages(unread=True)

for uid, message in all_inbox_messages:
print(f'UID: {uid}')
print(f'Subject: {message.subject}')
print(f'From: {message.sent_from}')
print(f'To: {message.sent_to}')
print(f'Date: {message.date}')
print(f'Body: {message.body["plain"]}')
print(f'HTML Body: {message.body["html"]}')
print('---')

# 下载附件
for attachment in message.attachments:
filename = attachment.get('filename')
content = attachment.get('content').read()
with open(filename, 'wb') as f:
f.write(content)

搜索邮件

imbox 提供了多种搜索条件,可以灵活地查找邮件。以下是一些常见的搜索条件:

  • unread=True:未读邮件
  • flagged=True:标记为重要的邮件
  • unseen=True:未查看的邮件
  • sent_from=’sender@example.com’:来自特定发件人的邮件
  • sent_to=’recipient@example.com’:发送给特定收件人的邮件
  • date__on=datetime.date(2023,10,1):特定日期的邮件
  • date__gt=datetime.date(2023,10,1):日期大于指定日期的邮件
  • date__lt=datetime.date(2023,10,1):日期小于指定日期的邮件
  • subject=’Important’:包含特定主题的邮件

示例:

from imbox import Imbox
import datetime

with Imbox('imap.gmail.com',
username='your_email@gmail.com',
password='your_password',
ssl=True,
ssl_context=None,
starttls=False) as imbox:

# 搜索特定日期的邮件
messages_on_date = imbox.messages(date__on=datetime.date(2023,10,1))

for uid, message in messages_on_date:
print(f'Subject: {message.subject}')
print(f'From: {message.sent_from}')
print(f'To: {message.sent_to}')
print(f'Date: {message.date}')
print(f'Body: {message.body["plain"]}')
print('---')

处理邮件附件

imbox 提供了方便的方法来处理邮件附件。以下是一个示例,展示如何下载并保存附件:

from imbox import Imbox

with Imbox('imap.gmail.com',
username='your_email@gmail.com',
password='your_password',
ssl=True,
ssl_context=None,
starttls=False) as imbox:

# 获取所有带有附件的邮件
messages_with_attachments = imbox.messages(has_attachments=True)

for uid, message in messages_with_attachments:
print(f'Subject: {message.subject}')
print(f'From: {message.sent_from}')
print(f'To: {message.sent_to}')
print(f'Date: {message.date}')
print(f'Body: {message.body["plain"]}')
print('---')

# 下载附件
for attachment in message.attachments:
filename = attachment.get('filename')
content = attachment.get('content').read()
with open(filename, 'wb') as f:
f.write(content)

yagmail

yagmail 是一个用 Python 编写的库,旨在简化通过 Gmail 发送电子邮件的过程。它提供了一个直观且易于使用的接口,使开发者能够快速集成电子邮件功能。

功能特性

  • 简单易用:通过提供简单的 API,使得发送电子邮件变得非常容易。支持通过 Gmail 的 SMTP 服务器发送邮件。
  • HTML 支持:可以发送包含 HTML 内容的邮件,支持丰富的文本格式。
  • 附件支持:轻松添加附件到邮件中,支持多种文件格式。
  • 预配置凭据:可以在本地安全地存储 Gmail 凭据,避免在代码中明文写入密码。
  • 多平台支持:兼容 Windows、macOS 和 Linux。

在使用 yagmail 之前,需要配置 Gmail 凭据。可以使用以下命令在本地存储凭据:

yagmail.register('your_email@gmail.com', 'your_password')

以下是一些基本的使用示例,展示如何发送电子邮件和添加附件。

发送简单邮件

import yagmail

# 创建 Yagmail 客户端
yag = yagmail.SMTP('your_email@gmail.com')

# 发送邮件
yag.send(
to='recipient@example.com',
subject='Hello from Yagmail',
contents='This is a test email sent using Yagmail!'
)

发送 HTML 邮件

import yagmail

yag = yagmail.SMTP('your_email@gmail.com')

html_content = """
<h1>Hello</h1>
<p>This is a <b>test email</b> sent using Yagmail with <i>HTML content</i>!</p>
"""

yag.send(
to='recipient@example.com',
subject='HTML Email',
contents=html_content
)

添加附件

import yagmail

yag = yagmail.SMTP('your_email@gmail.com')

yag.send(
to='recipient@example.com',
subject='Email with Attachment',
contents='Please find the attachment below.',
attachments='/path/to/your/file.txt'
)

多收件人和抄送

可以轻松地发送邮件给多个收件人,并支持抄送和密送。

import yagmail

yag = yagmail.SMTP('your_email@gmail.com')

yag.send(
to=['recipient1@example.com', 'recipient2@example.com'],
cc='cc_recipient@example.com',
bcc='bcc_recipient@example.com',
subject='Email to Multiple Recipients',
contents='This email is sent to multiple recipients.'
)

使用别名

可以为发送者设置别名,使邮件看起来更专业。

import yagmail

yag = yagmail.SMTP('your_email@gmail.com', alias='Your Name')

yag.send(
to='recipient@example.com',
subject='Email with Alias',
contents='This email is sent with an alias.'
)

安全性注意事项

  • 应用密码:为了提高安全性,建议使用Gmail的应用密码功能,而不是直接使用Google帐户密码。
  • 两步验证:启用两步验证,并使用应用密码来登录yagmail。

mailer

mailer是一个用Python编写的简单电子邮件发送库,旨在通过SMTP协议简化邮件发送的过程。它为开发者提供了一个简洁的接口来构建和发送电子邮件,适合需要快速实现邮件发送功能的项目。

功能特性

  • SMTP支持:支持通过SMTP协议发送电子邮件,能够与大多数邮件服务器兼容。
  • 简单易用:提供了一个简单的API,使得邮件发送过程直观且易于实现。
  • 多收件人支持:可以轻松发送邮件给多个收件人,同时支持抄送(CC)和密送(BCC)。
  • 附件支持:允许在邮件中添加附件,支持多种文件格式。
  • 文本和HTML内容:支持发送纯文本和HTML格式的邮件内容。

以下是一些基本的使用示例,展示如何使用mailer发送电子邮件。

发送简单邮件

from mailer import Mailer
from mailer import Message

# 创建邮件消息
message = Message(From="your_email@example.com",
To="recipient@example.com",
Subject="Hello from Mailer")

message.Body = "This is a test email sent using the mailer package!"

# 创建邮件客户端并发送
mailer = Mailer('smtp.example.com')
mailer.send(message)

发送HTML邮件

from mailer import Mailer
from mailer import Message

message = Message(From="your_email@example.com",
To="recipient@example.com",
Subject="HTML Email")

message.Html = """
<h1>Hello</h1>
<p>This is a <b>test email</b> sent using the mailer package with <i>HTML content</i>!</p>
"""

mailer = Mailer('smtp.example.com')
mailer.send(message)

添加附件

from mailer import Mailer
from mailer import Message

message = Message(From="your_email@example.com",
To="recipient@example.com",
Subject="Email with Attachment")

message.Body = "Please find the attachment below."
message.attach('/path/to/your/file.txt')

mailer = Mailer('smtp.example.com')
mailer.send(message)

多收件人和抄送

可以轻松地发送邮件给多个收件人,并支持抄送和密送。

from mailer import Mailer
from mailer import Message

message = Message(From="your_email@example.com",
To=["recipient1@example.com", "recipient2@example.com"],
CC="cc_recipient@example.com",
BCC="bcc_recipient@example.com",
Subject="Email to Multiple Recipients")

message.Body = "This email is sent to multiple recipients."

mailer = Mailer('smtp.example.com')
mailer.send(message)

SMTP服务器配置

在使用mailer发送邮件时,需要配置SMTP服务器的信息。以下是一些常见的配置选项:

  • SMTP服务器地址:指定用于发送邮件的SMTP服务器地址。
  • 端口:通常是25、465(SSL)或587(TLS)。
  • 认证:如果服务器需要身份验证,需提供用户名和密码。

示例:

mailer = Mailer('smtp.example.com', port=587, use_tls=True, usr='your_email@example.com', pwd='your_password')

pyzmail

pyzmail是一个用于处理和发送电子邮件的Python库,专注于简化邮件的构建和解析过程。它支持构建复杂的电子邮件消息,包括多部分邮件、HTML内容和附件,并能解析接收到的邮件。

功能特性

  • 邮件构建:
    • 支持构建文本和HTML格式的邮件。
    • 支持多部分邮件(MIME),可以包含多种内容类型。
    • 允许添加附件,支持多种文件格式。
  • 邮件解析:
    • 能够解析复杂的电子邮件消息,包括多部分邮件和嵌入资源。
    • 支持提取邮件的头部、正文和附件。
  • 字符集和编码支持: 自动处理字符集和编码,支持国际化邮件。
  • SMTP发送: 提供简化的SMTP发送功能,能够通过SMTP服务器发送构建的邮件。

以下是一些基本的使用示例,展示如何使用pyzmail构建和解析电子邮件。

构建并发送电子邮件

from pyzmail import PyzMessage, compose_mail
import smtplib

# 构建邮件
payload, mail_from, rcpt_to, msg_id = compose_mail(
    sender=('Your Name', 'your_email@example.com'),
    recipients=[('Recipient Name', 'recipient@example.com')],
    subject='Hello from Pyzmail',
    text='This is a plain text part.',
    html='<h1>This is an HTML part</h1>',
    attachments=[('/path/to/attachment.pdf', 'application/pdf', 'attachment.pdf')]
)

# 发送邮件
smtp_host = 'smtp.example.com'
smtp_port = 587
smtp_login = 'your_email@example.com'
smtp_password = 'your_password'

with smtplib.SMTP(smtp_host, smtp_port) as smtp:
    smtp.starttls()
    smtp.login(smtp_login, smtp_password)
    smtp.sendmail(mail_from, rcpt_to, payload)

解析电子邮件

from pyzmail import PyzMessage
import email

# 假设 raw_email 是从邮件服务器获取的原始邮件数据
raw_email = b'...'  # 电子邮件的字节数据

# 解析邮件
msg = email.message_from_bytes(raw_email)
parsed_mail = PyzMessage.factory(msg)

# 获取邮件信息
print(f'From: {parsed_mail.get_address("from")}')
print(f'To: {parsed_mail.get_addresses("to")}')
print(f'Subject: {parsed_mail.get_subject()}')

# 获取正文内容
if parsed_mail.text_part:
    print('Text:', parsed_mail.text_part.get_payload().decode(parsed_mail.text_part.charset))
if parsed_mail.html_part:
    print('HTML:', parsed_mail.html_part.get_payload().decode(parsed_mail.html_part.charset))

# 获取附件
for part in parsed_mail.mailparts:
    if part.is_body == False:
        filename = part.filename
        content = part.get_payload()
        print(f'Attachment: {filename}')

多收件人和抄送

可以轻松地发送邮件给多个收件人,并支持抄送和密送。

payload, mail_from, rcpt_to, msg_id = compose_mail(
    sender=('Your Name', 'your_email@example.com'),
    recipients=[
        ('Recipient One', 'recipient1@example.com'),
        ('Recipient Two', 'recipient2@example.com')
    ],
    cc=[('CC Recipient', 'cc@example.com')],
    bcc=[('BCC Recipient', 'bcc@example.com')],
    subject='Email to Multiple Recipients',
    text='This email is sent to multiple recipients.'
)

其他邮件相关工具

Flanker

Flanker是一个用于电子邮件处理的Python库,由Mailgun开发。它旨在提供一组强大的工具来解析、验证和操作电子邮件地址、域名以及MIME消息。

功能特性

  • 电子邮件地址解析和验证: 解析电子邮件地址,并验证其格式和有效性。支持复杂的电子邮件地址格式和国际化域名(IDN)。
  • 域名验证: 检查域名的DNS记录,以验证其是否为有效的电子邮件域。支持MX记录查找,以确保域名能够接收邮件。
  • MIME消息解析和生成: 解析复杂的MIME消息,包括多部分邮件和附件。生成MIME消息,支持多种内容类型和编码。
  • 国际化支持: 支持国际化电子邮件地址(EAI)和域名。
  • 易于扩展: 具有模块化设计,易于扩展和集成到其他应用程序中。

以下是一些基本的使用示例,展示如何使用Flanker进行电子邮件地址解析和MIME消息处理。

电子邮件地址解析和验证

from flanker.addresslib import address

# 解析电子邮件地址
parsed_address = address.parse('John Doe <john.doe@example.com>')

if parsed_address:
    print(f'Email: {parsed_address.address}')
    print(f'Name: {parsed_address.display_name}')

# 验证电子邮件地址格式
is_valid = address.validate_address('john.doe@example.com')
print(f'Is valid: {is_valid}')

域名验证

from flanker.addresslib import validate

# 验证域名的MX记录
result = validate.mx('example.com')

if result:
    print('Domain has valid MX records.')
else:
    print('Domain does not have valid MX records.')

MIME消息解析

from flanker.mime import from_string

# 解析 MIME 消息
mime_message = from_string("""
From: John Doe <john.doe@example.com>
To: Jane Smith <jane.smith@example.com>
Subject: Test Email
Content-Type: text/plain

This is a test email message.
""")

print(f'From: {mime_message.headers["From"]}')
print(f'To: {mime_message.headers["To"]}')
print(f'Subject: {mime_message.headers["Subject"]}')
print(f'Body: {mime_message.body}')

生成 MIME 消息

可以使用 Flanker 生成复杂的 MIME 消息,包括附件和多部分内容。

from flanker.mime.message import part, create

# 创建 MIME 消息
text_part = part.create(text="This is a text part.")
html_part = part.create(html="<p>This is an HTML part.</p>")
mime_message = create.multipart('alternative', [text_part, html_part])

print(mime_message.to_string())

处理国际化电子邮件地址

Flanker 支持国际化电子邮件地址(EAI),可以处理包含非 ASCII 字符的地址。

from flanker.addresslib import address

# 解析国际化电子邮件地址
parsed_address = address.parse('用户@例子.公司')

if parsed_address:
    print(f'Email: {parsed_address.address}')

mailparser

mailparser 是一个用于解析电子邮件的 Python 库,专注于从原始电子邮件内容中提取有用的信息。它提供了一种简单且有效的方式来解析电子邮件,并提取出如发件人、收件人、主题、正文和附件等信息。

功能特性

  • 电子邮件解析:
    • 能够解析原始电子邮件格式,包括 RFC822 和 MIME 格式。
    • 支持解析多部分邮件和嵌入资源。
  • 信息提取:
    • 提取邮件的头部信息,包括发件人、收件人、抄送、主题、日期等。
    • 提取邮件的正文内容,支持纯文本和 HTML 格式。
    • 提取附件,并提供附件的元数据信息。
  • 字符集和编码支持: 自动处理邮件中的字符集和编码,确保正确解析国际化邮件内容。
  • 易于使用: 提供简单的 API,使解析电子邮件的过程直观且易于实现。

以下是一些基本的使用示例,展示如何使用 mailparser 解析电子邮件并提取信息。

解析电子邮件

import mailparser

# 假设 raw_email 是从邮件服务器获取的原始邮件数据
raw_email = b'...' # 电子邮件的字节数据

# 解析邮件
parsed_mail = mailparser.parse_from_bytes(raw_email)

# 获取邮件信息
print(f'From: {parsed_mail.from_}')
print(f'To: {parsed_mail.to}')
print(f'Subject: {parsed_mail.subject}')
print(f'Date: {parsed_mail.date}')

# 获取正文内容
print(f'Text: {parsed_mail.text_plain}')
print(f'HTML: {parsed_mail.text_html}')

# 获取附件
for attachment in parsed_mail.attachments:
    print(f'Attachment: {attachment["filename"]}')
    # 可以访问 attachment["payload"] 来获取附件的内容

从文件解析电子邮件

如果电子邮件内容存储在文件中,可以直接从文件解析:

parsed_mail = mailparser.parse_from_file('/path/to/email.eml')

# 获取信息同上

处理多部分邮件

mailparser 能够自动处理多部分邮件,并提取每个部分的内容。

# 解析邮件后,访问多部分邮件的内容
for part in parsed_mail.mail_parts:
    print(f'Content Type: {part["content_type"]}')
    print(f'Content: {part["payload"]}')

自定义解析

mailparser 提供了一些选项,可以自定义解析行为,如忽略某些头部信息或只提取特定类型的内容。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注