栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

有关imap-tools模块实现邮件移动的问题

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

有关imap-tools模块实现邮件移动的问题

最近在做邮件过滤,在写到邮件客户端的时候,有个问题就是算法检测出了垃圾邮件后,如何将邮件移动到用户邮件目录下的垃圾邮件箱?
Emmm…具体的过滤之后再说吧
这次就说邮件的移动 用python实现的

本来选用的是poplib模块,后来发现pop只能读取收件箱,那用户目录下的发件箱、垃圾箱、回收站之类的都查看不了啊

直到我看到了一段说明——垃圾邮件到了客户端的“垃圾邮件”文件夹,使用POP3连接的客户端无法同步到,使用IMAP连接的客户端和WEB端可以看到垃圾邮件

所以就尝试了imaplib模块。

POP3和IMAP协议的区别
虽然这两个协议都是从邮件服务器那里下载邮件到本地的协议,但是不同的是IMAP提供跟邮件服务器的双向通信,也即在客户端所作的更改会反馈给服务器端,跟服务器端形成同步(例如删除邮件,创建文件夹等等的操作)。
而POP3是单向通信的,即下载邮件到本地就算了,所作的更改都只是在客户端,不会反映到服务器端。所以使用IMAP协议也会更便捷,体验更好,更可靠。

一般来说主流的qq、163邮箱都是要SSL协议认证的,有SSL则要开启在邮箱设置中开启对应服务且获取授权码
我是用我自己搭建的邮件服务器,所以就没有SSL,选用的登陆方式就是imaplib.IMAP4()
可进入imaplib IMAP4 查看更多信息,包括一些函数的默认参数都有说明

import imaplib

#以下二选一,一般来说主流的qq、163邮箱都是要SSL协议认证的
#没有SSL
mail = imaplib.IMAP4('你的域名')
mail.login("你的邮箱@你的域名", "密码")
#有SSL
mail = imaplib.IMAP4_SSL('你的域名')  #如qq就是imap.qq.com
mail.login("你的邮箱@你的域名", "SMTP/IMAP授权码")  
#记得在邮箱账户设置中开启对应服务


#查看邮件文件夹
for i in mail.list()[1]:
    print(i)

#比如我自己的,由输出结果可得,包含的文件夹有:
# 'Trash'   回收站邮件
# 'Spam'    垃圾邮件
# 'Sent'    已发送邮件
# 'Drafts'  草稿箱
# 'Archive' 存档
# 'INBOX'   收件箱


#查看了一下qq邮箱的,由输出结果可得,包含的文件夹有:
# 'INBOX'            收件箱
# 'Sent Messages'    已发送邮件
# 'Drafts'           草稿箱
# 'Deleted Messages' 已删除邮件
# 'Junk'             垃圾邮件

可以读取用户邮箱文件后,要如何实现邮件的删除、复制、移动这些呢?其实主要还是邮件的移动,因为我们都知道,在我们的邮箱里删除了一封邮件,这封邮件并不是真正删掉了,而是进入了邮箱的回收站/“已删除”,在服务器中它暂时还是存在的

使用imap-tools模块就可以做到
imap-tools模块是python的第三方扩展, 它使用标准库imaplib,并将常见的邮件处理事件封装

它的项目描述是这么说的

通过 IMAP 处理电子邮件:
基本操作:登陆、获取消息、uid
分析的电子邮件属性
电子邮件操作:复制、删除、标记、移动、追加
文件夹操作:列出、设置、获取、创建、存在、重命名、订阅、删除、状态
空闲命令:启动、轮询、停止、等待
失败操作的异常 ; 无外部依赖关系

有移动!
emmmm那我们就来用用它
先安装

$ pip install imap-tools

imap-tools官方文档及使用说明
imap-tools项目及示例代码

然后就用它登陆邮箱

from imap_tools import MailBox, AND

mailbox=MailBox('你的域名')
mailbox.login("你的邮箱@你的域名", "密码或SMTP/POP/IMAP授权码", initial_folder='INBOX')
#initial_folder默认就是INBOX,也可选其他文件夹

结果显示报错??

提示—>远程主机强迫关闭了一个现有的连接
应该就是登陆SSL认证的问题,就是我的邮件服务器是没有开启SSL的,用imaplib模块时用的是IMAP4,而不是IMAP4_SSL

由于imap-tools内部包含了标准imaplib模块,那么问题应该是出在imap-tools的配置文件中登陆使用的是IMAP4_SSL

解决办法:
找到本地python文件夹下,进入 libsite-packagesimap_tools目录,找到mailbox.py文件,查看MailBox类里面的**_get_mailbox_client()**函数,可以看到确实使用的是SSL连接登陆

不使用SSL的话就修改如下

三个要注意的地方:
【1】端口——>要改为port=143
【2】def _ init__()后面的keyfile=None, certfile=None, ssl_context=None
以及
self._keyfile = keyfile
self._certfile = certfile
self._ssl_context = ssl_context
都可以删了
【3】两个return
(1) return imaplib.IMAP4_SSL(self._host, self._port, self._keyfile, self._certfile, self._ssl_context)
改为
return imaplib.IMAP4(self._host, self._port)
(2)return imaplib.IMAP4_SSL(self._host, self._port, self._keyfile, self._certfile, self._ssl_context,self._timeout)
改为
return imaplib.IMAP4(self._host, self._port, self._timeout)

保存,运行原来的

from imap_tools import MailBox, AND

mailbox=MailBox('你的域名')
mailbox.login("你的邮箱@你的域名", "密码或SMTP/POP/IMAP授权码", initial_folder='INBOX')
#initial_folder默认就是INBOX,也可选其他文件夹

登陆成功!
后续就可以继续使用它来完成各种操作啦
比如查看收件箱邮件的uid

for msg in mailbox.fetch():  # generator: imap_tools.MailMessage
    print(msg.uid)   

邮件的移动

from imap_tools import MailBox, AND

mailbox=MailBox('你的域名')
mailbox.login("你的邮箱@你的域名", "密码/授权码", initial_folder='Trash')  
#Trash即垃圾箱

print(mailbox.uids())#查看Trash文件夹下的邮件uids
print(mailbox.uids()[0])#查看Trash文件夹下的第一封邮件的uid

# MOVE操作:将当前选择的邮件移动到指定文件夹中
# mailbox.uids()[0]即选择uids邮件列表中第一封邮件,并移动到INBOX收件箱中
mailbox.move(mailbox.uids()[0], 'INBOX')

# 关闭连接
mailbox.logout()

等等…

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/822335.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号