运行Python imaplib邮箱连接代码报getaddrinfo()参数类型错误
错误触发原因
报错核心是传入IMAP连接方法的服务器地址参数类型不符合要求,具体代码问题点如下:
- 读取服务器地址时调用
readlines()方法,该方法返回值是列表(哪怕文件仅存一行地址,返回的也是带换行符的单元素列表),而getaddrinfo()需要字符串格式的主机名参数,传入列表直接触发类型报错。 - 打开
serverimap.txt时传入字节类型文件名b'serverimap.txt',属于不规范写法,存在跨平台兼容风险。 - 所有文件读取操作都没有做首尾空白、换行符清理:
readline()读取出的内容默认带尾部换行符\n,不管是账号密码还是服务器地址带多余字符,都会导致连接、登录失败。 mail.select()方法单次仅支持指定一个邮箱文件夹,原代码同时传入"INBOX"和"Junk"两个参数,即使连接成功也会触发参数错误。
修复后代码
import imaplib import email # 读取账号密码 with open('Accounts.txt', 'r', encoding='utf-8') as f: # 原代码[1:]是跳过行首第一个字符,若你的账号行无前置多余字符请删除该切片 data = f.readline().strip() # maxsplit=1避免密码本身包含冒号时被错误拆分 user, password = data.split(':', 1) # 读取IMAP服务器地址 with open('serverimap.txt', 'r', encoding='utf-8') as f: imap_server = f.readline().strip() # 建立SSL连接 mail = imaplib.IMAP4_SSL(imap_server, 993) mail.login(user.strip(), password.strip()) print("logged in successfully") # 单次仅能选择一个文件夹,需操作垃圾邮件则替换参数为"Junk" mail.select("INBOX")
注意事项
- 若
Accounts.txt中存储的账号行没有前置特殊字符,必须删除原代码里的[1:]切片,否则会丢失账号首字符导致登录失败。 - 读取文本文件建议显式指定文件编码,避免不同操作系统默认编码差异引发乱码问题。
- 若需要同时操作多个文件夹,需要在完成第一个文件夹的操作后调用
mail.close(),再重新调用select()切换目标文件夹。
内容的提问来源于stack exchange,提问作者ربح مضمون
相关产品推荐
相关产品推荐

