zmail是一个用于收发邮件的python扩展包。github上有这个项目还有中文的简介。我打算用它写一个自动下载病分类班级邮箱里面的课件的东西,研究了一下这个项目。我感觉有些地方写的不太清楚,把遇到的问题和一些见解写在了最后。本人还是一个python渣渣,希望有了解的人解释一下,en...,不要嘲笑我。
以下是项目的地址和中文的说明书:
github地址
readme-cn.md
个人理解
- 对于
get_info()
方法,会获取所有邮件的头文件信息并写到一个字典里。这个头文件信息包括:Subject、From、To、Date等,但是注意一定是首字母大写的key,小写的不可以用。
get_info()
和get_mail
获取的邮件是两种不同的东西。get_mail
的key似乎都是小写。而get_info()
除了id似乎都是大写。
- 对于
get_attachment(mail,*args)
,会将文件保存到当前目录,如果后面的args为绝对路径的话,则会保存在那个路径,但是似乎无法判断附件的个数,args的参数个数无法把握,有没有好心人告诉我怎么办?我就直接没有用这个而是把它重写了一下。 - 对于
get_mails(subject= ,after=, before= ,sender=)
这个,我发现他也是调用的info这样的函数,所以似乎也无法通过这个获取'attachments',特别是,我使用的过程中,总是报一个KeyError
,发生在一个内部函数_match()
上,KeyError: 'subject'
。尝试了几次发现还是不行。用的163邮箱。 - 我发现通过
get_mail(id)
获取邮件是可以的,再通过get_latest()
方法获取邮箱最大的id值,然后通过这个获取date进行比较,再进行附件的下载。
代码还没写完,写完后更新。
隔了这么久终于写完了,好久不写东西了,感觉技术变生疏了,另外我也不会多线程什么的发现自己写的东西效率极差,以后好好学学这方面的东西。
import zmail
import time
from collections import Iterable
"""
这是一个邮件的附件下载器
"""
def save_attachment(mail):
"""这部分是重写了zmail的方法,是附件能保存在指定目录,再改改就可以分类保存了"""
if isinstance(mail['attachments'], Iterable):
for attachment in mail['attachments']:
info = attachment[0].split(';')
name = '/home/ccyx/Downloads/邮件/' + info[0]
body_type = info[1]
is_text_file = True if body_type.find('text/plain') > -1 else False
# Write file.
if not is_text_file:
# Binary file.
body = b''.join(attachment[1:])
with open(name, 'wb') as f:
f.write(body)
else:
# Text file.
body = tuple(map(lambda x: x.decode() + '\r\n', attachment[1:]))
with open(name, 'w') as f:
f.writelines(body)
def date_compare(date1, date2):
"""这是我所能想到的最好的方法,进行日期比较"""
pattern = '%a, %d %b %Y %H:%M:%S %z'
print(date2)
t1 = time.strptime(date1, pattern)
# 这里出了问题,调试了好久,原来是不同邮件日期格式不同,之所以strip是因为有的日期为个位数,最后会多一个空格
t2 = time.strptime(date2[:31].strip(), pattern)
if t1 > t2:
return 1
elif t1 < t2:
return -1
else:
return 0
server = zmail.server('邮箱', '密码')
mail = server.get_latest()
max_id = int(mail['id'])
date = 'Thu, 1 Mar 2018 12:00:00 +0800'
mail_id = max_id
while date_compare(date, mail['date']) == -1:
print('--------------------')
save_attachment(mail)
mail_id -= 1
mail = server.get_mail(mail_id)
print(mail['from'])
然而还是不太好,报了一个这样的错误:
poplib.error_proto: b'-ERR Unable to log on'
应该跟我的代码没有关系,所以也就没管了,反正我要的东西都下载好了,就先这样吧。
网友评论