2017-07-27 43 views
0

我們被迫使用PL/SQL的mailx命令發送郵件 acutally我有我的通用腳本,但我不知道如何直接在PL/SQL代碼執行Shell命令從PL/SQL發送郵件

我們的代碼是

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

回答

1

很明顯,你已經解釋說,Oracle已經內置支持通過UTL_MAIL和不使用你的組織已經支付了:)

功能是有勇無謀

「我不知道如何直接在PL/SQL代碼執行」

您不能運行OS直接從PL/SQL命令。然而...

由於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

感謝您的輸入..但沒有我的組織批准,正在與UT_FILE測試,但日本文字記錄器被損壞,附件也不會。任何方式讓我嘗試這個dbms_scheduler選項 –

1

您可以從PL/SQL過程發送電子郵件,而無需調用諸如mailx之類的操作系統命令。一些例子在這裏:從其中一個例子

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

示例代碼:

DECLARE 
    v_From  VARCHAR2(80) := '[email protected]'; 
    v_Recipient VARCHAR2(80) := '[email protected]'; 
    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; 
/