首页 > 解决方案 > Python SMTP 库无法处理 IPv6

问题描述

请问如何在 SMTP 库上添加 IPv6 选项?

当我尝试使用 IPv6 连接到 SMTP 时,出现此错误:

 smtpserver = smtplib.SMTP("smtp.gmail.com", 587, source_address=('2a00:xxxx:5::1e7', 80, 0, 0))

错误 :TypeError: AF_INET address must be a pair (host, port)

这意味着 smtplib.py 不支持 IPv6

我发现了一篇关于“https://bugs.python.org/issue3461”的文章。我试图将补丁添加到我的 smtplib.py 但它不起作用

谁能帮我做到这一点?

标签: pythonsocketsdebuggingsmtpipv6

解决方案


... source_address=('2a00:xxxx:5::1e7', 80, ...

错误消息具有误导性。在 Linux 上执行strace操作表明它实际上尝试绑定到给定的 IP 和端口但失败 - 然后发出这个误导性错误消息。失败的原因可能有多种,但典型的情况可能是没有对端口的出价权限(如这里所做的那样绑定到端口 80 需要 root 权限)或者该端口已被另一个套接字使用(端口 80 是通常用于网络服务器)。

一般来说,最好只指定 IP 地址并将端口保留为 0。这样它将使用给定的 IP 地址作为源 IP,但选择一个随机(临时)端口作为源端口。

我发现了一篇关于“https://bugs.python.org/issue3461”的文章

这是无关的。它仅与 SMTP 对话期间 EHLO 命令中显示的发件人有关。如果这是一个问题,只需给出与参数一起使用的值local_hostname


推荐阅读