在Python中转换字符串内的ASCII编码字符

在Python中转换字符串内的ASCII编码字符,python,json,email,ascii,Python,Json,Email,Ascii,我正在使用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 ema

我正在使用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代码中缺少一个错误编码字符串的选项

我得到一个示例字符串:

这是一条Mime格式的消息。如果您看到此情况,则邮件阅读器不支持此格式。\r\n\r\n-=\u 8e336d0902b13eaec4e7906847c21a6d\r\n内容类型:文本/普通;charset=UTF-8\r\n内容传输编码:引用可打印\r\n\r\n=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A JSON{到达:03.03.21,离开:07.03.21,电子邮件:test=\r\n=2Etest@gmail.com,单元:应用程序,ov=\r\nerride:0}JSON=0A=0A=0A\r\n-=\r\n 8e336d0902b13eaec4e7906847c21a6d\r\n内容类型:text/html;charset=UTF-8\r\n内容传输编码:引用可打印\r\n\r\n=0A=0A=0A=0A=0A=0A=0A=0A=0A JSON{到达:03.03.21,离开:07.03.21,电子邮件:test=\r\n=2Etest@gmail.com,公寓:app,ov=\r\n住宅:0}JSON

=0A=0A=0A\r\n-=\r\n 8e336d0902b13eaec4e7906847c21a6d-\r\n'


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

您的邮件中有提示相关编码,即:

内容传输编码:引用可打印

这解释了文本中的=s。您可以使用内置模块进行处理,方法如下:

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

b'test.test@gmail.com'
请注意,quopri.decodestring返回字节,因此您必须进行更正。如果必须有文本,则进行解码,如果使用utf-8,则将:

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

您正在处理RFC 2045第6.7节中名为quoted printable more details的编码方案

您至少有两种选择:

您可以使用Python模块quopri 您可以使用Python电子邮件模块email.parser的解析器解析电子邮件。 但是,如果您的目标是轻松获取电子邮件内容,那么使用模块imap_工具或IMAPClient会更容易

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

imap_工具:

IMAPClient:


正如@Rivers所说,您可以尝试使用imap_工具库。事实上,解析电子邮件不需要qoopri.decodestring-请参阅imap_tools message.py src。尊敬的imap_工具作者。
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()
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']