本篇是记录自己遇到的问题,因为最近有读邮件的需求,所以现学zmail。本人喜欢边学边敲,然后写一个小小的demo测试。最终运行出现问题,哈哈哈,就喜欢遇到问题。说这话会不会欠揍,哈哈哈。好啦,接下来从入门开始吧。

zmail简介

zmail是python基于POP3协议的标准库poplib的三方库,它使得在 Python3中发送和接收邮件变得更简单。你不需要手动添加服务器地址、端口以及适合的协议,zmail 会帮你完成。此外,使用一个字典dictionary来代表邮件内容也更符合直觉。

读取邮件步骤

创建python文件,首先要命名。本人习惯以要学的知识为名字,这样便于记忆。可是,就是这样的一个习惯造成了错误,哈哈哈,我估计这个我能记一辈子。

首先安装zmail,仅支持python3,不支持python2:
pip install zmail 创建与服务器的连接:
server = zmail.server('邮箱', '授权码') 以接收指定id邮件为例:
mail = server.get_mail(id) 打印这封邮件的信息:
zamil.show(mail) 其中还有更多的操作,这里就不一一列举了,有喜欢学的小伙伴可以去GitHub。

出现问题

由于以zmail为文件名的文件写了很多知识点,所以我新创建了一个python文件,命名test。将上面简单的代码作为一个demo准备测试运行,结果报错,如下图所示。

python 邮件 标记 已读 未读 python读取邮箱邮件_服务器


翻译是属性错误:部分初始化的模块“zmail”没有属性“服务器”(很可能是由于循环导入)。遇到这个问题一时间很懵,不知道是哪里出现了问题。后来在GitHub上看到一个人说不要使用zmail来作为文件名,会导致引用的冲突。可是我这不是zmail命名的,但确实有一个文件是zmail命名。然后把命名改了一下,报错没有了。

遇到这个问题的感受就是很奇妙,以后不要轻易以库为名称了,避免不必要的报错。

下一个问题

解决了AttributeError: partially initialized module 'zmail' has no attribute 'server' (most likely due to a circular import)问题后,运行又出现了新的问题。程序员就是在一直一直解决bug,与bug共存亡,哈哈哈。来看一下第二个遇到的问题。poplib.error_proto: b'-ERR Unable to log on'翻译是poplib.error_proto:b’-ERR 无法登录’。咱也不知道它整个是什么意思,但是无法登录我还是理解了,就是说登录不了邮箱。然后去定位程序中创建与服务器连接的代码行,检查邮箱名和授权码,邮箱名是否正确是显而易见的,极有可能是授权码不对。接下来去拿授权码。

拿授权码

以163邮箱为例,开启网易邮箱客户端授权码的步骤网上都有教程,在此就不赘述了。主要想说的一个点是我是先关闭已开启的POP3/SMTP/IMAP服务,然后重启服务获得授权码。此方法可能有点笨拙,不知道小伙伴有没有其他好用的方法可推荐,欢迎评论区留言哦。

拿到授权码再次执行,又出现了问题,如下图所示。

python 邮件 标记 已读 未读 python读取邮箱邮件_python_02


初看这个报错,应该是登录成功了,但返回一串看不懂的字符串。现在要知道报错是什么意思,需要将其转换为汉字进行显示。

python 邮件 标记 已读 未读 python读取邮箱邮件_文件名_03


转为汉字的意思是“您没有权限使用pop3功能”。开启POP3功能即可。再次运行成功了,打印出了邮件信息,如下图所示。

python 邮件 标记 已读 未读 python读取邮箱邮件_python 邮件 标记 已读 未读_04


python 邮件 标记 已读 未读 python读取邮箱邮件_python 邮件 标记 已读 未读_05


默认打印邮件的信息及其顺序是[主题,id,发件人,收件人,日期,文本内容,HTML内容,附件]。有附件显示附件的名称和大小,无附件显示空列表。

其他邮箱的读取操作可以类似着参考。生活不易,继续加油!