执行Shell命令以从PL / SQL发送邮件

时间:2017-07-27 07:43:02

标签: unix plsql

我们被迫使用PL / SQL的mailx命令发送邮件 我和我有通用脚本,但我不确定如何直接在PL / SQL代码中执行

我们的代码是

(echo "$mailbody" uuencode $ZIP_FILE $ZIP_FILE) | mailx -m -s "subject" -r " " "$mail_to_address"

2 个答案:

答案 0 :(得分:1)

显然,您已经解释过Oracle已通过UTL_MAIL提供内置支持,并且不使用您的组织已经支付的功能,这是蛮干的:)

  

"我不确定如何直接在PL / SQL代码中执行"

您无法直接从PL / SQL运行OS命令。然而...

自Oracle 10g以来,DBMS_SCHEDULER允许我们调用主机程序。 CREATE_PROGRAM()其中program_type => 'EXECUTABLE'。如果您希望有一个后台作业来轮询通知然后发送批量电子邮件,那么调度程序方法将是最佳方法。坦率地说,DBMS_SCHEDULER的最佳介绍是Tim Hall's articles on Oracle-Base

但是如果您需要按需执行调用,那么您需要的方法是Java存储过程,它使用Java Command对象来运行主机调用。这可能存在政治问题,因为一些DBA对Java持怀疑态度,但它受到了支持。这是an Oracle White Paper which explains how to go about it

答案 1 :(得分:1)

您可以从PL / SQL过程发送电子邮件,而无需调用mailx等操作系统命令。这里有一些例子:

http://www.orafaq.com/wiki/Send_mail_from_PL/SQL

其中一个示例的示例代码:

DECLARE
  v_From      VARCHAR2(80) := 'oracle@mycompany.com';
  v_Recipient VARCHAR2(80) := 'test@mycompany.com';
  v_Subject   VARCHAR2(80) := 'test subject';
  v_Mail_Host VARCHAR2(30) := 'mail.mycompany.com';
  v_Mail_Conn utl_smtp.Connection;
  crlf        VARCHAR2(2)  := chr(13)||chr(10);
BEGIN
 v_Mail_Conn := utl_smtp.Open_Connection(v_Mail_Host, 25);
 utl_smtp.Helo(v_Mail_Conn, v_Mail_Host);
 utl_smtp.Mail(v_Mail_Conn, v_From);
 utl_smtp.Rcpt(v_Mail_Conn, v_Recipient);
 utl_smtp.Data(v_Mail_Conn,
   'Date: '   || to_char(sysdate, 'Dy, DD Mon YYYY hh24:mi:ss') || crlf ||
   'From: '   || v_From || crlf ||
   'Subject: '|| v_Subject || crlf ||
   'To: '     || v_Recipient || crlf ||
   crlf ||
   'some message text'|| crlf ||    -- Message body
   'more message text'|| crlf
 );
 utl_smtp.Quit(v_mail_conn);
EXCEPTION
 WHEN utl_smtp.Transient_Error OR utl_smtp.Permanent_Error then
   raise_application_error(-20000, 'Unable to send mail', TRUE);
END;
/