编辑
2025-04-04
技术相关
00
请注意,本文编写于 72 天前,最后修改于 72 天前,其中某些信息可能已经过时。

目录

Python脚本模拟第三方客户登录时,解决网易163邮箱报错:Unsafe Login.错误
解决方案

Python脚本模拟第三方客户登录时,解决网易163邮箱报错:Unsafe Login.错误

在尝试使用IMAP协议连接网易163邮箱后尝试读取收件箱时服务器返回Unsafe Login. Please contact [email protected] for help报错

image.png

bash
2025-04-04 13:47:33 - ERROR - 选择收件箱失败: NO, [b'SELECT Unsafe Login. Please contact [email protected] for help']

解决方案

经过邮件询问报错原因是发送请求时没有包含imap id,回复如下:

关于您反馈的客户端问题,经核实,关于您反馈的客户端添加网易邮箱帐号出现的收信问题,经反馈核实是第三方客户端没有带imap id被判断为不安全登录,系统为了用户安全自动阻止该类登录。

程序所使用的python imapcilent库来说,在login之后select文件夹之前使用文档中所述的id_方法向服务器发送ID命令客户端信息即可。

如下代码为一个完整的python测试脚本,使用账号和授权码模拟安全登录邮箱,并查看最新的10封邮箱。test_imap_163.py,代码如下:

python
from imapclient import IMAPClient import email from email.header import decode_header import time def test_netease_imap_connection():     """测试网易163邮箱IMAP连接"""     print("开始测试网易163邮箱IMAP连接...")     # 网易163邮箱配置     username = "[email protected]"     password = "xxxxxxx"  # 授权码     try:         # 1. 创建SSL连接 (端口993)         print("正在连接到 imap.163.com:993...")         server = IMAPClient("imap.163.com", ssl=True, port=993)         print("连接成功!")         # 2. 登录邮箱         print(f"正在登录邮箱 {username}...")         server.login(username, password)         print("登录成功!")         # 3. 发送ID命令 - 关键步骤:必须在login之后,select之前         print("发送客户端身份信息...")         id_response = server.id_({"name": "IMAPClient", "version": "2.1.0",                                  "vendor": "Mozilla", "contact": "[email protected]"})         print(f"ID命令响应: {id_response}")         # 4. 选择邮箱文件夹         print("选择收件箱...")         messages_count = server.select_folder('INBOX')         print(f"成功选择收件箱! 邮件数量: {messages_count[b'EXISTS']}")         # 5. 列出最近的邮件         print("\n获取最新10封邮件:")         messages = server.search('ALL')         if messages:             count = min(10, len(messages))                         # 获取最新的count封邮件             recent_messages = messages[-count:]             for i, msg_id in enumerate(recent_messages):                 try:                     # 只获取邮件头部                     fetched = server.fetch([msg_id], ['ENVELOPE'])                     envelope = fetched[msg_id][b'ENVELOPE']                     # 提取发件人和主题                     subject = envelope.subject                     if subject:                         if isinstance(subject, bytes):                             subject = subject.decode('utf-8', errors='replace')                     else:                         subject = '无主题'                     # 修复: 正确处理Address对象                     sender = '未知发件人'                     if envelope.from_ and len(envelope.from_) > 0:                         addr = envelope.from_[0]                                                 # 构建发件人信息                         email_parts = []                         if addr.mailbox:                             mailbox = addr.mailbox.decode('utf-8', errors='replace') if isinstance(addr.mailbox, bytes) else addr.mailbox                             email_parts.append(mailbox)                         if addr.host:                             host = addr.host.decode('utf-8', errors='replace') if isinstance(addr.host, bytes) else addr.host                             email_parts.append(host)                         if email_parts:                             if len(email_parts) == 2:                                 sender = f"{email_parts[0]}@{email_parts[1]}"                             else:                                 sender = email_parts[0]                     print(f"{i+1}. 发件人: {sender} | 主题: {subject}")                 except Exception as e:                     print(f"获取邮件 {msg_id} 失败: {str(e)}")         else:             print("收件箱中没有邮件")         # 6. 退出         server.logout()         print("\n测试完成: 成功连接并访问网易邮箱!")         return True     except Exception as e:         print(f"错误: {str(e)}")         print("\n提示: 请确保已安装imapclient库: pip install imapclient")         return False if __name__ == "__main__":     test_netease_imap_connection()

提示

网易163邮箱安全限制问题解决方法:

  1. 登录网易163邮箱网页版:https://mail.163.com
  2. 点击'设置' -> 'POP3/SMTP/IMAP'
  3. 确保IMAP服务已开启
  4. 重新生成授权码(不是登录密码)
  5. 更新脚本文件中的PASSWORD为新的授权码

本文作者:Kevin@灼华

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!