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连接...")
username = "[email protected]" password = "xxxxxxx"
try:
print("正在连接到 imap.163.com:993...") server = IMAPClient("imap.163.com", ssl=True, port=993) print("连接成功!")
print(f"正在登录邮箱 {username}...") server.login(username, password) print("登录成功!")
print("发送客户端身份信息...") id_response = server.id_({"name": "IMAPClient", "version": "2.1.0", "vendor": "Mozilla", "contact": "[email protected]"}) print(f"ID命令响应: {id_response}")
print("选择收件箱...") messages_count = server.select_folder('INBOX') print(f"成功选择收件箱! 邮件数量: {messages_count[b'EXISTS']}")
print("\n获取最新10封邮件:") messages = server.search('ALL') if messages: count = min(10, len(messages)) 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 = '无主题' 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("收件箱中没有邮件")
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邮箱安全限制问题解决方法:
- 登录网易163邮箱网页版:https://mail.163.com
- 点击’设置’ -> ‘POP3/SMTP/IMAP’
- 确保IMAP服务已开启
- 重新生成授权码(不是登录密码)
- 更新脚本文件中的PASSWORD为新的授权码
:::