登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> SoftHub关联区 >> 主题: [imap]163的一些 imap 扩展     [回主站]     [分站链接]
[imap]163的一些 imap 扩展
clq
浏览(322) - 2022-10-06 21:15:39 发表 编辑

关键字:

[2022-10-06 21:49:04 最后更新]
[imap]163的一些 imap 扩展

https://www.cnblogs.com/zuimengaitianya/p/8579081.html

最近学习了一下IMAP命令,现在也算总结一下学习的东西,先说说IMAP命令,如果你使用的是163、126邮箱,反正是网易家的邮箱,那么这里就有很多坑要踩了,因为网易邮箱的特殊性,由于网易邮箱在中国占有很多市场,所以可以吐槽说网易使用了自己的垄断地位,强制推行了一些恶心的命令。

1、telnet imap.163.com 143

2、A01 LOGIN *****username@163.com youpassword

3、A02 select INBOX

当我们在执行这个select命令的时候,163邮箱会不会和普通邮箱一样给你选中INBOX(即收件箱)文件夹,而是返回A02 NO SELECT Unsafe Login. Please contact kefu@1888.com for help这样的返回结果,这个返回的意思是,这不是一个安全的连接,其实是网易没有遵循IMAP的规范,它强制要求你使用IMAP的ID命令,需要特色添加ID COMMAND

4、A03 ID ("name" "testname" "version" "1.1.0" "vendor" "abcd")

执行完这句后,我们就可以使用select命令了。希望这个坑对你有帮助。

clq  2022-10-06 21:49:04 发表 编辑


据说这来自 https://datatracker.ietf.org/doc/html/rfc2971

IMAP4 ID extension

----------------------------------------------------------------
https://www.modb.pro/db/247001

IMAP协议-从网易邮箱的骚操作到QQ邮箱的BUG
Dytttf的修炼手札
2021-11-13
251
前言

本文主要是记录一下在使用 IMAP 协议访问网易邮箱时遇到的一个很常见的问题以及之后我是如何解决并一步一步发现 QQ 邮箱 BUG 的过程。
发现问题

由于工作需要,开发的系统中需要访问用户设置的邮箱内的邮件列表。我们选用的方式是采用 IMAP 协议进行读取。简化后的代码如下:

import imaplib

client = imaplib.IMAP4_SSL(host="imap.163.com", port=993)
client.login("username", "password")
client.select()

一般邮箱都没有问题,但在访问网易邮箱时,select 命令返回的结果是:

# ('NO', [b'SELECT Unsafe Login. Please contact kefu@188.com for help'])

解决问题
原因分析

首先,百度一下很容易就知道答案,此处不赘述。可参考文章最后的引用链接。

简述一下就是:

网易邮箱服务器会检查 IMAP 客户端有没有发送 ID 命令来表明自己的身份,如果没有,则拒绝访问。

关于 ID 命令,ID 命令的设计初衷是为了让服务器可以统计不同客户端的使用情况,但并非强制的。

协议中明确表示,服务器不得以 ID 命令内的信息而对客户端拒绝提供服务。

详细内容可参见 RFC2971 的定义:https://datatracker.ietf.org/doc/html/rfc2971。
解决方案

原因知道之后,解决方案其实很简单,登陆之后再发送一个ID命令就好了。代码示例如下:

import imaplib
imaplib.Commands["ID"] = "NONAUTH"

client = imaplib.IMAP4_SSL(host="imap.163.com", port=993)
client.login("username", "password")
client._simple_command("ID",'("name" "test" "version" "0.0.1")')
client.select()

引申一下

解决方案很简单,但总感觉不够完美,少了点啥。

在实际应用中,用户会访问不同的邮箱的,那么就需要考虑以下两个问题:

是否有可能某些邮箱服务器不支持 ID 命令?

如果邮箱支持 ID 命令,但并不强制使用,会对其他正常功能有影响吗?

第一个问题,这个我觉得应该是有的,毕竟 ID 并非标准协议中的一部分,有可能某些邮箱服务器开发的比较早,并且无人维护了。所以针对这种情况是需要测试 IMAP 对于不认识的命令是如何处理的。

第二个问题,应该是不会有影响的,不过简单测试一下以求个安心。

