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

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

最近在做邮件过滤,在写到邮件客户端的时候,有个问题就是算法检测出了垃圾邮件后,如何将邮件移动到用户邮件目录下的垃圾邮件箱?
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文件夹下,进入 \lib\site-packages\imap_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()

等等…

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/714020.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存