email.message_from_string() 和 imaplib 添加 '<' '>'
Posted
技术标签:
【中文标题】email.message_from_string() 和 imaplib 添加 \'<\' \'>\'【英文标题】:email.message_from_string() and imaplib adding '<' '>'email.message_from_string() 和 imaplib 添加 '<' '>' 【发布时间】:2015-05-10 10:22:44 【问题描述】:好的,所以我使用 imaplib 从 gmail 加载电子邮件,然后当我尝试解析电子邮件时,它不会以可用格式分离任何内容。我怀疑这是因为进程中的某处“”被添加到原始电子邮件中。
这是我调用该方法后调试器向我显示的内容: 正如你所看到的,它并没有真正将任何东西解析成可用的格式。
这是我正在使用的代码:(注意:.replace('>', '')
似乎对最终结果没有影响。)
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('myEmail@gmail.com', 'password')
mail.list()
mail.select('inbox')
typ, data = mail.search(None, 'ALL')
ids = data[0]
id_list = ids.split()
# get the most recent email id
latest_email_id = int( id_list[-1] )
# iterate through 15 messages in descending order starting with latest_email_id
# the '-1' dictates reverse looping order
for i in range( latest_email_id -10, latest_email_id-15, -1 ):
typ, data = mail.fetch( str(i), '(RFC822)' )
for response_part in data:
if isinstance(response_part, tuple):
msg = str(response_part[1]).replace('<', '')
msg = msg.replace('>', '')
msg = email.message_from_string(msg)
#msg = feedparser.parse(response_part[1])
varSubject = msg['subject']
varFrom = msg['from']
python email.message_from_string() parse problems 和 Parsing email with Python 对我来说都有非常相似和相同的问题(我认为),他们通过更改电子邮件解决了这个问题,但是我直接从 Google 的服务器阅读我的电子邮件,所以我不确定由于删除所有 '' 显然是行不通的,如何对电子邮件进行修复。
那么,如何修复从 imaplib 读取的电子邮件,以便使用 email.message_from_string() 轻松读取它? (或任何其他改进/可能的解决方案,因为我不能 100% 确定 '' 实际上是问题所在,我只是根据提出的其他问题进行猜测。)
干杯
【问题讨论】:
【参考方案1】:您不应该解析<
、>
和它们之间的数据 - 这就像解析 html,但要复杂得多。有现有的解决方案可以做到这一点。
这是我的代码,可以读取带有附件的邮件,提取可用于进一步使用的数据并将其处理为人工和代码可读格式.如您所见,所有任务均由第三方模块完成。
from datetime import datetime
import imaplib
import email
import html2text
from os import path
class MailClient(object):
def __init__(self):
self.m = imaplib.IMAP4_SSL('your.server.com')
self.Login()
def Login(self):
result, data = self.m.login('login@domain.com', 'p@s$w0rd')
if result != 'OK':
raise Exception("Error connecting to mailbox: ".format(data))
def ReadLatest(self, delete = True):
result, data = self.m.select("inbox")
if result != 'OK':
raise Exception("Error reading inbox: ".format(data))
if data == ['0']:
return None
latest = data[0].split()[-1]
result, data = self.m.fetch(latest, "(RFC822)")
if result != 'OK':
raise Exception("Error reading email: ".format(data))
if delete:
self.m.store(latest, '+FLAGS', '\\Deleted')
message = email.message_from_string(data[0][1])
res =
'From' : email.utils.parseaddr(message['From'])[1],
'From name' : email.utils.parseaddr(message['From'])[0],
'Time' : datetime.fromtimestamp(email.utils.mktime_tz(email.utils.parsedate_tz(message['Date']))),
'To' : message['To'],
'Subject' : email.Header.decode_header(message["Subject"])[0][0],
'Text' : '',
'File' : None
for part in message.walk():
if part.get_content_maintype() == 'multipart':
continue
if part.get_content_maintype() == 'text':
# reading as HTML (not plain text)
_html = part.get_payload(decode = True)
res['Text'] = html2text.html2text(_html)
elif part.get_content_maintype() == 'application' and part.get_filename():
fname = path.join("your/folder", part.get_filename())
attachment = open(fname, 'wb')
attachment.write(part.get_payload(decode = True))
attachment.close()
if res['File']:
res['File'].append(fname)
else:
res['File'] = [fname]
return res
def __del__(self):
self.m.close()
【讨论】:
以上是关于email.message_from_string() 和 imaplib 添加 '<' '>'的主要内容,如果未能解决你的问题,请参考以下文章