AWS Lambda无法连接外部SMTP 报错Errno 97地址族不被协议支持
问题根因
该错误[Errno 97] Address family not supported by protocol是Python的socket库尝试使用当前网络不支持的地址族建立连接导致的,对应场景具体原因如下:
- 你所使用的SMTP服务器域名解析同时返回IPv4和IPv6地址,Python
smtplib默认优先尝试IPv6连接 - 你Lambda接入的VPC未开启IPv6支持,没有对应的IPv6路由、出口配置,IPv6连接请求被直接阻断,尝试超时后抛出该错误
- 本地环境可以正常运行是因为你的本地网络支持IPv6,或本地DNS解析优先级为IPv4优先,不会触发连接失败问题
解决方案
方案1:强制SMTP使用IPv4连接(推荐,无需修改云资源配置)
修改代码,手动创建IPv4的socket再传入SMTP实例,避免默认优先走IPv6,参考代码如下:
import smtplib import socket # 原有配置 SERVER = "你的smtp服务器地址" PORT = 25 # 替换为你的SMTP端口,比如465、587 USER = "你的账号" PASSWORD = "你的密码" def send_email(): # 手动创建IPv4 socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(10) # 可自行设置超时时间,避免长时间阻塞 sock.connect((SERVER, PORT)) # 将已连接的socket传入SMTP mserver = smtplib.SMTP() mserver.connect(sock=sock) # 后续逻辑和原有一致:登录、发送邮件、退出 mserver.login(USER, PASSWORD) # ... 邮件内容构造逻辑 mserver.sendmail(from_addr, to_addrs, msg.as_string()) mserver.quit()
如果是用SMTP_SSL的加密连接,调整初始化逻辑即可:
mserver = smtplib.SMTP_SSL() mserver.connect(sock=sock)
方案2:为VPC配置IPv6支持
如果需要保留IPv6连接能力,可调整AWS VPC配置:
- 为Lambda所在的子网分配IPv6 CIDR段
- 配置对应IPv6出口:公网访问场景绑定互联网网关(Internet Gateway),仅出网场景可配置仅出口互联网网关(Egress-only Internet Gateway)
- 更新子网路由表,添加IPv6(::/0)的路由规则指向上述网关
- 调整Lambda关联的安全组、VPC网络ACL,允许IPv6协议下SMTP端口的出站流量
配套检查项
- 如果SMTP服务器是公网地址,确认Lambda所在的私网子网配置了IPv4 NAT网关,确保IPv4公网访问能力
- 合理设置Lambda函数的超时时间,避免连接阻塞时资源空耗
内容的提问来源于stack exchange,提问作者user12532474
相关产品推荐
相关产品推荐

