Python获取邮箱内容并解析

本文提供了一个使用Python读取POP3服务器上邮件的示例代码。通过输入邮件地址、口令及POP3服务器地址,可以连接并读取邮件内容。代码展示了如何解析邮件头、正文及附件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding: utf-8 -*-

from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr

import poplib

输入邮件地址, 口令和POP3服务器地址:
email = input('Email: ')
password = input('Password: ')
pop3_server = input('POP3 server: ')

def guess_charset(msg):
    charset = msg.get_charset()
    if charset is None:
        content_type = msg.get('Content-Type', '').lower()
        pos = content_type.find('charset=')
        if pos >= 0:
            charset = content_type[pos + 8:].strip()
    return charset

def decode_str(s):
    value, charset = decode_header(s)[0]
    if charset:
        value = value.decode(charset)
    return value

def print_info(msg, indent=0):
    if indent == 0:
        for header in ['From', 'To', 'Subject']:
            value = msg.get(header, '')
            if value:
                if header=='Subject':
                    value = decode_str(value)
                else:
                    hdr, addr = parseaddr(value)
                    name = decode_str(hdr)
                    value = u'%s <%s>' % (name, addr)
            print('%s%s: %s' % ('  ' * indent, header, value))
    if (msg.is_multipart()):
        parts = msg.get_payload()
        for n, part in enumerate(parts):
            print('%spart %s' % ('  ' * indent, n))
            print('%s--------------------' % ('  ' * indent))
            print_info(part, indent + 1)
    else:
        content_type = msg.get_content_type()
        if content_type=='text/plain' or content_type=='text/html':
            content = msg.get_payload(decode=True)
            charset = guess_charset(msg)
            if charset:
                content = content.decode(charset)
            print('%sText: %s' % ('  ' * indent, content + '...'))
        else:
            print('%sAttachment: %s' % ('  ' * indent, content_type))

