想知道如何在标准并发程序完成时发送电子邮件,给出警告或错误

问题描述 投票:0回答:1

我正在寻找一种解决方案,将电子邮件通知集成到 Oracle E-Business Suite 中的标准并发程序(自动发票主程序)中。具体来说,我希望在完成后收到一封电子邮件,指示它是否成功、遇到错误或产生警告。

如果您有任何关于如何有效实现此功能的见解、代码片段或指示,我将不胜感激。

我尝试创建警报,但它不起作用。

sql plsql alert oracle-ebs
1个回答
0
投票

您有多种选择。

  1. 编写一个由

    crontab
    每分钟启动的 shell 脚本,登录数据库,检查是否完成,然后使用标准
    sendmail
    /
    mailx
    等程序发送电子邮件。优点:邮件程序已经可以使用了。缺点:您必须有权访问主机、在数据库外部维护代码、保持数据库凭据最新,并且每分钟都会进行一次登录(审核跟踪条目)。

  2. 编写由

    dbms_scheduler
    引擎调度的 PL/SQL 过程,每分钟运行一次,检查完成情况并使用
    utl_tcp
    发送电子邮件。优点:无需担心凭据,无需登录,无需访问主机或在数据库之外拥有代码。缺点:你必须把自己的邮件程序放在一起。

  3. 可能还有很多其他想法。

如果您对#2感兴趣,您可以适应您的目的代码,您可以断开互联网来发送电子邮件。我用这个:

CREATE OR REPLACE PROCEDURE SENDMAIL_HTML(sender_name IN varchar2 :=NULL,
                                             sender_email IN varchar2,
                                             recipient_name IN varchar2 := NULL,
                                             recipient_email IN varchar2,
                                             subject_in IN varchar2 := NULL,
                                             message_in IN clob,
                                             attachment_name_1 IN varchar2 := NULL,
                                             attachment_mime_1 IN varchar2 := NULL,
                                             attachment_clob_1 IN clob := NULL,
                                             attachment_name_2 IN varchar2 := NULL,
                                             attachment_mime_2 IN varchar2 := NULL,
                                             attachment_clob_2 IN clob := NULL,
                                             attachment_name_3 IN varchar2 := NULL,
                                             attachment_mime_3 IN varchar2 := NULL,
                                             attachment_clob_3 IN clob := NULL,
                                             attachment_name_4 IN varchar2 := NULL,
                                             attachment_mime_4 IN varchar2 := NULL,
                                             attachment_clob_4 IN clob := NULL)
AS
  mail_host varchar2(30) := 'localhost';
  mail_connection utl_smtp.connection;
  message clob;
  message_piece varchar2(2000);
  boundary    VARCHAR2(50) := '----=*#abc1234321cba#*=';
  step        PLS_INTEGER  := 12000; -- make sure you set a multiple of 3 not higher than 24573
  var_start_pos integer;
  var_unencoded_raw raw(32767); 
  var_encoded_raw raw(32767);
  var_encoded_string varchar2(32767);
