标准库中的电子邮件
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 提供了一些选项,可以自定义解析行为,如忽略某些头部信息或只提取特定类型的内容。