# 连接到POP3服务器:
server = poplib.POP3_SSL(pop3_server, 995)
# 可以打开或关闭调试信息:
server.set_debuglevel(1)
# 可选:打印POP3服务器的欢迎文字:
print(server.getwelcome().decode('utf-8'))
# 身份认证:
server.user(email)
server.pass_(password)
# stat()返回邮件数量和占用空间:
print('Messages: %s. Size: %s' % server.stat())
# list()返回所有邮件的编号:
resp, mails, octets = server.list()
# 可以查看返回的列表类似[b'1 82923', b'2 2184', ...]
print(mails)
# 获取最新一封邮件, 注意索引号从1开始:
index = len(mails)
resp, lines, octets = server.retr(index)
# lines存储了邮件的原始文本的每一行,
# 可以获得整个邮件的原始文本:
msg_content = b'\r\n'.join(lines).decode('utf-8')
# 稍后解析出邮件:
msg = Parser().parsestr(msg_content)
print_info(msg)
# 可以根据邮件索引号直接从服务器删除邮件:
# server.dele(index)
# 关闭连接:
server.quit()
<think>嗯,用户想用Python的imaplib和email库来访问邮箱文件夹。首先,我需要回顾一下imaplib的基本用法,确保自己记得正确的步骤。记得imaplib需要先连接服务器,然后登录,之后才能选择文件夹。用户的问题可能涉及到如何列出所有可用的邮箱文件夹,而不仅仅是收件箱。 首先,连接服务器的时候要用IMAP4_SSL,这样是加密的连接,比较安全。然后登录需要邮箱账号和密码,或者是应用专用密码,如果邮箱服务商支持的话。比如Gmail可能需要开启IMAP访问权限,且可能生成一个应用专用密码。 接下来,选择文件夹通常是使用select()方法,但用户可能想列出所有可用的文件夹。这时候应该用list()方法。我记得imaplib的list()方法会返回一个响应和包含文件夹列表的数据。需要解析这些数据,可能涉及到分割字符串或者使用特定的格式来处理。 然后,用户可能需要查看每个文件夹中的邮件数量,这时候可以用status()方法,比如获取文件夹中的邮件总数。例如STATUS命令的参数是'(MESSAGES)',这样就可以得到数量。 另外,用户可能还会关心如何读取不同文件夹中的邮件内容。这部分可能需要先选择对应的文件夹,然后搜索或获取邮件。比如在示例中,用户可能遍历所有文件夹,然后逐个处理里面的邮件。 需要注意的是,不同的邮箱服务商可能有不同的文件夹命名方式,比如Gmail的标签系统可能和传统的文件夹结构不同,这时候可能需要特别处理。 还要确保代码示例中的异常处理,比如网络连接问题,或者认证失败的情况。不过用户可能暂时不需要这些,但作为教程,最好还是提到可能的错误和解决方法。 引用中的内容提到使用mail.select('INBOX'),但用户的问题是关于获取其他文件夹的。所以需要扩展这个示例,展示如何列出所有文件夹,而不仅仅是收件箱。 另外,参考引用[3]中的Imbox库,可能可以提到使用第三方库来简化操作,但用户明确要求使用imaplib和email库,所以可能不需要深入讨论第三方库,但可以作为一个补充信息。 最后,要确保生成的代码符合Python语法,尤其是处理返回数据部分,比如split()和decode()的正确使用。例如,mail_ids = data[0].split()这里需要确保data的结构正确,否则可能会出错。 总结步骤应该是:连接服务器,登录,列出文件夹,选择特定文件夹,获取邮件列表,最后读取邮件内容。同时要处理可能的编码问题,比如邮箱文件夹名称可能是UTF-7编码,需要使用decode()转换。 现在需要将这些步骤整理成一个清晰的教程,确保每一步都有代码示例和解释,引用相关的参考资料中的示例。比如引用[1]中的基本流程,引用[4]中的使用imaplib和email模块的方法。</think>以下是如何使用Python的`imaplib`和`email`库访问邮箱文件夹的逐步教程: --- ### 步骤 1:连接IMAP服务器 首先通过SSL加密连接到IMAP服务器,确保通信安全: ```python import imaplib # 连接到IMAP服务器(以Gmail为例) mail = imaplib.IMAP4_SSL('imap.gmail.com') ``` --- ### 步骤 2:登录邮箱账号 使用邮箱账号和密码(或应用专用密码)登录: ```python # 登录邮箱(需开启IMAP权限) mail.login('your_email@gmail.com', 'your_password_or_app_password') ``` --- ### 步骤 3:列出所有邮箱文件夹 使用`list()`方法获取所有文件夹名称,解析返回数据: ```python # 列出所有文件夹 result, folders = mail.list() if result == 'OK': for folder in folders: # 解析文件夹名称(通常为UTF-7编码) folder_name = folder.decode().split(' "/" ')[-1] print(f"可用文件夹: {folder_name}") ``` --- ### 步骤 4:选择特定文件夹 通过`select()`方法选择目标文件夹(如收件箱`INBOX`): ```python # 选择收件箱 mail.select('INBOX') # 或选择其他文件夹(如已发送邮件) # mail.select('"[Gmail]/Sent Mail"') ``` --- ### 步骤 5:搜索获取邮件 在选定的文件夹中搜索邮件遍历结果: ```python # 搜索所有未读邮件 result, data = mail.search(None, 'UNSEEN') mail_ids = data[0].split() for mail_id in mail_ids: # 获取邮件原始内容 result, data = mail.fetch(mail_id, '(RFC822)') raw_email = data[0][1] # 使用email库解析邮件 from email import message_from_bytes email_message = message_from_bytes(raw_email) # 打印邮件主题和发件人 print(f"主题: {email_message['Subject']}") print(f"发件人: {email_message['From']}") ``` --- ### 步骤 6:关闭连接 操作完成后关闭连接: ```python mail.logout() ``` --- ### 完整代码示例 ```python import imaplib from email import message_from_bytes # 连接服务器 mail = imaplib.IMAP4_SSL('imap.gmail.com') mail.login('your_email@gmail.com', 'your_password') # 列出所有文件夹 result, folders = mail.list() print("所有文件夹:") for folder in folders: print(folder.decode()) # 选择收件箱搜索邮件 mail.select('INBOX') result, data = mail.search(None, 'ALL') mail_ids = data[0].split() for mail_id in mail_ids[:5]: # 仅处理前5封邮件 result, data = mail.fetch(mail_id, '(RFC822)') email_message = message_from_bytes(data[0][1]) print(f"主题: {email_message['Subject']}") mail.logout() ``` --- ### 注意事项 1. **文件夹编码**:部分邮箱(如Gmail)使用UTF-7编码的文件夹名称,需用`.decode()`解析[^4]。 2. **安全认证**:部分邮箱需开启IMAP权限或使用应用专用密码(如Gmail)。 3. **错误处理**:添加`try-except`块处理网络或认证异常。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值