imaplib 错误地将“=”和“3D”字符添加到来自电子邮件的 url 文本
imaplib wrongly adding `=` and `3D` characters to url text from email
这里我使用 imapblib
和 email
根据特定条件(即发件人和主题)检索特定电子邮件。
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 以某种方式在 93
和 de
之间添加了一个 =
字符,并且还添加了几个 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 将编码文本转换回原始字节。
这里我使用 imapblib
和 email
根据特定条件(即发件人和主题)检索特定电子邮件。
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 以某种方式在 93
和 de
之间添加了一个 =
字符,并且还添加了几个 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 将编码文本转换回原始字节。