Python 读取邮件

最近由于工作需要,对参会的代表发给我的姓名、电话、公司、行程车次等信息进行统计处理形成联系单,我的思路是:可以Python利用POP协议自动收取邮件,Numpy+Pandas对发来的数据进行处理并导出至Excel / MySQL数据库。

收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上。收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3。

POP3协议收取的不是一个已经可以阅读的邮件本身,而是邮件的原始文本,这和SMTP协议很像,SMTP发送的也是经过编码后的一大段文本。

要把POP3收取的文本变成可以阅读的邮件,还需要用email模块提供的各种类来解析原始文本,变成可阅读的邮件对象。
所以,用Python的poplib模块收取邮件分两步:第一步是用POP3协议把邮件获取到本地,第二步是用email模块把原始邮件解析为Message对象,然后,用适当的形式把邮件内容展示给用户。

收取邮件
import poplib
import email
import sys
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
 
 
def decode_str(s):
  value, charset = decode_header(s)[0]
  if charset:
    value = value.decode(charset)
  return value
 
 
def guess_charset(msg):
  # 先从msg对象获取编码:
  charset = msg.get_charset()
  if charset is None:
    # 如果获取不到,再从Content-Type字段获取:
    content_type = msg.get('Content-Type', '').lower()
    pos = content_type.find('charset=')
    if pos >= 0:
      charset = content_type[pos + 8:].s

### Python 使用 IMAP 和 POP3 协议读取邮件 #### 使用 IMAP 协议读取邮件 IMAP 是一种功能强大的协议,允许用户通过服务器检索电子邮件并管理其状态。以下是基于 `imaplib` 的示例代码: ```python import email import imaplib def read_email_from_gmail(): mail = imaplib.IMAP4_SSL('imap.gmail.com') # 连接到 Gmail 的 IMAP 服务 (retcode, capabilities) = mail.login('your-email@gmail.com', 'your-password') mail.select() # 默认选择 INBOX 文件夹 typ, data = mail.search(None, '(UNSEEN)') for num in data[0].split(): typ, msg_data = mail.fetch(num, '(RFC822)') raw_email = msg_data[0][1] # 将原始数据解析为 EmailMessage 对象 email_message = email.message_from_bytes(raw_email) print(f"From: {email.utils.parseaddr(email_message['From'])[1]}") # 发件人地址 print(f"To: {email_message['To']}") # 收件人地址 print(f"Subject: {email_message['Subject']}") # 主题 if email_message.is_multipart(): for part in email_message.walk(): content_type = part.get_content_type() content_disposition = str(part.get("Content-Disposition")) try: body = part.get_payload(decode=True).decode() except Exception as e: pass if content_type == "text/plain" and "attachment" not in content_disposition: print(body) else: print(email_message.get_payload(decode=True).decode()) read_email_from_gmail() ``` 此代码展示了如何连接到 Gmail 的 IMAP 服务器,并提取未读邮件的内容[^1]。 --- #### 使用 POP3 协议读取邮件 POP3 更适合一次性下载所有邮件的场景。以下是基于 `poplib` 的示例代码: ```python import poplib from email import parser def fetch_pop3_emails(): pop_conn = poplib.POP3_SSL('pop.qq.com') # 替换为您的邮箱对应的 POP3 服务器 pop_conn.user('your-email@qq.com') # 用户名 pop_conn.pass_('your-password') # 密码 messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)] messages = ["\n".join([line.decode('utf-8') for line in mssg[1]]) for mssg in messages] emails = [] for message in messages: email_obj = parser.Parser().parsestr(message) emails.append(email_obj) for email_item in emails[::-1]: print(f"From: {email_item['From']}") print(f"To: {email_item['To']}") print(f"Subject: {email_item['Subject']}\n") fetch_pop3_emails() ``` 这段代码演示了如何使用 QQ 邮箱的 POP3 服务登录账户并打印每封邮件的基本信息[^2]。 --- #### 处理 HTML 格式的邮件内容 有时邮件内容可能并非纯文本 (`plain/text`) 而是以 HTML 形式呈现。在这种情况下,可以借助第三方库如 BeautifulSoup 来处理复杂结构的数据: ```python from bs4 import BeautifulSoup def extract_html_content(html_body): soup = BeautifulSoup(html_body, 'html.parser') text_only = soup.get_text(separator='\n') return text_only.strip() # 假设 html_body 是从邮件中提取的 HTML 字符串 cleaned_text = extract_html_content("<p>Hello,<br>World!</p>") print(cleaned_text) ``` 该函数能够将嵌套复杂的 HTML 数据转换为可读性强的纯文本形式[^3]。 --- #### 注意事项 当构建 MIME 文本对象时,应确保编码方式支持国际化字符集(UTF-8),以便正确显示非 ASCII 字符集的语言环境下的消息体[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值