You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:31:15