Azure Databricks Python Notebook发邮件遇gaierror问题求助
问题:Azure Databricks中SMTP发送邮件失败(No address associated with hostname)
我尝试通过公司SMTP服务器从Azure Databricks Python Notebook发送邮件,本地机器运行脚本正常,但在Databricks执行时出现No address associated with hostname错误。
执行脚本
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText server = smtplib.SMTP("COMPANY SMTP SERVER", COMPANY_SMTP_PORT) fromaddr = "username@companyname.com" toaddr = "username@companyname.com" msg = MIMEMultipart() msg['From'] = fromaddr msg['To'] = toaddr msg['Subject'] = "Email test" body = "test mail" msg.attach(MIMEText(body, 'plain')) text = msg.as_string() server.sendmail(fromaddr, toaddr, text)
错误堆栈信息
gaierror Traceback (most recent call last) <command-2889814627634467> in <module> 3 from email.mime.text import MIMEText 4 ----> 5 server = smtplib.SMTP("COMPANY SMTP SERVER", COMPANY_SMTP_PORT) 6 fromaddr = "username@companyname.com" 7 toaddr = "username@companyname.com" /usr/lib/python3.8/smtplib.py in __init__(self, host, port, local_hostname, timeout, source_address) 253 254 if host: --> 255 (code, msg) = self.connect(host, port) 256 if code != 220: 257 self.close() /usr/lib/python3.8/smtplib.py in connect(self, host, port, source_address) 337 port = self.default_port 338 sys.audit("smtplib.connect", self, host, port) --> 339 self.sock = self._get_socket(host, port, self.timeout) 340 self.file = None
可能原因
- DNS解析失败:Databricks集群所在网络无法解析公司SMTP服务器的主机名。本地网络能正常解析,但Databricks的VNet/防火墙限制了DNS查询,或者SMTP服务器主机名仅在公司内网可解析,而Databricks集群未接入该内网。
- 网络连通性限制:Databricks集群的出站规则未允许访问SMTP服务器的端口;或者公司防火墙拒绝了Databricks集群的IP访问SMTP服务。
- 主机名格式问题:代码中填写的
"COMPANY SMTP SERVER"包含空格或格式错误,本地可能通过hosts文件做了映射,但Databricks集群没有对应的配置。
解决方法
- 验证DNS解析:在Databricks Notebook中执行
nslookup COMPANY_SMTP_SERVER或dig COMPANY_SMTP_SERVER(需先安装对应工具),确认是否能解析到SMTP服务器的IP。若无法解析,可将Databricks集群通过VNet peering接入公司内网,或直接使用SMTP服务器的IP地址替代主机名测试。 - 检查网络规则:
- 确认Databricks集群的出站安全组/网络ACL允许访问SMTP服务器的端口(常见为25、587或465)。
- 联系公司IT团队,将Databricks集群的公网IP或VNet范围加入SMTP服务器的访问白名单。
- 修正主机名配置:确保代码中的SMTP主机名无空格、格式正确;若本地依赖hosts映射,可通过Databricks集群初始化脚本添加对应的hosts条目。
- 补充认证步骤:多数公司SMTP服务器需要身份认证,本地可能默认使用Windows集成认证,但Databricks中需显式添加
server.starttls()和server.login(username, password)步骤(按需配置)。
内容的提问来源于stack exchange,提问作者give_it_a_bit
相关产品推荐
相关产品推荐

