Azure Databricks Notebook无法发送邮件问题排查求助
Azure Databricks Notebook邮件发送排查方案
针对你代码执行正常但收不到邮件的问题,从代码本身、邮件服务配置、Databricks环境三个维度逐一排查:
1. 收件人格式错误
你的send_to参数传入的是字符串("mohitgupta@gmail.com"),但COMMASPACE.join(send_to)会将字符串拆分为单个字符拼接,导致收件人格式完全失效(比如变成m,o,h,i,t,g,u,p,t,a,@,g,m,a,i,l,.,c,o,m)。
修复方法:
将send_to改为列表格式,或者在函数内部自动处理字符串转列表:
# 方法1:调用时传入列表 send_mail(send_to=["mohitgupta@gmail.com"], ...) # 方法2:函数内部兼容处理 def send_mail(..., send_to="mohitgupta@gmail.com", ...): # 新增:如果send_to是字符串,转为单元素列表 if isinstance(send_to, str): send_to = [send_to] msg['To'] = COMMASPACE.join(send_to)
2. Outlook账号认证问题
使用Outlook SMTP服务时,常见认证失败原因:
- 两步验证开启:如果账号开启了两步验证,必须使用应用密码代替普通密码登录,不能直接用账号原密码。
- 应用权限限制:微软默认限制非官方应用登录,需在Outlook账号设置中开启“允许第三方应用访问”(或采用现代认证方式)。
- 邮箱拼写错误:代码中发件人邮箱为
mohit@comapany.com(注意comapany少了一个n),如果实际邮箱是company.com,会直接导致认证失败。
3. Azure Databricks网络限制
Databricks集群默认可能阻止SMTP出站端口(587):
- 标准集群:检查集群网络配置,确认是否允许出站到
smtp-mail.outlook.com的587端口。 - VNet部署集群:需要在VNet的网络安全组(NSG)中添加出站规则,允许TCP 587端口到目标SMTP服务器。
4. 缺少错误捕获与调试日志
你的代码没有任何异常处理,即使SMTP连接、认证或发送过程中出错,也不会输出错误信息,导致无法定位问题。
添加错误捕获与调试示例:
def send_mail(...): try: # 原邮件构建代码 smtp = smtplib.SMTP(server, port) smtp.set_debuglevel(1) # 开启调试日志,查看SMTP交互细节 if use_tls: smtp.starttls() smtp.login(username, password) smtp.sendmail(send_from, send_to, msg.as_string()) smtp.quit() print("邮件发送成功") except smtplib.SMTPAuthenticationError: print("认证失败:检查账号密码或应用权限") except smtplib.SMTPConnectError: print("连接失败:检查SMTP服务器地址、端口或网络限制") except Exception as e: print(f"发送失败:{str(e)}")
开启set_debuglevel(1)会打印SMTP交互的详细日志,能直接定位到具体失败环节。
5. 附件路径验证
确认附件路径/dbfs/FileStore/MOhit_test/Sample_Spreadsheet_10_rows_1.csv真实存在且有权限访问:
在Notebook中执行以下代码验证:
dbutils.fs.ls("/FileStore/MOhit_test/") # Databricks中路径无需/dbfs前缀
如果文件不存在会抛出异常,若存在但权限不足也会导致读取失败。
内容的提问来源于stack exchange,提问作者Mohit GUpta
相关产品推荐
相关产品推荐

