我们被迫使用PL / SQL的mailx命令发送邮件 我和我有通用脚本,但我不确定如何直接在PL / SQL代码中执行
我们的代码是
(echo "$mailbody" uuencode $ZIP_FILE $ZIP_FILE) | mailx -m -s "subject" -r " " "$mail_to_address"
答案 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;
/