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

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

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


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,代码如下:


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()

:::tip{title=”提示”}

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

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

:::