Python sendmail发送含特殊字符邮箱报unhashable type:list错误如何解决
报错原因
- 核心问题是传入
server.sendmail()的收件人参数格式错误:该方法要求第二个收件人参数为仅包含字符串元素的一维列表,每个元素对应一个合法邮箱地址。但你代码中生成的emaillist是嵌套的二维列表,内部元素是列表对象,而列表属于不可哈希类型,SMTP模块内部处理地址时的哈希校验逻辑会直接抛出TypeError: unhashable type: 'list'。 - 具体代码逻辑错误点:
- 你定义的
recipients = ['myemail@domain.com,my-email@domain.com']本身是仅包含1个字符串元素的列表,两个邮箱被逗号拼接成了一整个字符串,没有拆分为独立元素。 - 后续列表推导式
[elem.strip().split(',') for elem in recipients]遍历这个单元素列表时,split(',')会返回拆分后的子列表,最终得到的emaillist实际值为[['myemail@domain.com', 'my-email@domain.com']],是多套了一层的嵌套结构,完全不符合参数要求。
- 你定义的
- 注意:邮箱前缀包含连字符
-是符合RFC标准的合法格式,你移除my-email@domain.com后代码可运行只是巧合,和邮箱地址本身的字符无关,原写法本身存在逻辑缺陷。
修复方案
根据使用场景选任意一种即可:
- 方案1:直接定义一维收件人列表,无需额外拆分,写法最简洁
subject = "Email" msg['From'] = 'me@company.com' # 每个邮箱作为独立的字符串元素存入列表,不要用逗号拼接在同一个字符串内 recipients = ['myemail@domain.com', 'my-email@domain.com'] msg.attach(message) server = smtplib.SMTP('00.0.0.00', 25) server.sendmail(msg['From'], recipients, msg.as_string()) server.quit() # 发送完成后主动关闭连接
- 方案2:如果需要从逗号拼接的邮箱字符串批量解析地址,拆分后直接得到一维列表即可,不要生成嵌套结构
subject = "Email" msg['From'] = 'me@company.com' # 逗号拼接的邮箱字符串 recipients_str = 'myemail@domain.com,my-email@domain.com' # 直接拆分字符串、去除每个地址前后的空白,得到合法的一维列表 emaillist = [addr.strip() for addr in recipients_str.split(',')] msg.attach(message) server = smtplib.SMTP('00.0.0.00', 25) server.sendmail(msg['From'], emaillist, msg.as_string()) server.quit()
内容的提问来源于stack exchange,提问作者thentangler
相关产品推荐
相关产品推荐

