imaplib 错误地将 `=` 和 `3D` 字符添加到电子邮件中的 URL 文本中

use*_*417 2 python email imaplib python-3.x

在这里,我使用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)
Run Code Online (Sandbox Code Playgroud)

在电子邮件中,在我的桌面上使用 gmail,有一个如下所示的链接(请注意,# 字符代表敏感信息):

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

当打印 python 检索到的电子邮件文本时,我得到了这个错误的链接:

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
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*d Z 5

您看到的是引用打印编码。它是将任意字节编码为 ASCII 文本以便通过电子邮件等传输的一种方法。这种编码的后果如下:

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

您可以使用标准库中的quopri模块将编码文本转换回原始字节。Python电子邮件处理库的某些部分也可以为您执行此操作。