在尝试使用IMAP协议连接网易163邮箱后尝试读取收件箱时服务器返回Unsafe Login. Please contact [email protected] for help报错
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邮箱安全限制问题解决方法:
本文作者:Kevin@灼华
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!