如何修改Oracle APEX_MAIL包实现收件人邮箱域名自动替换适配Office365
方案1:封装自定义邮件发送包(最稳妥,无侵入)
不要直接修改Oracle原生的APEX_MAIL系统包,后续版本升级、补丁更新都会直接覆盖你的修改,还可能导致APEX核心功能异常。你可以自己封装一层自定义的邮件调用包,所有业务代码后续统一调用这个自定义包即可:
- 自定义包核心逻辑:在调用
APEX_MAIL.SEND前,先对收件人地址做字符串替换 - 示例代码片段:
CREATE OR REPLACE PACKAGE CUSTOM_APEX_MAIL AS FUNCTION replace_email_domain(p_email VARCHAR2) RETURN VARCHAR2; PROCEDURE SEND( p_to IN VARCHAR2, p_from IN VARCHAR2, p_subj IN VARCHAR2, p_body IN VARCHAR2, p_body_html IN VARCHAR2 DEFAULT NULL -- 其余参数和APEX_MAIL.SEND保持完全一致即可 ); END CUSTOM_APEX_MAIL; / CREATE OR REPLACE PACKAGE BODY CUSTOM_APEX_MAIL AS FUNCTION replace_email_domain(p_email VARCHAR2) RETURN VARCHAR2 IS BEGIN -- 支持多个收件人用逗号分隔的批量替换场景 RETURN REPLACE(p_email, '@domain.com', '@domain.onmicrosoft.com'); END replace_email_domain; PROCEDURE SEND( p_to IN VARCHAR2, p_from IN VARCHAR2, p_subj IN VARCHAR2, p_body IN VARCHAR2, p_body_html IN VARCHAR2 DEFAULT NULL ) IS BEGIN APEX_MAIL.SEND( p_to => replace_email_domain(p_to), p_from => p_from, p_subj => p_subj, p_body => p_body, p_body_html => p_body_html ); END SEND; END CUSTOM_APEX_MAIL; /
- 如果你已经有大量业务代码直接调用了
APEX_MAIL.SEND,可以用同义词做无缝切换:先把原生APEX_MAIL的同义词重命名,再创建同名同义词指向你写的CUSTOM_APEX_MAIL即可,业务代码不需要做任何修改。
方案2:修改APEX邮件队列表触发器(适配存量调用场景)
APEX的邮件发送逻辑是先把邮件写入APEX_XXXXX.APEX_MAIL_QUEUE表(XXXXX是你安装的APEX版本号,比如230100对应23.1版本),再由定时任务发送。你可以在这个表上创建一个前置触发器,在记录插入时自动替换TO字段的域名:
CREATE OR REPLACE TRIGGER TRG_APEX_MAIL_REPLACE_DOMAIN BEFORE INSERT ON APEX_230100.APEX_MAIL_QUEUE FOR EACH ROW BEGIN :NEW.MAIL_TO := REPLACE(:NEW.MAIL_TO, '@domain.com', '@domain.onmicrosoft.com'); -- 如果需要同时替换抄送、密送地址,取消下面两行注释即可 -- :NEW.MAIL_CC := REPLACE(:NEW.MAIL_CC, '@domain.com', '@domain.onmicrosoft.com'); -- :NEW.MAIL_BCC := REPLACE(:NEW.MAIL_BCC, '@domain.com', '@domain.onmicrosoft.com'); END; /
- 注意APEX版本升级后,表名的版本号前缀会变化,升级后需要重新创建触发器到新版本的队列表上。
内容的提问来源于stack exchange,提问作者Jordan Holmer
相关产品推荐
相关产品推荐

