首页 > 解决方案 > 更改 APEX_MAIL 包

问题描述

My Oracle Database 目前无法处理与 Office 365 进行邮件通信所需的 TLS 1.2。所以我使用旧的邮件服务器来发送我的邮件,因为它不需要身份验证并且位于本地。对于内部通信,我需要更改所有“收件人”地址以更改域,以便将邮件发送到 Microsoft 而不是返回到内部邮件服务器。

示例:我需要将所有电子邮件从user@domain.com更改为user@domain.onmicrosoft.com。有没有办法可以更改 Oracle 中的 APEX_MAIL 包,以便在“TO”字段中对domain.com的任何使用都会自动更改为domain.onmicrosoft.com

标签: oracleoracle11goracle-apex

解决方案


通常,您不会更改专有软件包 - 即使可以,那也是错误的。相反,您将自己的 pl/sql 过程包装在 apex_mail 周围。创建一个与您正在使用的 apex_mail 过程具有相同签名的包,并在这些过程中调用 apex_mail。在调用 apex_mail 之前,做任何你需要的魔法(根据你的情况更改电子邮件地址)。唯一的缺点是你不能在“发送电子邮件”类型的进程中使用它——你必须使用 pl/sql。下面是一个过程示例:

  PROCEDURE send (
      mail_to_i         IN VARCHAR2,
      mail_from_i       IN VARCHAR2,
      mail_reply_to_i   IN VARCHAR2,
      mail_body_i       IN VARCHAR2,
      mail_body_html_i  IN VARCHAR2 DEFAULT NULL,
      mail_subject_i    IN VARCHAR2 DEFAULT NULL,
      mail_cc_i         IN VARCHAR2 DEFAULT NULL,
      mail_bcc_i        IN VARCHAR2 DEFAULT NULL
      )
  IS

    l_mail_to             VARCHAR2(4000)  := NULL;
    l_mail_cc             VARCHAR2(4000)  := NULL;
    l_mail_bcc            VARCHAR2(4000)  := NULL;
  BEGIN
    l_mail_to := REPLACE (LOWER(mail_to_i),'@domain.com','@domain.onmicrosoft.com');
     -- do other substitutions if needed
      apex_mail.send
      (
        p_to        => l_mail_to,
        p_from      => mail_from_i,
        p_cc        => mail_cc_i,
        p_subj      => mail_subject_i,
        p_body      => mail_body_i,
        p_body_html => mail_body_html_i,
        p_replyto   => mail_reply_to_i,
        p_bcc       => mail_bcc_i
      );
  END send;


推荐阅读