2016-01-09 34 views
-1

我做一個形式,我想,當我按鈕點擊發送電子郵件我得到電子郵件的代碼從互聯網如何使用Oracle 10g至發送郵件窗體

CREATE OR REPLACE FUNCTION FSC.SEND_MAIL 
(pIssuer IN VARCHAR2, 
pReceiver IN VARCHAR2, 
pSender IN VARCHAR2, 
pSubject IN VARCHAR2, 
pMessage IN VARCHAR2) RETURN VARCHAR2 IS 

c utl_smtp.connection; 
respuesta utl_smtp.reply; 
pServer VARCHAR2(50) := '192.168.0.6'; 

BEGIN 

-- Open the connection to the mail server 
c := utl_smtp.open_connection(pServer); 
respuesta := utl_smtp.helo(c, pServer); 

-- Start the Issuer mail. 
respuesta := utl_smtp.mail(c, pSender); 

-- Starts Receiver 
respuesta := utl_smtp.rcpt(c, pReceiver); 

respuesta := utl_smtp.open_data(c); 
-- Enter the email header 
utl_smtp.write_data(c, 'From: ' || pIssuer || utl_tcp.CRLF); 
utl_smtp.write_data(c, 'To: ' || pReceiver || utl_tcp.CRLF); 
-- Enter the Subject 
utl_smtp.write_data(c, 'Subject: ' || pSubject || utl_tcp.CRLF); 
-- Write the message text. 
utl_smtp.write_data(c, utl_tcp.CRLF || pMessage); 
utl_smtp.write_data(c, utl_tcp.CRLF || '.'); 

respuesta := utl_smtp.close_data(c); 

-- Close connection 
respuesta := utl_smtp.quit(c); 

RETURN '0'; 

EXCEPTION 
WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN 
utl_smtp.quit(c); 
RETURN sqlerrm; 
--raise_application_error(-20000, 
-- 'The sending of the email has failed by returning the following error: ' || sqlerrm); 
WHEN OTHERS THEN 
RETURN sqlerrm; 
END; 
/

我有這樣的功能在SQL它,它已成功運行,但是當我再執行任何電子郵件發送給我的願望地址

declare 

begin 

dbms_output.put_line(SEND_MAIL('[email protected]','[email protected]','[email protected]','Testing','email message')); 
end; 

我用我的本地交換機發送EAMIL和服務器的IP地址192.168.0.6是

第二個問題在該代碼時,我使甲骨文10克形式相同功能那麼它給我這個錯誤

utl_tcp.CRLF是不能直接存取權限遠程包

+0

嘗試刪除異常處理程序和運行功能 –

+0

自認倒黴 –

回答

1

我使用此通用程序發出的郵件。它也支持附件(純文本)和郵件不限於32767個字符。

如果你根本不需要附件,那麼刪除它應該沒問題。

PRIORITY_HIGH   CONSTANT INTEGER := 1; 
PRIORITY_NORMAL   CONSTANT INTEGER := 3; 
PRIORITY_LOW   CONSTANT INTEGER := 5; 


PROCEDURE SendMail(
    Subject IN VARCHAR2, 
    Message IN OUT CLOB, 
    ToMail IN VARCHAR2, 
    FromMail IN VARCHAR2, FromName IN VARCHAR2, 
    Attachment IN OUT CLOB, FileName IN VARCHAR2, 
    Priority IN INTEGER DEFAULT PRIORITY_NORMAL) IS 

    MIME_BOUNDARY CONSTANT VARCHAR2(50) := '====Multipart.Boundary.689464861147414354===='; 
    MIME_MIXED  CONSTANT VARCHAR2(50) := 'multipart/mixed;'; 
    MIME_TEXT  CONSTANT VARCHAR2(50) := 'text/plain;'; 
    MIME_HTML  CONSTANT VARCHAR2(50) := 'text/html;'; 
    MAIL_HOST  CONSTANT VARCHAR2(50) := '192.168.0.6'; -- try also 'mailhost' 

    con UTL_SMTP.connection; 
    ret UTL_SMTP.reply; 
    Charset VARCHAR2(20); 
    Footer VARCHAR2(1000); 

    ClobLen PLS_INTEGER; 
    amount BINARY_INTEGER := 8192; 
    buffer VARCHAR2(16384); 
    offset PLS_INTEGER := 1; 
    isHTML BOOLEAN := REGEXP_LIKE(DBMS_LOB.SUBSTR(Message, 1000, 1), '<(html)|(body)', 'i'); 

