Python pyzmail:使用循环变量获取单个原始消息
首先,我应该说,我对计算机编程了解不多,但我发现Python非常容易用于自动化简单任务,这要感谢Al Sweigart的书《自动化无聊的东西》 我想收集电子邮件正文。我正试着把作业改成电子邮件以节省纸张。我想我可以通过获取看不见的邮件的数量并循环浏览这些邮件来做到这一点。如果我尝试这样做,IDLE3 shell就会变得没有响应,ctrl c什么也不做,我必须重新启动shell 问题:为什么我不能在server.fetch中使用循环变量Python pyzmail:使用循环变量获取单个原始消息,python,Python,首先,我应该说,我对计算机编程了解不多,但我发现Python非常容易用于自动化简单任务,这要感谢Al Sweigart的书《自动化无聊的东西》 我想收集电子邮件正文。我正试着把作业改成电子邮件以节省纸张。我想我可以通过获取看不见的邮件的数量并循环浏览这些邮件来做到这一点。如果我尝试这样做,IDLE3 shell就会变得没有响应,ctrl c什么也不做,我必须重新启动shell 问题:为什么我不能在server.fetch中使用循环变量 for msgNum in unseenMessages:
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是一个包含解析和所有客户机-服务器通信的多功能包。但这些包在标准库中被拆分为不同的包。基本上,它们都提供了几乎相同的功能和相同的方法。