GCP Ubuntu虚拟机Python脚本通过SMTP发送邮件超时如何解决
GCP Ubuntu虚拟机Python SMTP连接超时问题解决
核心原因
- 代码参数错误:你定义了SMTP端口为587,但未将该参数传入
smtplib.SMTP()构造函数,smtplib默认使用25端口建立连接,GCP至今默认封禁所有25端口的出向流量,是触发超时的直接原因。同时代码重复实例化两次SMTP对象,属于冗余逻辑,可能额外触发GCP的端口拦截规则。 - 潜在环境限制:若修复代码后仍存在问题,可能是VPC防火墙未放通587端口出向规则、虚拟机本地iptables/ufw限制了Python进程的网络请求、GCP组织策略存在额外的邮件端口限制。
解决方案
- 优先修复代码错误,正确传入端口参数,删除冗余逻辑,参考修正代码如下:
import smtplib,ssl from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.utils import formatdate import time timestr = time.strftime('(%Y-%m-%d)') username = 'me@mydomain.de' password = 'secretpw' send_from = 'me@mydomain.de' send_to = 'recipient@herdomain.com' body = 'hello' smtp_host = 'smtp.ionos.de' smtp_port = 587 msg = MIMEMultipart() msg['From'] = send_from msg['To'] = send_to msg['Date'] = formatdate(localtime=True) msg['Subject'] = 'important email' msg.attach(MIMEText(body, 'plain')) # 使用上下文管理器自动管理连接,正确传入端口参数,设置超时避免长时间等待 with smtplib.SMTP(host=smtp_host, port=smtp_port, timeout=10) as smtp: smtp.ehlo() smtp.starttls() smtp.ehlo() # TLS握手完成后重新发送EHLO命令符合SMTP协议规范 smtp.login(username, password) smtp.sendmail(send_from, send_to.split(','), msg.as_string())
- 检查GCP VPC防火墙规则,确认出向规则允许TCP 587端口的所有请求,没有IP段、服务账号的额外限制。
- 验证虚拟机本地网络配置,执行
sudo ufw status检查防火墙规则,确认没有限制Python进程的对外连接,可临时关闭防火墙测试连接效果。 - 若使用企业级GCP账号,联系管理员确认项目所属的组织策略中,没有额外封禁SMTP相关端口的规则。
内容的提问来源于stack exchange,提问作者janko
相关产品推荐
相关产品推荐

