imaplib 错误地将“=”和“3D”字符添加到来自电子邮件的 url 文本

imaplib wrongly adding `=` and `3D` characters to url text from email

这里我使用 imapblibemail 根据特定条件(即发件人和主题)检索特定电子邮件。

import imaplib
import email

FROM_EMAIL  = "##########@gmail.com"
FROM_PWD    = "##########"
SMTP_SERVER = "imap.gmail.com"

mail = imaplib.IMAP4_SSL(SMTP_SERVER)
mail.login(FROM_EMAIL,FROM_PWD)
mail.select("INBOX")
result, data2 = mail.search(None,'(FROM "####" SUBJECT "####")')
ids = data2[0]
id_list = ids.split()
latest_email_id = id_list[-1]
result, email_data = mail.fetch(latest_email_id, "(RFC822)")

raw_email = email_data[0][1]
raw_email_string = raw_email.decode('utf-8')
email_message = email.message_from_string(raw_email_string)

在邮件中,我在桌面上使用gmail,有一个link是这样的(请注意,#字符代表敏感信息):

# This is how the link is supposed to appear
https://inreach.garmin.com/textmessage/txtmsg?extId=e3e7d4c2-fab4-43ad-93de-f9dedca8280#####=##########%40gmail.com

当 python 检索到电子邮件文本时打印它时,我觉得很糟糕 link:

email_text = list(email_message.walk())[1].get_payload()
print(email_text) # Note(I am not printing the whole email for privacy reasons)

# The link as python has retrieved it appears like this:

https://inreach.garmin.com/textmessage/txtmsg?extId=3De3e7d4c2-fab4-43ad-93=de-f9dedca8280#####=3D##########%40gmail.com

Python 以某种方式在 93de 之间添加了一个 = 字符,并且还添加了几个 3D 字符。

python在做什么?关于如何解决这个问题的想法?

您现在看到的是 quoted-printable encoding。这是一种将任意字节编码为 ASCII 文本以便通过例如传输的方式。电子邮件。这种编码的结果如下:

  • 您消息中的每个 '=' 字符都被编码为 '=3D'(因为 0x3d 是 '=' 的字符代码)。
  • 通过插入序列 '=\n'(基本上是解码器将去除的转义换行符),换行在 76 个字符处。我敢打赌这些换行符之一被插入到你的 link.
  • 中间

您可以使用 quopri module from the standard library. Some parts of Python's email handling library 将编码文本转换回原始字节。