BEGIN
  message := message_in;

  mail_connection := utl_smtp.open_connection(mail_host, 25);
  utl_smtp.helo(mail_connection, mail_host);
  utl_smtp.mail(mail_connection, sender_email);
  utl_smtp.rcpt(mail_connection, recipient_email);
  utl_smtp.open_data(mail_connection);
  utl_smtp.write_data(mail_connection,'Date: '||TO_CHAR(SYSDATE,'dd Mon yy hh24:mi:ss')||utl_tcp.CRLF);
  utl_smtp.write_data(mail_connection,'From: '||NVL(sender_name,sender_email)||' <'||sender_email||'>'||utl_tcp.CRLF);
  utl_smtp.write_data(mail_connection,'To: '||NVL(recipient_name,recipient_email)||' <'||recipient_email||'>'||utl_tcp.CRLF);
  utl_smtp.write_data(mail_connection,'Subject: '||NVL(subject_in,' ')|| utl_tcp.CRLF);
  utl_smtp.write_data(mail_connection, 'MIME-Version: 1.0' || utl_tcp.CRLF);
  utl_smtp.write_data(mail_connection, 'Content-Type: multipart/mixed; boundary="' || boundary || '"' || utl_tcp.CRLF || utl_tcp.CRLF);

  IF dbms_lob.getlength(message) > 0
  THEN
    utl_smtp.write_data(mail_connection, '--' || boundary || utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, 'Content-Type: text/html; charset=us-ascii ' || utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, 'Content-Disposition: inline' || utl_tcp.CRLF || utl_tcp.CRLF);    
    utl_smtp.write_data(mail_connection, '<html>'|| utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, '<head>'|| utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, '<title>'||NVL(subject_in,' ')||'</title>'|| utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, '</head>'|| utl_tcp.CRLF); 
    utl_smtp.write_data(mail_connection, '<body>'|| utl_tcp.CRLF); 
    utl_smtp.write_data(mail_connection, '<pre style="font: monospace">'|| utl_tcp.CRLF); 
    

    FOR chunk IN 1..CEIL(dbms_lob.getlength(message)/1000)
    LOOP
      var_start_pos := 1+(chunk-1)*1000;
      utl_smtp.write_data(mail_connection,dbms_lob.substr(message,1000,var_start_pos));      
    END LOOP;
    
    utl_smtp.write_data(mail_connection, '</pre>'|| utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, '</body>'|| utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, '</html>'|| utl_tcp.CRLF);
    
    utl_smtp.write_data(mail_connection,utl_tcp.CRLF||utl_tcp.CRLF);   
    
    utl_smtp.write_data(mail_connection, '--' || boundary || utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, 'Content-Type: text/plain; charset="iso-8859-1"; format=flowed' || utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, 'Content-Disposition: inline' || utl_tcp.CRLF || utl_tcp.CRLF);

    FOR chunk IN 1..CEIL(dbms_lob.getlength(message)/1000)
    LOOP
      var_start_pos := 1+(chunk-1)*1000;
      utl_smtp.write_data(mail_connection,dbms_lob.substr(message,1000,var_start_pos));      
    END LOOP;
    
    utl_smtp.write_data(mail_connection,utl_tcp.CRLF||utl_tcp.CRLF);    
  END IF;
  
  IF LENGTH(attachment_clob_1) > 0
  THEN
    utl_smtp.write_data(mail_connection, '--' || boundary || utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, 'Content-Type: ' || attachment_mime_1 || '; name="' || attachment_name_1 || '"' || utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, 'Content-Transfer-Encoding: base64' || utl_tcp.CRLF);    
    utl_smtp.write_data(mail_connection, 'Content-Disposition: attachment; filename="' || attachment_name_1 || '"' || utl_tcp.CRLF || utl_tcp.CRLF);
 
    FOR i IN 0 .. TRUNC((dbms_lob.getlength(attachment_clob_1) - 1 )/step)
    LOOP
      var_unencoded_raw := utl_raw.cast_to_raw(dbms_lob.substr(attachment_clob_1, step, i * step + 1));
      var_encoded_raw := utl_encode.base64_encode(var_unencoded_raw);
      var_encoded_string := utl_raw.cast_to_varchar2(var_encoded_raw);
        
      utl_smtp.write_data(mail_connection, var_encoded_string);
    END LOOP;

    utl_smtp.write_data(mail_connection, utl_tcp.CRLF || utl_tcp.CRLF);    
  END IF;
  
  IF LENGTH(attachment_clob_2) > 0
  THEN
    utl_smtp.write_data(mail_connection, '--' || boundary || utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, 'Content-Type: ' || attachment_mime_2 || '; name="' || attachment_name_2 || '"' || utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, 'Content-Transfer-Encoding: base64' || utl_tcp.CRLF);    
    utl_smtp.write_data(mail_connection, 'Content-Disposition: attachment; filename="' || attachment_name_2 || '"' || utl_tcp.CRLF || utl_tcp.CRLF);
 
    FOR i IN 0 .. TRUNC((dbms_lob.getlength(attachment_clob_2) - 1 )/step)
    LOOP
      var_unencoded_raw := utl_raw.cast_to_raw(dbms_lob.substr(attachment_clob_2, step, i * step + 1));
      var_encoded_raw := utl_encode.base64_encode(var_unencoded_raw);
      var_encoded_string := utl_raw.cast_to_varchar2(var_encoded_raw);
        
      utl_smtp.write_data(mail_connection, var_encoded_string);
    END LOOP;

    utl_smtp.write_data(mail_connection, utl_tcp.CRLF || utl_tcp.CRLF);    
  END IF;
  
  IF LENGTH(attachment_clob_3) > 0
  THEN
    utl_smtp.write_data(mail_connection, '--' || boundary || utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, 'Content-Type: ' || attachment_mime_3 || '; name="' || attachment_name_3 || '"' || utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, 'Content-Transfer-Encoding: base64' || utl_tcp.CRLF);    
    utl_smtp.write_data(mail_connection, 'Content-Disposition: attachment; filename="' || attachment_name_3 || '"' || utl_tcp.CRLF || utl_tcp.CRLF);
 
    FOR i IN 0 .. TRUNC((dbms_lob.getlength(attachment_clob_3) - 1 )/step)
    LOOP
      var_unencoded_raw := utl_raw.cast_to_raw(dbms_lob.substr(attachment_clob_3, step, i * step + 1));
      var_encoded_raw := utl_encode.base64_encode(var_unencoded_raw);
      var_encoded_string := utl_raw.cast_to_varchar2(var_encoded_raw);
        
      utl_smtp.write_data(mail_connection, var_encoded_string);
    END LOOP;

    utl_smtp.write_data(mail_connection, utl_tcp.CRLF || utl_tcp.CRLF);    
  END IF;
  
  IF LENGTH(attachment_clob_4) > 0
  THEN
    utl_smtp.write_data(mail_connection, '--' || boundary || utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, 'Content-Type: ' || attachment_mime_4 || '; name="' || attachment_name_4 || '"' || utl_tcp.CRLF);
    utl_smtp.write_data(mail_connection, 'Content-Transfer-Encoding: base64' || utl_tcp.CRLF);    
    utl_smtp.write_data(mail_connection, 'Content-Disposition: attachment; filename="' || attachment_name_4 || '"' || utl_tcp.CRLF || utl_tcp.CRLF);
 
    FOR i IN 0 .. TRUNC((dbms_lob.getlength(attachment_clob_4) - 1 )/step)
    LOOP
      var_unencoded_raw := utl_raw.cast_to_raw(dbms_lob.substr(attachment_clob_4, step, i * step + 1));
      var_encoded_raw := utl_encode.base64_encode(var_unencoded_raw);
      var_encoded_string := utl_raw.cast_to_varchar2(var_encoded_raw);
        
      utl_smtp.write_data(mail_connection, var_encoded_string);
    END LOOP;

    utl_smtp.write_data(mail_connection, utl_tcp.CRLF || utl_tcp.CRLF);    
  END IF;
    
  utl_smtp.write_data(mail_connection, '--' || boundary || '--' || utl_tcp.crlf);  
  utl_smtp.close_data(mail_connection);
  utl_smtp.quit(mail_connection);
END;

我确信我几年前就从其他人那里得到了这一点,并进一步对其进行了调整。此版本支持 HTML 格式和最多 9 个附件(我通常用于发送要在 Excel 中打开的 CSV 文件)。

您还需要与 DBA 合作,获得对本地主机的

resolve
connect
的网络 ACL 权限,尽管我通常只是将其设置为
*
(任何主机)。旧的方法是:

BEGIN
  SYS.DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('netacl.xml','Allow usage to the UTL network packages', 'MYUSER', TRUE, 'connect');
  SYS.DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE('netacl.xml' ,'MYUSER', TRUE, 'resolve');
  SYS.DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('netacl.xml','*');
END;
/

但我认为现在有一个更新的界面。

一旦编译了程序并且网络 ACL 就位,您只需从计划的程序中调用邮件程序即可:

BEGIN
  sendmail_html(sender_name => 'My name',
                sender_email => '[email protected]',
                recipient_email => '[email protected]',
                subject_in => 'An interesting email',
                message_in => 'Blah, blah <b>blah</b> blah...');
END;
                                         
                                         
© www.soinside.com 2019 - 2024. All rights reserved.