【问题标题】:imapclient not reading an email properlyimapclient 没有正确阅读电子邮件
【发布时间】:2022-01-08 07:20:51
【问题描述】:

我正在尝试在 python 中导入电子邮件中的 HTML 表格。

我尝试了以下脚本:

HOST = 'imap.gmail.com'
USERNAME = username
PASSWORD = password
ssl = True

server = IMAPClient(HOST, use_uid=True, ssl=ssl)
server.login(USERNAME, PASSWORD)

select_info = server.select_folder('INBOX')
messages = server.search(['FROM', sender_address])

if len(messages) > 0:
   for mail_id, data in server.fetch(messages,['ENVELOPE','BODY[TEXT]']).items():
       envelope = data[b'ENVELOPE']
       body = data[b'BODY[TEXT]']

soup = BeautifulSoup(body)
table = soup.find_all('table')
df = pd.read_html(str(table))[0]

脚本运行良好,但我在表格中插入了一些随机“=”和“”。 这是带有黄色错误的数据帧输出示例

这是原始电子邮件表的示例:

我认为错误在于 IMAPClient 命令(而不是 BS 解析或 pandas),因为如果我检查“body”变量中的 HTML,我会发现错误已经存在。

我做错了什么?谢谢

【问题讨论】:

  • 您不是对消息进行 MIME 解码。电子邮件经过编码以便传输。这些额外的 = 是 Quoted Printable 编码的一部分,用于使其符合 7 位 ascii 和 78 个字符行的标准电子邮件限制。请参阅 python 中的电子邮件/MIME 模块,或者 IMAPClient 可能有帮助方法来为您进行解析和解码。
  • 试试我的github.com/ikvk/imap_tools,让我知道结果

标签: python html imap imapclient


【解决方案1】:

如果有人需要,下面的代码可以正常工作:

imap = imaplib.IMAP4_SSL('imap.gmail.com')
imap.login(username, password)
imap.select("inbox")

resp, items = imap.search(None, '(FROM "xxxx@xxxxxxxxx.com")')

for n, num in enumerate(items[0].split(), 1):
    resp, data = imap.fetch(num, '(RFC822)')

    body = data[0][1]
    msg = email.message_from_bytes(body)
    content = msg.get_payload(decode=True)

    soup = BeautifulSoup(content)
    table = soup.find_all('table')
    df = pd.read_html(str(table))[0]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2018-07-08
    • 2018-06-21
    相关资源
    最近更新 更多