【问题标题】:Converting ASCII encoded characters inside string in Python在 Python 中转换字符串中的 ASCII 编码字符
【发布时间】:2021-05-28 20:13:54
【问题描述】:

我正在使用 IMapLib 库从我的邮件服务器读取电子邮件。电子邮件包含我的程序应解释的 JSON 编码消息。

邮件代码:

tmp, data = imap.search(None, "UNSEEN")
emails = []

for num in data[0].split():
    tmp, data = imap.fetch(num, "(BODY[TEXT])")
    # Only append the email body
    emails.append(str(data[0][1]))

我从 imaplib 获得的字符串包含一些特殊字符。我发现 =xx 看起来像“特殊”字符的 ASCII 编码版本。如何将包含此类字符的字符串转换为“常规”Python 字符串,或者我是否可能在 imaplib 代码中遗漏了错误编码字符串的选项?

我得到的示例字符串:

b'这是 Mime 格式的消息。如果你看到这个,你的邮件阅读器不支持这种格式。\r\n\r\n--=_8e336d0902b13eaec4e7906847c21a6d\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding:quoted-printable\r\n\r\n=0A=0A=0A=0A =0A =0A =0A =0A =0A =0A JSON{"arrival" :"03.03.21","departure":"07.03.21","email":"test=\r\n=2Etest@gmail.com","apartment":"app","ov=\r\ nerride":0}JSON =0A =0A=0A\r\n--=_8e336d0902b13eaec4e7906847c21a6d\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Transfer-Encoding:quoted-printable\r\n\r\n=0A=0A=0A=0A =0A =0A =0A =0A =0A

=0A JSON{"arrival":"03.03.21","departure":"07.03.21","email":"test=\r\n=2Etest@gmail.com","apartment": "app","ov=\r\nerride":0}JSON

=0A =0A=0A\r\n--=_8e336d0902b13eaec4e7906847c21a6d--\r\n'

我最初只是删除所有 '\n'、'\r' 和 '=' 但今天我收到了这个电子邮件/字符串,我的代码错误地将“test=\r\n=2Etest@gmail.com”解释为“test2Etest@gmail.com”而不是“test.test@gmail.com”

【问题讨论】:

  • 正如@Rivers 所说,您可以尝试使用 imap_tools lib。实际上,您不需要 quopri.decodestring 来解析电子邮件 - 请参阅 imap_tools message.py src。问候,imap_tools 作者。

标签: python json email ascii


【解决方案1】:

您的消息中有与编码相关的提示,即:

Content-Transfer-Encoding:quoted-printable

在您的文本中解释了=s。您可以使用quopri 内置模块来处理它,方式如下:

import quopri
message = b'test=\r\n=2Etest@gmail.com'
decoded = quopri.decodestring(message)
print(decoded)

输出:

b'test.test@gmail.com'

注意quopri.decodestring返回bytes,所以如果你必须有文字,你必须正确.decode,如果使用utf-8,它将是:

decoded = quopri.decodestring(message).decode('utf-8')

【讨论】:

    【解决方案2】:

    您正在处理名为“quoted printable”的编码方案(更多详细信息请参见 RFC 2045,第 6.7 节)。

    您至少有两个选择:

    1. 您可以使用 Python 模块 quopri
    2. 您可以使用 Python email 模块 (email.parser) 的解析器解析您的电子邮件。

    但如果您的目标是轻松获取电子邮件内容,则使用模块imap_toolsIMAPClient 会更容易。

    他们文档中的一些示例代码:

    imap_tools (https://pypi.org/project/imap-tools/):

    from imap_tools import MailBox, AND
    
    # get list of email subjects from INBOX folder
    with MailBox('imap.mail.com').login('test@mail.com', 'pwd') as mailbox:
        subjects = [msg.subject for msg in mailbox.fetch()]
    
    # get list of email subjects from INBOX folder - equivalent verbose version
    mailbox = MailBox('imap.mail.com')
    mailbox.login('test@mail.com', 'pwd', initial_folder='INBOX')  # or mailbox.folder.set instead 3d arg
    subjects = [msg.subject for msg in mailbox.fetch(AND(all=True))]
    mailbox.logout()
    

    IMAPClient (https://imapclient.readthedocs.io/en/2.1.0/):

    from imapclient import IMAPClient
    server = IMAPClient('imap.mailserver.com', use_uid=True)
    server.login('someuser', 'somepassword')
    
    select_info = server.select_folder('INBOX')
    print('%d messages in INBOX' % select_info[b'EXISTS'])
    #34 messages in INBOX
    
    messages = server.search(['FROM', 'best-friend@domain.com'])
    print("%d messages from our best friend" % len(messages))
    #5 messages from our best friend
    
    for msgid, data in server.fetch(messages, ['ENVELOPE']).items():
        envelope = data[b'ENVELOPE']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多