BEGIN 

    SELECT UTL_I18N.MAP_CHARSET(VALUE) 
    INTO Charset 
    FROM V$NLS_PARAMETERS 
    WHERE PARAMETER = 'NLS_CHARACTERSET'; 

    -- setup mail header 
    con := UTL_SMTP.OPEN_CONNECTION(MAIL_HOST, 25); 
    ret := UTL_SMTP.helo(con, SYS_CONTEXT('USERENV', 'DB_DOMAIN')); -- assuming your database is in the same domain as your mail server 
    ret := UTL_SMTP.Mail(con, FromMail); 
    ret := UTL_SMTP.rcpt(con, ToMail); 
    -- simply call "UTL_SMTP.rcpt(con, ...);" again in order to add further recipient 
    ret := UTL_SMTP.open_data(con); 

    IF FromName IS NOT NULL THEN 
     UTL_SMTP.write_data(con, 'From: "'||FromName||'" <'||FromMail||'>'||Utl_Tcp.CRLF); 
    ELSE 
     UTL_SMTP.write_data(con, 'From: <'||FromMail||'>'||Utl_Tcp.CRLF); 
    END IF; 
    UTL_SMTP.write_data(con, 'To: <'||ToMail||'>'||Utl_Tcp.CRLF); 
    -- UTL_SMTP.write_data(con, 'Cc: <'||CcMail||'>'||Utl_Tcp.CRLF);  
    UTL_SMTP.write_data(con, 'Subject: '||Subject||Utl_Tcp.CRLF); 
    UTL_SMTP.write_data(con, 'X-Priority: '||Priority||Utl_Tcp.CRLF); 

    IF Attachment IS NOT NULL AND FileName IS NOT NULL THEN 
     UTL_SMTP.write_data(con, 'Mime-Version: 1.0' || Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, 'Content-Type: '||MIME_MIXED||' boundary="'||MIME_BOUNDARY||'"' || Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, 'This is a multipart message in MIME format.' || Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, '--'||MIME_BOUNDARY || Utl_Tcp.CRLF); 
    END IF; 

    Footer := 'Message from '||SYS_CONTEXT('USERENV', 'DB_NAME')||' sent at '||TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss'); 
    IF isHTML THEN 
     UTL_SMTP.write_data(con, 'Content-type: '||MIME_HTML||' charset='||Charset || Utl_Tcp.CRLF); 
     Message := REPLACE(message, '</body>', '<p>'||Footer||'</p></body>'); 
    ELSE 
     UTL_SMTP.write_data(con, 'Content-type: '||MIME_TEXT||' charset='||Charset || Utl_Tcp.CRLF); 
    END IF; 

    -- Mail Body 
    UTL_SMTP.write_data(con, Utl_Tcp.CRLF); 
    ClobLen := DBMS_LOB.GETLENGTH(Message); 
    LOOP 
     EXIT WHEN offset > ClobLen; 
     DBMS_LOB.READ(Message, amount, offset, BUFFER); 
     UTL_SMTP.write_raw_data(con, UTL_RAW.cast_to_raw(BUFFER)); 
     offset := offset + amount; 
    END LOOP; 
    UTL_SMTP.write_data(con, Utl_Tcp.CRLF); 
    IF NOT isHTML THEN 
     UTL_SMTP.write_data(con, Utl_Tcp.CRLF || Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, Footer); 
     UTL_SMTP.write_data(con, Utl_Tcp.CRLF); 
    END IF; 

    IF Attachment IS NOT NULL AND FileName IS NOT NULL THEN 
     -- Mail Attachment 
     UTL_SMTP.write_data(con, Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, '--'||MIME_BOUNDARY || Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, 'Content-Type: '||MIME_TEXT||' name="'||Filename||'"'|| Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, 'Content-Disposition: attachment; filename="'||Filename||'"'|| Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, Utl_Tcp.CRLF); 

     offset := 1; 
     ClobLen := DBMS_LOB.GETLENGTH(Attachment); 
     LOOP 
      EXIT WHEN offset > ClobLen; 
      DBMS_LOB.READ(Attachment, amount, offset, BUFFER); 
      UTL_SMTP.write_raw_data(con, Utl_Raw.cast_to_raw(BUFFER)); 
      offset := offset + amount; 
     END LOOP; 
     UTL_SMTP.write_data(con, Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, '--'||MIME_BOUNDARY||'--' || Utl_Tcp.CRLF); 
    END IF; 

    -- finish mail 
    ret := UTL_SMTP.close_data(con); 
    ret := UTL_SMTP.quit(con); 

