Oracle 19c 使用UTL_SMTP发邮件报ORA-29279 554错误如何解决
Oracle 19c 下UTL_SMTP发送邮件报ORA-29279 554错误的原因及解决方案
核心报错说明
ORA-20000: 邮件发送失败,触发错误:ORA-29279: 永久性SMTP错误: 554
常见原因
- Oracle 12c及以上版本默认启用*网络访问控制列表(ACL)*机制,11g中未配置ACL也能正常调用UTL_SMTP的代码,在19c中会被系统拦截,导致SMTP服务器返回554拒绝错误
- 19c对SMTP传输的加密要求更严格,大多数现代SMTP服务器默认拒绝未加密的25端口明文传输请求,11g中的明文传输代码在19c环境下不再被SMTP服务器接受
- 迁移后Oracle数据库所在服务器的公网IP未加入SMTP服务器的白名单,或者被SMTP服务商判定为可疑发件IP,触发554错误
- 19c的UTL_SMTP对入参校验更严格,原有代码中如果存在发件人格式不规范、认证参数传值错误的情况,11g可能兼容通过,19c会触发服务器端554错误
解决方案
步骤1:配置网络访问控制列表(ACL)
给执行发邮件代码的数据库用户授予SMTP服务器的访问权限,示例代码如下:
BEGIN -- 创建ACL规则 DBMS_NETWORK_ACL_ADMIN.CREATE_ACL( acl => 'utl_smtp_access.xml', description => 'Allow UTL_SMTP access to specified SMTP server', principal => 'YOUR_DB_USER', -- 替换为实际的数据库用户名 is_grant => TRUE, privilege => 'connect' ); -- 绑定ACL到指定SMTP服务器和端口 DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL( acl => 'utl_smtp_access.xml', host => 'smtp.example.com', -- 替换为实际的SMTP服务器地址 lower_port => 587, -- 替换为实际SMTP端口,加密端口一般为587/465 upper_port => 587 ); COMMIT; END; /
步骤2:修改UTL_SMTP代码添加TLS加密支持
19c中需要显式调用UTL_SMTP.STARTTLS方法开启加密传输,调整后的代码示例如下:
DECLARE v_smtp_conn UTL_SMTP.CONNECTION; BEGIN -- 建立SMTP连接 v_smtp_conn := UTL_SMTP.OPEN_CONNECTION(host => 'smtp.example.com', port => 587); UTL_SMTP.EHLO(v_smtp_conn, 'your-client-domain.com'); -- 开启TLS加密,11g版本的代码通常省略这一步 UTL_SMTP.STARTTLS(v_smtp_conn); -- 加密后再次发送EHLO指令 UTL_SMTP.EHLO(v_smtp_conn, 'your-client-domain.com'); -- SMTP认证 UTL_SMTP.AUTH(v_smtp_conn, 'your-smtp-username', 'your-smtp-password', 'LOGIN'); -- 后续发件人、收件人、邮件内容发送逻辑与原有代码一致 -- ... UTL_SMTP.QUIT(v_smtp_conn); END; /
步骤3:IP白名单与格式校验
- 联系SMTP服务提供商,确认数据库所在服务器的公网IP已加入发件白名单,无IP拦截规则
- 检查发件人、收件人地址格式,确保符合
username@domain.com的标准格式,无多余特殊字符或格式错误
步骤4:验证测试
调整完成后直接调用原有发邮件程序包,确认邮件可正常发送即可。
内容的提问来源于stack exchange,提问作者mona shiri
相关产品推荐
相关产品推荐

