Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyzmail:使用循环变量获取单个原始消息_Python - Fatal编程技术网

Python pyzmail:使用循环变量获取单个原始消息

Python pyzmail:使用循环变量获取单个原始消息,python,Python,首先,我应该说,我对计算机编程了解不多,但我发现Python非常容易用于自动化简单任务,这要感谢Al Sweigart的书《自动化无聊的东西》 我想收集电子邮件正文。我正试着把作业改成电子邮件以节省纸张。我想我可以通过获取看不见的邮件的数量并循环浏览这些邮件来做到这一点。如果我尝试这样做,IDLE3 shell就会变得没有响应,ctrl c什么也不做,我必须重新启动shell 问题:为什么我不能在server.fetch中使用循环变量 for msgNum in unseenMessages:

首先,我应该说,我对计算机编程了解不多,但我发现Python非常容易用于自动化简单任务,这要感谢Al Sweigart的书《自动化无聊的东西》

我想收集电子邮件正文。我正试着把作业改成电子邮件以节省纸张。我想我可以通过获取看不见的邮件的数量并循环浏览这些邮件来做到这一点。如果我尝试这样做,IDLE3 shell就会变得没有响应,ctrl c什么也不做,我必须重新启动shell

问题:为什么我不能在server.fetch中使用循环变量

for msgNum in unseenMessages:
    rawMessage = server.fetch([msgNum], ['BODY[]', 'FLAGS'])
看起来你需要一个实际的数字,比如57,而不是msgNum,否则就不行了

在看了这里的各种问题和答案之后,下面的内容对我很有用。我想它一下子收集了所有的邮件正文

import pyzmail
import pprint
from imapclient import IMAPClient

server = IMAPClient('imap.qq.com', use_uid=True, ssl=True)
server.login('myEmail@foxmail.com', 'myIMAPpassword')
select_info = server.select_folder('Inbox')
unseenMessages = server.search(['UNSEEN'])
rawMessage = server.fetch(unseenMessages, ['BODY[]', 'FLAGS']) 
for msgNum in unseenMessages:
    message = pyzmail.PyzMessage.factory(rawMessage[msgNum][b'BODY[]'])
    text = message.text_part.get_payload().decode(message.text_part.charset)
    print('Text' + str(msgNum) + ' = ')
    print(text)
我发现这是一个很好的和干净的代码和一个有很多帮助的例子

imaplib的API和pyzmail的主要区别在于pyzmail是具有解析和所有客户机-服务器通信的一体式软件包。但这些包在标准库中被拆分为不同的包。基本上,它们都提供了几乎相同的功能和相同的方法

另外一个重要的注意事项是,pyzmail看起来相当废弃

为了从该要点中保存一段有用的代码,我将其复制到这里,只做了一些非常小的修改,例如提取主函数注释,这是针对Python 3的:

!/usr/bin/env python 使用Python3和IMAP在电子邮件中进行迭代的非常基本的示例 gmail文件夹/标签。此代码将发布到公共域中。 此脚本是此博客文章中的示例代码: http://www.voidynullness.net/blog/2013/07/25/gmail-email-with-python-via-imap/ 这是原始版本的更新版本,修改后可用于Python 3.4。 导入系统 导入imaplib 导入getpass 导入电子邮件 导入电子邮件.header 导入日期时间 电子邮件帐户=notatallawhistleblowerIswear@gmail.com 使用“收件箱”阅读收件箱。请注意,无论指定哪个文件夹, 成功运行此脚本后,该文件夹中的所有电子邮件 将被标记为已读。 EMAIL_FOLDER=绝密/PRISM文档 def过程_邮箱M: 对文件夹中的电子邮件进行处理。 在本例中,请打印一些标题。 rv,数据=M.searchNone,全部 如果rv!='好的: 打印未找到任何消息! 回来 对于数据[0]中的num。拆分: rv,data=M.fetchnum,'RFC822' 如果rv!='好的: 获取消息时发生printERROR,num 回来 msg=email.message\u from\u bytesdata[0][1] hdr=email.header.make_headeremail.header.decode_headermsg['Subject'] 主题=strhdr 打印消息%s:%s'%num,主题 打印“原始日期:”,消息[“日期”] 现在转换为本地日期时间 date\u tuple=email.utils.parsedate\u tzmsg['date'] 如果日期\元组: local_date=datetime.datetime.fromtimestamp email.utils.mktime\u tzdate\u元组 打印本地日期:\ 本地\u日期。标准时间%a,%d%b%Y%H:%M:%S def主主机、登录名、文件夹: 使用imaplib.IMAP4\u SSLhost作为M: rv,数据=M.loginlogin,getpass.getpass printrv,数据 rv,邮箱=M.list 如果rv=='OK': 打印邮箱: 打印邮箱 rv,data=M.selectfolder 如果rv=='OK': 打印处理邮箱…\n 处理邮件箱 其他: 打印错误:无法打开邮箱,rv 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 尝试: 主'imap.gmail.com',电子邮件帐户,电子邮件文件夹 除imaplib.IMAP4.e错误外: 打印“处理邮箱时出错:”,e sys.exit1
pyzmail似乎已经过时,不再维护。无论如何,标准模块的最新版本在Python中运行得相当好。你能试着试试吗?我试过用IMAPLIB,但是PyZmail似乎更复杂。我不是一个真正的电脑爱好者。你能帮我修改我的代码以使用imaplib吗?当然,我稍后会为你编写代码。我发现这是一个很好的、干净的代码,还有很多帮助示例。imaplib和pyzmail之间的主要区别是pyzmail是一个包含解析和所有客户机-服务器通信的多功能包。但这些包在标准库中被拆分为不同的包。基本上,它们都提供了几乎相同的功能和相同的方法。