Python 自动化控制收发邮件——Imbox库

使用imbox(收邮件)、yagmail(发邮件)、schedule(定时任务管理)三个库来实现

imbox的语法

with Imbox('imap.qq.com', 邮箱地址, 授权码, ssl=True) as imbox:

授权码就是邮箱的一个公第三方工具使用的授权码,有了这个授权码,在使用Python控制的时候就不需要使用,密码来登陆了。具体详见如何获取邮箱的授权码。

在上面我们已经获得一个imbox对象,我们来介绍一下它的属性和方法

all_imbox_msg = imbox.messages(unread=True)

我们可以通过messages方法来得到关于邮箱中的邮件的列表,其中我们可以通过对邮箱的状态来获取指定的邮件信息

  • unread=True 表示只列出未读信息
  • flagged=True 表示获取红旗邮件
  • [email protected] 表示只获取某个邮件地址的信息

我们还可以通过邮件的时间来进行过滤,同样的,在messages方法内。

  • 获取某一天前:date__lt
  • 获取某一天后:date__gt
  • 获取指定某一天:date__on

这些通过时间来获取的需要使用datetime.date(年,月,日),这里需要注意,我们需要引用 import datetime 才可以使用datetime对象的date方法

all_imbox_msg = imbox.messages(date__on=datetime.date(2022, 3, 2), unread=False)

其他的获取某一天前,获取某一天后,获取指定某一天也同理。由于all_imbox_msg是一个列表所以我们需要使用for循环为他遍历。

for uid, msg in all_imbox_msg:
    msg.subject # 邮箱的主题
    msg.body # 邮箱的正文部分,邮箱的正文是一个字典类型所以需要索引的方式使用
    msg.body['html'] # 获取邮件的正文部分,这通常是html格式的
    msg.body['plain'] # 获取邮件的正文部分,这通常是文本格式内容
    msg.sent_from  # 发件人
    msg.sent_to #收件人
    msg.date #时间
    msg.body['html'] # HTML格式内容附件
    msg.attachments # 邮件中的附件,这需要特殊的方式来下载
  • uid: 每一个邮件对应的编号
  • msg:邮箱内容的对象
我们到此还有一个问题:如果我们告诉Python解释器“嘿,伙计!我只需要未读邮件” 此时,我们已经处理了一个未读邮件了,但是这由于是程序控制的,我们无法将它变为已读,python解释器会在下次运行的时候重新处理这个 “未读邮件”

 将一个邮件标记为已读

msg.mark_seen(uid)

看见了吗?这需要一个uid作为参数,这标志着你将哪一个邮件标识为已读。同样的我们可以也可以将这个邮件删除,这意味我们不需要它了或者我们已经处理过它了。

删除一个邮件

msg.delete(uid)

现在我们将我们所知道的连贯起来,这就是我们的全部代码

from imbox import Imbox

with Imbox('imap.qq.com', 邮箱地址, 授权码, ssl=True) as imbox:
    all_imbox_msg = imbox.messages(unread=True)
    for uid, msg in all_imbox_msg:
        msg.subject # 邮箱的主题
        msg.body # 邮箱的正文部分,邮箱的正文是一个字典类型所以需要索引的方式使用
        msg.body['html'] # 获取邮件的正文部分,这通常是html格式的
        msg.body['plain'] # 获取邮件的正文部分,这通常是文本格式内容
        msg.sent_from  # 发件人
        msg.sent_to #收件人
        msg.date #时间
        msg.body['html'] # HTML格式内容附件
        msg.attachments # 邮件中的附件,这需要特殊的方式来下载

        msg.mark_seen(uid)  # 标为已读,英文意思其实是,标记为已经看过啦
        msg.delete(uid)  # 标志为删除

哦对!不好意思伙计,还有一个没有说明!msg.attachments 附件如何下载,我指的需要特殊的方式下载指的是不像我们传统的方法通过 file.write(file.content) 就可以了。如下所示

for attachment in msg.attachments:
     with open(file_name, 'wb') as f: # 获取附件文件名称作为文件名
        f.write(attachment['content'].getvalue())        
        f.close()

瞧见不一样了吗?它需要使用对象名['content'].getvalue()方法来写入到相应的文件,因为是网页中的文件所以使用的是 wb 写入形式

最后,感谢你选择Kauom,在接下来的其他文章里我将陆续发出关于yagmail(发邮件)、schedule(定时任务管理)的相关知识,期待你的关注!

你可能感兴趣的:(Python自动邮件收发,python,自动化,开发语言)