Oracle 11g使用UTL_MAIL发邮件报ORA-29278错误如何解决
问题根因
ORA-29278: SMTP transient error: 421 Service not available 报错的核心原因是UTL_MAIL无法连接到可用的SMTP服务:
- 最初执行时
SMTP_OUT_SERVER参数设为空,UTL_MAIL完全不知道要连哪个SMTP服务器,必然失败 - 后续改设为
localhost仍然失败,是因为客户端版Windows 10本身没有内置IIS SMTP Server组件——微软从Windows Vista开始就把SMTP服务从客户端版Windows里移除了,只有Windows Server系列的IIS才自带这个组件,你在Win10的IIS功能列表里找不到是正常情况,本地25端口根本没有SMTP服务在监听,连localhost自然会被拒绝。
解决步骤
- 第一步:正确配置SMTP_OUT_SERVER参数
ALTER SESSION设置的参数仅对当前SQL连接生效,全局生效需要用sys用户修改系统参数,参数值必须填写实际可连通的SMTP服务地址和端口,不能填空或者无服务的localhost:
注意如果SMTP服务使用非默认25端口(比如加密端口465、587),必须在地址后明确写端口号,UTL_MAIL默认只会连接25端口。-- 全局持久化配置,执行后重启数据库生效 ALTER SYSTEM SET SMTP_OUT_SERVER = 'smtp服务地址:服务端口' SCOPE=SPFILE; -- 当前会话临时测试可直接设置 ALTER SESSION SET SMTP_OUT_SERVER = 'smtp服务地址:服务端口'; - 第二步:准备可用的SMTP服务
两个可选方案,优先选第一个:- 直接使用企业内部SMTP或者公共邮箱的SMTP服务,不需要本地安装组件。使用前先做两个检查:
- 在Win10命令行执行
telnet smtp服务地址 端口,确认数据库所在机器能正常连通SMTP端口,不通就先排查防火墙、网络策略限制 - 确认SMTP服务的认证要求:如果是公共邮箱SMTP,需要提前在邮箱设置里开启SMTP发信权限,获取专用发信授权码
注意:原生UTL_MAIL不支持SSL/TLS加密连接,如果目标SMTP强制要求加密,直接调用UTL_MAIL会连接失败,这种情况要么换用支持明文连接的内部SMTP服务,要么在本地部署SMTP转发代理做加密转明文的适配
- 在Win10命令行执行
- 本地部署轻量第三方SMTP服务/转发工具(比如hMailServer),部署完成后将SMTP_OUT_SERVER设为本地服务的监听地址和端口,再在本地SMTP工具里配置上游发信规则即可。
- 直接使用企业内部SMTP或者公共邮箱的SMTP服务,不需要本地安装组件。使用前先做两个检查:
- 第三步:确认权限配置
SYS用户默认拥有UTL_MAIL的执行权限,如果后续要给其他业务用户开放发信能力,需要单独授权:GRANT EXECUTE ON SYS.UTL_MAIL TO 目标用户名; GRANT EXECUTE ON SYS.UTL_SMTP TO 目标用户名; GRANT EXECUTE ON SYS.UTL_TCP TO 目标用户名; - 第四步:发信测试
所有配置完成后重新执行发信块即可,注意sender参数填写的发信人地址必须和SMTP服务认证的发信账号一致,否则会被SMTP服务判定为伪造发件人拒收。
避坑提醒:不用在Win10的IIS启用关闭Windows功能列表里反复找SMTP组件,客户端版Windows从Vista开始就彻底移除了这个功能,不可能找到。
内容的提问来源于stack exchange,提问作者pmk
相关产品推荐
相关产品推荐