EXCEPTION 
    WHEN UTL_SMTP.TRANSIENT_ERROR OR UTL_SMTP.PERMANENT_ERROR THEN 
     UTL_SMTP.quit(con); 
     RAISE; 
END SendMail; 

請注意,千萬不要錯過UTL_SMTP.write_data(con, UTL_TCP.CRLF)這幾行。他們看起來多餘,但大多數都是必需的!還有「這是MIME格式的多部分郵件」等禮貌郵件。在附件的情況下正確顯示您的郵件需要。

如果您仍然遇到問題,請在UTL_SMTP上調用每個函數後使用dbms_output.put_line(ret.code||': '||ret.text);

這裏同樣的程序,但降低你的需求:

FUNCTION SendMail(
    Subject IN VARCHAR2, 
    Message IN VARCHAR2, 
    FromMail IN VARCHAR2, FromName IN VARCHAR2, 
    ToMail IN VARCHAR2) RETURN VARCHAR2 IS 

    MIME_TEXT  CONSTANT VARCHAR2(50) := 'text/plain;'; 
    MIME_HTML  CONSTANT VARCHAR2(50) := 'text/html;'; 
    MAIL_HOST  CONSTANT VARCHAR2(50) := '192.168.0.6'; -- try also 'mailhost' 

    con UTL_SMTP.connection; 
    ret UTL_SMTP.reply; 
    Charset VARCHAR2(20); 
    isHTML BOOLEAN := REGEXP_LIKE(DBMS_LOB.SUBSTR(Message, 1000, 1), '<(html)|(body)', 'i'); 

BEGIN 

    SELECT UTL_I18N.MAP_CHARSET(VALUE) 
    INTO Charset 
    FROM V$NLS_PARAMETERS 
    WHERE PARAMETER = 'NLS_CHARACTERSET'; 

    -- setup mail header 
    con := UTL_SMTP.OPEN_CONNECTION(MAIL_HOST, 25); 
    ret := UTL_SMTP.helo(con, SYS_CONTEXT('USERENV', 'DB_DOMAIN')); -- assuming your database is in the same domain as your mail server 
    ret := UTL_SMTP.Mail(con, FromMail); 
    ret := UTL_SMTP.rcpt(con, ToMail); 
    ret := UTL_SMTP.open_data(con); 

    UTL_SMTP.write_data(con, 'From: "'||FromName||'" <'||FromMail||'>'||Utl_Tcp.CRLF); 
    UTL_SMTP.write_data(con, 'To: <'||ToMail||'>'||Utl_Tcp.CRLF); 
    UTL_SMTP.write_data(con, 'Subject: '||Subject||Utl_Tcp.CRLF); 
    UTL_SMTP.write_data(con, 'X-Priority: 3'||Utl_Tcp.CRLF); 

    IF isHTML THEN 
     UTL_SMTP.write_data(con, 'Content-type: '||MIME_HTML||' charset='||Charset || Utl_Tcp.CRLF); 
    ELSE 
     UTL_SMTP.write_data(con, 'Content-type: '||MIME_TEXT||' charset='||Charset || Utl_Tcp.CRLF); 
    END IF; 

    -- Mail Body 
    UTL_SMTP.write_data(con, Utl_Tcp.CRLF); 
    UTL_SMTP.write_raw_data(con, UTL_RAW.cast_to_raw(Message)); 
    UTL_SMTP.write_data(con, Utl_Tcp.CRLF); 

    -- finish mail 
    ret := UTL_SMTP.close_data(con); 
    ret := UTL_SMTP.quit(con); 
    RETURN '0';  
EXCEPTION 
    WHEN UTL_SMTP.TRANSIENT_ERROR OR UTL_SMTP.PERMANENT_ERROR THEN 
     UTL_SMTP.quit(con); 
     RETURN SQLERRM; 
END SendMail; 
+0

你的意思是我做的SQL程序,並通過從形式值發生到這個程序 –

+0

是的。當你認爲這個過程是一種矯枉過正的時候,你可以刪除不需要的東西。 –

+0

這個程序不是有用的,它不能爲我工作 –