使用Pyzmail模块以递归方式获取电子邮件正文

时间:2017-06-13 21:23:30

标签: python-3.x email imap

我正在尝试创建一个应用程序,需要递归检查新电子邮件的电子邮件地址,然后执行其他一些操作;但是,我在获取电子邮件正文时遇到了一些问题。我正在使用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

2 个答案:

答案 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