zmail使用

zmail是一个用于收发邮件的python扩展包。github上有这个项目还有中文的简介。我打算用它写一个自动下载病分类班级邮箱里面的课件的东西,研究了一下这个项目。我感觉有些地方写的不太清楚,把遇到的问题和一些见解写在了最后。本人还是一个python渣渣,希望有了解的人解释一下,en...,不要嘲笑我。
以下是项目的地址和中文的说明书:
github地址
readme-cn.md

个人理解

  1. 对于get_info()方法,会获取所有邮件的头文件信息并写到一个字典里。这个头文件信息包括:Subject、From、To、Date等,但是注意一定是首字母大写的key,小写的不可以用。

get_info()get_mail获取的邮件是两种不同的东西。get_mail的key似乎都是小写。而get_info()除了id似乎都是大写。

  1. 对于get_attachment(mail,*args),会将文件保存到当前目录,如果后面的args为绝对路径的话,则会保存在那个路径,但是似乎无法判断附件的个数,args的参数个数无法把握,有没有好心人告诉我怎么办?我就直接没有用这个而是把它重写了一下。
  2. 对于get_mails(subject= ,after=, before= ,sender=)这个,我发现他也是调用的info这样的函数,所以似乎也无法通过这个获取'attachments',特别是,我使用的过程中,总是报一个KeyError,发生在一个内部函数_match()上,KeyError: 'subject'。尝试了几次发现还是不行。用的163邮箱。
  3. 我发现通过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'

应该跟我的代码没有关系,所以也就没管了,反正我要的东西都下载好了,就先这样吧。

你可能感兴趣的:(zmail使用)