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

Python双网口Fallback发邮件:为何单网口时选中接口超时?

问题排查与解决方案

1. 强制邮件客户端绑定到WiFi接口

多网口环境下,Python socket可能会自动选择路由优先级高的接口(即使该接口未激活),导致流量未按预期走WiFi。可以通过自定义SMTP类强制绑定WiFi接口的本地IP:

import socket
import smtplib

# 替换为你的WiFi接口本地IP
WIFI_LOCAL_IP = "192.168.1.100"

class BoundSMTP(smtplib.SMTP):
    def connect(self, host, port=smtplib.SMTP_PORT):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 绑定到WiFi接口IP
        self.sock.bind((WIFI_LOCAL_IP, 0))
        self.sock.connect((host, port))

# 使用自定义类发送邮件
with BoundSMTP("smtp.example.com", 587) as server:
    server.starttls()
    server.login("your_email@example.com", "your_auth_code")
    server.sendmail(
        "sender@example.com",
        "recipient@example.com",
        "Subject: 网口告警\n\n以太网接口已断开"
    )

2. 清理服务器路由表并调整接口优先级

即使以太网接口禁用,Windows路由表可能残留默认路由条目,导致流量误走无效链路:

  • 打开命令提示符,执行route print查看0.0.0.0开头的默认路由,确认网关为WiFi的网关地址
  • 若存在以太网网关的默认路由,执行route delete 0.0.0.0 mask 0.0.0.0 [以太网网关IP]删除
  • 在「网络连接-高级设置」中,将WiFi适配器移至以太网上方,提升其路由优先级

3. 验证并对齐库版本

测试PC与服务器的Twisted版本差异可能导致多网口适配问题:

  • 在两端分别执行pip show twisted查看版本号
  • 将服务器端Twisted版本对齐测试PC:pip install twisted==[测试PC版本号]
  • 注意:Windows平台上旧版Twisted对多网口的socket绑定逻辑存在兼容性问题,升级至稳定版可解决部分场景

4. 直接用socket测试网络连通性

排除邮件库的干扰,验证WiFi接口能否直接连接SMTP服务器:

import socket

WIFI_IP = "192.168.1.100"
SMTP_SERVER = "smtp.example.com"
SMTP_PORT = 587

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((WIFI_IP, 0))
try:
    s.connect((SMTP_SERVER, SMTP_PORT))
    print("连接SMTP服务器成功")
    s.send(b"EHLO test\r\n")
    print(s.recv(1024).decode())
except socket.error as e:
    print(f"连接失败: {e}")
finally:
    s.close()

若此测试仍超时,说明问题在网络层面(防火墙、网关配置);若成功,则是邮件客户端库的配置问题。

5. 检查Windows防火墙规则

服务器端防火墙可能阻止WiFi接口的出站SMTP流量:

  • 临时关闭防火墙测试是否能发送邮件
  • 若有效,添加出站规则:允许端口587/25的TCP流量,指定仅应用于WiFi接口

内容的提问来源于stack exchange,提问作者ImStuck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:27:22