虽然APEX_MAIL.SEND功能没有给出任何错误

时间:2016-06-27 11:33:29

标签: plsql sendmail oracle-apex

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

我正在使用代码:

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

  7. 任何人都可以帮助我并给我一个富有成效的解决方案吗?我使用的是顶点5.0.2.00.07。

4 个答案:

答案 0 :(得分:1)

可以在the apex_mail api documentation中找到:

  

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

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

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

  4.   

您指定的实例设置正常。您的数据库具有ALC访问权限"什么都没有意义。你是说你有一个使用网络ACL的数据库? (11克或更高) 该文档链接到"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 数据库的任何主机   用户。未授予这些权限会导致以下问题:...

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

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

答案 1 :(得分:1)

在我们的案例中,这是一份工作ORACLE_APEX_MAIL_QUEUE,其状态为“RUNNING”8天。显然,它在队列或邮件进程上有某种锁定

我们杀了这份工作,就是这样。

(请参阅dba_scheduler_jobs了解作业和状态)

答案 2 :(得分:0)

我猜你应该按照他们的说法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;

答案 3 :(得分:0)

我有同样的问题。可以使用utl_smtp发送电子邮件,但不能使用apex_mail.send发送电子邮件。原来我的smtp服务器网址中有多余的空间。

用于APEX的电子邮件服务器已在APEX实例工作空间中设置。选中“管理实例”>“实例设置”>“电子邮件”>“ SMTP主机地址”

还尝试在实例工作区中检查“监视器活动”中的日志。