【问题标题】:APEX_MAIL.SEND function not working though its not giving any errorAPEX_MAIL.SEND 功能不工作,虽然它没有给出任何错误
【发布时间】:2016-10-29 09:42:47
【问题描述】:

必须使用APEX_MAIL.SEND() 方法从oracle apex 发送电子邮件。

我正在使用代码:

BEGIN

 apex_mail.send(p_to   => 'tanmoydawn@gmail.com'/*l_to_addr*/,        
                 p_from => 'tanmoydawn@gmail.com'/*l_from_addr*/,
                 p_bcc  => l_bcc_addr,
                 p_subj => l_mail_sub,
                 p_body => 'Service Request ' || :mail_body ||
'Note:- This is a system generated Email. Please DO NOT REPLY to it.');

apex_mail.push_queue;  

EXCEPTION

  when others then    
       INSERT INTO send_mail_error_test VALUES ('Send_mail',systimestamp,:service_request_id||'-err:'||seq_service_req_error_id.NEXTVAL);  

COMMIT;  

END;

***所有变量都包含正确的值

  1. 使用数据库并且该数据库具有 ACL(访问控制列表)访问权限

  2. 在 apex 管理服务中,将电子邮件的实例设置配置为主机名、端口、启用电子邮件配置。

  3. UTL_SMTP 包已安装

  4. 在同一进程中,在同一控制流点,使用 utl_Smtp 发送邮件的代码工作正常,但 apex_mail.send() 不起作用。

  5. apex_mail.send() 没有给出任何错误或异常,但我没有收到它的电子邮件。

  6. 有一个困惑,有一些类似的解决方案,'APEX_040200'应该已经添加到ACL。但是我正在使用并在其上实现代码的数据库,比如“apex_user”已经添加到ACL。即使现在我还必须将“APEX_040200”或“APEX_050200”添加到ACL

谁能帮助我并给我一个富有成效的解决方案?我正在使用顶点 5.0.2.00.07。

【问题讨论】:

  • 如果您使用的是apex 5。有一个内置的过程可以自动发送邮件。您只需填写参数。您尝试过吗?

标签: plsql sendmail oracle-apex


【解决方案1】:

可以在the apex_mail api documentation中找到:

在您可以从 Application Builder 应用程序发送电子邮件之前,您 必须:

  1. 登录到 Oracle Application Express 管理服务并 在实例设置页面上配置电子邮件设置。看 Oracle Application Express 管理指南中的“配置电子邮件”。

  2. 如果您正在使用 Oracle Database 11g 运行 Oracle Application Express 版本 1 (11.1),您必须启用出站邮件。在 Oracle 数据库中 11g 版本 1 (11.1),与网络服务交互的能力是 默认禁用。请参阅“在 Oracle 数据库中启用网络服务 11g”在 Oracle Application Express Application Builder 用户指南中。

您指定的实例设置没问题。您的“数据库具有 ALC 访问权限”没有任何意义。你的意思是你有一个使用网络 ACL 的数据库? (11g 或更高) 同样的文档链接到"the Enabling Network Services in Oracle Database 11g or Later" documentation

本文档不会让您猜测:

默认情况下,与网络服务交互的能力被禁用 在 Oracle Database 11g 第 1 版或第 2 版或更高版本中。因此,如果你是 使用 Oracle Database 11g 第 1 版运行 Oracle Application Express 或 2 或更高版本,您必须使用新的 DBMS_NETWORK_ACL_ADMIN 包来 向 APEX_050000 数据库的任何主机授予连接权限 用户。未能授予这些权限会导致以下问题:...

如果您有旧版本的 apex,例如 4.2,则要授予的用户是另一个用户,可以在文档中找到。或者,你可以找出 例如通过查询ALL_USERS 视图并找到APEX_###### 用户,选择版本号最高的用户:

select *
from all_users
where username like 'APEX%'
order by username;

【讨论】:

  • 谢谢汤姆..你的建议对我帮助很大。现在问题解决了。非常感谢..
【解决方案2】:

在我们的例子中,它是一个作业,ORACLE_APEX_MAIL_QUEUE,状态为“RUNNING”8 天。显然,它在队列或邮件进程上持有某种锁

我们终止了工作,仅此而已。

(有关作业和状态,请参阅 dba_scheduler_jobs)

【讨论】:

    【解决方案3】:

    我猜你应该按照他们所说的 here 做,但是使用正确的 APEX 版本,正如你猜到的那样......尝试各种,使用 APEX_050000(而不是 APEX_050200,这意味着 APEX 5.2 - 尚未发布):

    DECLARE
      ACL_PATH VARCHAR2(4000);
    BEGIN
        -- Look for the ACL currently assigned to '*' and give APEX_050000
        -- the "connect" privilege if APEX_050000
        -- does not have the privilege yet.
      SELECT ACL INTO ACL_PATH FROM DBA_NETWORK_ACLS
        WHERE HOST = '*' AND LOWER_PORT IS NULL AND UPPER_PORT IS NULL;
      IF DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE (ACL_PATH,'APEX_050000','connect') IS NULL THEN
        DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL_PATH,'APEX_050000', TRUE, 'connect');
      END IF;
      EXCEPTION
        -- When no ACL has been assigned to '*'.
      WHEN NO_DATA_FOUND THEN
        DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('power_users.xml',
        'ACL that lets power users to connect to everywhere',
        'APEX_050000', TRUE, 'connect');
      DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('power_users.xml','*');
    END;
    /
    COMMIT;
    

    【讨论】:

    • APEX_050200 意味着 Apex 5.2 - 但距离该版本发布还需要很长时间 - 5.1 版现在才在 EA 中。
    • 感谢@JeffreyKemp,我进行了编辑以匹配当前版本的 OP。
    【解决方案4】:

    我遇到了同样的问题。可以使用 utl_smtp 发送电子邮件,但不能使用 apex_mail.send。原来我在 smtp 服务器 url 中有一个额外的空间。

    APEX 的电子邮件服务器已在 APEX 实例工作区中设置。检查“管理实例”>“实例设置”>“电子邮件”>“SMTP 主机地址”

    还可以尝试检查实例工作区中“监控活动”中的日志。

    【讨论】:

      猜你喜欢
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多