于是,我先试了一下 QQ 邮箱。

先说第二个问题的测试结果,QQ 邮箱是没有啥影响的,这个也不重要,跳过就好。

但第一个问题有点出乎意料,测试方式很简单,分别向网易邮箱和 QQ 邮箱发送不支持的命令,看一下是否会影响接下来的使用即可。代码如下:

import imaplib

imaplib.Debug = 100
imaplib.Commands["XXX"] = "NONAUTH"

host = "imap.163.com"
# host = "imap.qq.com"

client = imaplib.IMAP4_SSL(host=host, port=993)
client._simple_command("XXX", '("name" "aaa")')
client.select()

其中网易邮箱在接收到未知命令时,返回结果是:

# b'PMGB1 BAD command not support'

日志如图

这个符合预期,直接捕获一下异常即可。

但 QQ 邮箱在接收到未知命令时,返回的结果是:

# b'* BAD Command!'

日志如图

且代码在这里直接卡住了,等待几分钟后:

ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接

QQ 邮箱服务器主动断开了跟我的链接。

WTF ! ! !

网易邮箱的抛出异常,我可以直接捕获跳过即可,对程序主流程无影响。但 QQ 邮箱卡在这里是啥意思???

为了搞清楚这个事情,又开始了对代码卡住的分析。

代码分析过程不赘述,各种断点调试一通,最终发现,代码卡在了等待邮箱服务器返回数据的部分。

但从调试日志中可以看到,QQ 邮箱服务器已经返回了数据:

# b'* BAD Command!'

为啥还要等呢?难道数据有问题?

然后又是一通搜多,在 IMAP RFC3501 定义得到了答案,其中 2.2.1 节定义了邮箱服务端的返回数据格式规范:

返回数据的第一部分应该是 tag、*、+ 其中之一。

tag 是客户端在发送命令时携带的一个唯一标识,主要用于客户端区分收到的响应是那个命令的响应
* 代表此命令的相应内容尚未完结,应继续等待后续响应
+ 代表服务端继续等待客户端发送尚未发送完的命令

因此,这里 QQ 邮箱返回的 b'* BAD Command!' 是不对的,应该是 b'tag BAD Command!'。

至此,感觉已经没有什么可做的事情了。

不过,我还是给 QQ 邮箱发了封邮件,简单描述了一下问题,也不知道他们改不改,等结果吧。。。

然后我的应用代码改成了:

import imaplib

client = imaplib.IMAP4_SSL(host="imap.163.com", port=993)
client.login("username", "password")
typ, dat = client.select()
if typ != "OK":
try:
client._simple_command("ID", '("name" "test" "version" "0.0.1")')
except Exception as e:
print(e)
typ, dat = client.select()
if typ != "OK":
raise Exception("邮箱登录失败: {} {}".format(typ, dat))

后记

待回复
不相关知识点整理

POP3 可以认为是只读的协议,客户端内的操作不会影响到服务端,只用来下载邮件

IMAP 是双向的协议,客户端的操作会反馈到服务端上,服务端也同步进行操作,不仅可以下载邮件,还可以删除,移动邮件,但不能发送邮件

SMTP 是用来发送邮件的

参考文档

IMAP4 ID 扩展:

   https://datatracker.ietf.org/doc/html/rfc2971

IMAP4:

  https://www.rfc-editor.org/rfc/inline-errata/rfc3501.html

第三方邮件客户端收取163邮件问题:

  https://www.cnblogs.com/chjbbs/p/9858672.html

IMAP 与 POP3 有什么不同?:

  http://help.163.com/10/0203/17/5UK7GVU100753VB9.html?servCode=6020251

什么是POP3、SMTP及IMAP?:

  https://help.mail.163.com/faqDetail.do?code=d7a5dc8471cd0c0e8b4b8f4f8e49998b374173cfe9171305fa1ce630d7f67ac21b87735d7227c217

imap连接提示Unsafe Login,被阻止的收信行为:

  https://help.mail.163.com/faqDetail.do?code=d7a5dc8471cd0c0e8b4b8f4f8e49998b374173cfe9171305fa1ce630d7f67ac211b1978002df8b23

Python解决的办法:

  https://blog.csdn.net/jony_online/article/details/108638571





总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1