我正在尝试创建一个应用程序,需要递归检查新电子邮件的电子邮件地址,然后执行其他一些操作;但是,我在获取电子邮件正文时遇到了一些问题。我正在使用pyzmail模块和imapclient,以及Automate the Boring Stuff作为指导(使用python 3.6)。这是我的代码:
mail = imapclient.IMAPClient('imap.gmail.com', ssl=True)
mail.login('email', 'password')
mail.select_folder('INBOX', readonly=False)
uid = mail.gmail_search('NC')
for i in uid:
message = mail.fetch(i, ['BODY[]'], 'FLAGS')
msg = pyzmail.PyzMessage.factory(message[i][b'BODY[]'])
msg.html_part.get_payload().decode(msg.text_part.charset)
但它不起作用。我基本上尝试过不同形式的代码,但无济于事,并没有那么多可以帮助我的例子。我有点像蟒蛇新手。有人可以帮忙吗? 谢谢,
修改
我意识到我犯了错误并修改了一些代码:
server = imapclient.IMAPClient('imap.gmail.com', ssl=True)
server.login('p.imagery.serv@gmail.com', 'rabbitrun88ve')
server.select_folder('INBOX', readonly=True)
uids = server.gmail_search('NC')
for i in uids:
messages = server.fetch(i, ['BODY[]'])
msg = pyzmail.PyzMessage.factory(messages[b'BODY[]'])
我遇到的问题是最后一行,我不知道如何使用迭代器创建的变量。它抛出了这条消息:
ValueError: input must be a string a bytes, a file or a Message
答案 0 :(得分:0)
我不确定您是否仍有这个问题,但对于那些将来可能遇到类似问题的人。 我注意到最后一行中有一点遗漏可能是罪魁祸首。
msg = pyzmail.PyzMessage.factory(messages[b'BODY[]'])
你省略了' i' for循环的变量
msg = pyzmail.PyzMessage.factory(messages[i][b'BODY[]'])
答案 1 :(得分:0)
接下来,我想获取搜索到的邮件的正文:
server = imapclient.IMAPClient('imap.gmail.com', ssl=True)
server.login('p.imagery.serv@gmail.com', 'rabbitrun88ve')
server.select_folder('INBOX', readonly=True)
uids = server.gmail_search('NC')
rawmessage = server.fetch(uids, ['BODY[]'])
for i in rawmessage:
msg = pyzmail.PyzMessage.factory(rawmessage[i][b'BODY[]'])
msg.html_part.get_payload().decode(msg.text_part.charset)
在这种情况下,您可以遍历获取的带有正文的电子邮件。我检查了类似的示例,但在服务器功能方面使用了text_part.get_payload()
而不是html
。