利用Oracle數(shù)據(jù)庫發(fā)送郵件的實例代碼
--發(fā)送郵件的主過程如下所述:
Procedure send_mail_ (p_From Varchar2, --郵件發(fā)送人 p_Fromuser Varchar2, --發(fā)件人昵稱 p_Touser Varchar2, --接受人昵稱 p_To Varchar2, --郵件接收人 p_Cc Varchar2, --郵件抄送人 p_Subject Varchar2, --郵件標(biāo)題 p_Message Varchar2, --郵件內(nèi)容 p_User Varchar2, --郵件驗證用戶 p_Mailhost VARCHAR2, --郵件的服務(wù)地址 p_Psd Varchar2 --郵件驗證密碼 ) IS v_Conn Utl_Smtp.Connection; --到郵件服務(wù)器的連接 v_Msg Varchar2(32700); --郵件內(nèi)容 Psrc Varchar2(4000); Psrc1 Varchar2(4000); v_Touser1 VARCHAR2(4000); v_Touser VARCHAR2(500); v_To Varchar2(500); i Number := 1; j Number := 1; m Number := 1; n Number := 1; str_error VARCHAR2(20000); BEGIN v_Touser1 := ''; v_Conn := Utl_Smtp.Open_Connection(p_Mailhost, 25); Utl_Smtp.Ehlo(v_Conn, p_Mailhost); -- 是用 ehlo() 而不是 helo() 函數(shù)否則會報:ORA-29279: SMTP 永久性錯誤: 503 5.5.2 Send hello first. Utl_Smtp.Command(v_Conn, 'AUTH LOGIN'); -- smtp服務(wù)器登錄校驗 Utl_Smtp.Command(v_Conn, Utl_Raw.Cast_To_Varchar2(Utl_Encode.Base64_Encode(Utl_Raw.Cast_To_Raw(p_User)))); Utl_Smtp.Command(v_Conn, Utl_Raw.Cast_To_Varchar2(Utl_Encode.Base64_Encode(Utl_Raw.Cast_To_Raw(p_Psd )))); Utl_Smtp.Mail (v_Conn, '<' || p_From || '>'); --設(shè)置發(fā)件人 -- 設(shè)置收件人---------------- Psrc := Rtrim(Ltrim(p_To , ';'), ';') || ';'; Psrc1 := Rtrim(Ltrim(p_Touser, ';'), ';') || ';'; IF Nvl(Instr(Psrc, ';', j), 0)>0 THEN LOOP i := Nvl(Instr(Psrc , ';', j), 0); m := Nvl(Instr(Psrc1, ';', n), 0); If i > 0 THEN v_To := Trim(Substr(Psrc , j, i - j)); v_Touser := nvl(Trim(Substr(Psrc1, n, m - n)),'1'); Utl_Smtp.Rcpt(v_Conn, v_To); --設(shè)置收件人 IF v_Touser = '1' THEN v_Touser := trim(SUBSTR(v_To,1,Instr(v_To,'@')-1)); END IF; IF j = 1 THEN v_Touser1 := v_Touser1 || v_Touser || '<' || v_To || '>'; ELSE v_Touser1 := v_Touser1 || ';'|| v_Touser || '<' || v_To || '>'; END IF; j := i + 1; n := m + 1; END IF; Exit When i = 0; END LOOP; ELSE Utl_Smtp.Rcpt(v_Conn, p_To); --設(shè)置收件人 v_Touser1 := v_Touser1 || p_Touser || '<' || p_To || '>'; END IF; -- 設(shè)置抄送人---------------- i := 1; j := 1; IF nvl(p_Cc,'aa')<>'aa' THEN Psrc := Rtrim(Ltrim(p_Cc, ';'), ';')|| ';'; IF Nvl(Instr(Psrc, ';', j), 0)>0 THEN LOOP i := Nvl(Instr(Psrc, ';', j), 0); If i > 0 THEN v_To := Trim(Substr(Psrc, j, i - j)); j := i + 1; Utl_Smtp.Rcpt(v_Conn, v_To); --設(shè)置抄送人 END IF; Exit When i = 0; END LOOP; ELSE IF nvl(p_Cc,'1') <> '1' THEN Utl_Smtp.Rcpt(v_Conn, p_Cc); --設(shè)置抄送人 END IF; END IF; END IF; -- 創(chuàng)建要發(fā)送的郵件內(nèi)容注意報頭信息和郵件正文之間要空一行 v_Msg := 'Date: ' || To_Char(Sysdate, 'dd mon yy hh24:mi:ss') || Utl_Tcp.Crlf || 'From: ' || p_Fromuser || '<' || p_From || '>' || Utl_Tcp.Crlf || 'To: ' || v_Touser1 || Utl_Tcp.Crlf || 'Cc: ' || p_Cc || Utl_Tcp.Crlf || 'Subject: ' || p_Subject || Utl_Tcp.Crlf || Utl_Tcp.Crlf -- 這前面是報頭信息 || p_Message; -- 這個是郵件正文 Utl_Smtp.Open_Data(v_Conn); --打開流 Utl_Smtp.Write_Raw_Data(v_Conn,Utl_Raw.Cast_To_Raw(Convert('Content-Type:text/html;charset=utf-8' || v_Msg, 'ZHS16GBK'))); --這樣寫標(biāo)題和內(nèi)容都能用中文 Utl_Smtp.Close_Data(v_Conn); --關(guān)閉流 Utl_Smtp.Quit(v_Conn); --關(guān)閉連接 Exception When Others THEN str_error := Dbms_Utility.Format_Error_Stack || Dbms_Utility.Format_Call_Stack; Dbms_Output.Put_Line(str_error); END;
以上所述是小編給大家?guī)淼睦肙racle數(shù)據(jù)庫發(fā)送郵件的實例代碼,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的,在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- PL/SQL中編寫Oracle數(shù)據(jù)庫分頁的存儲過程
- 詳解PL/SQL Developer連接本地Oracle 11g 64位數(shù)據(jù)庫
- 利用PL/SQL從Oracle數(shù)據(jù)庫導(dǎo)出和導(dǎo)入數(shù)據(jù)
- PL/SQL遠(yuǎn)程備份和恢復(fù)Oracle數(shù)據(jù)庫
- Oracle中PL/SQL中if語句的寫法介紹
- Oracle 存儲過程發(fā)送郵件實例學(xué)習(xí)
- oracle 發(fā)送郵件 實現(xiàn)方法
- 如何使用Oracle PL/SQL 實現(xiàn)發(fā)送電子郵件功能(UTL_MAIL)
相關(guān)文章
Oracle 數(shù)據(jù)庫忘記sys與system管理員密碼重置操作方法
這篇文章主要介紹了Oracle 數(shù)據(jù)庫忘記sys與system管理員密碼重置操作,需要的朋友可以參考下2017-06-06Oracle表空間的創(chuàng)建、使用、重命名與刪除方法
表空間是Oracle數(shù)據(jù)庫中的一個重要概念,它是一組物理文件,用于存儲數(shù)據(jù)庫對象,如表、索引等,在使用Oracle數(shù)據(jù)庫時,通常需要創(chuàng)建表空間來存放數(shù)據(jù),本文介紹了Oracle表空間的創(chuàng)建、使用、重命名與刪除方法2024-03-03Oracle Translate 統(tǒng)計字符出現(xiàn)的次數(shù)示例代碼
這篇文章主要介紹了Oracle Translate 統(tǒng)計字符出現(xiàn)的次數(shù)示例代碼,非常不錯具有參考借鑒價值,需要的朋友可以參考下2017-03-03Oracle 12CR2查詢轉(zhuǎn)換教程之表擴(kuò)展詳解
Oracle 12cR2版本已經(jīng)發(fā)布有一段時間,下面這篇文章主要給大家介紹了關(guān)于Oracle 12CR2查詢轉(zhuǎn)換教程之表擴(kuò)展的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11Oracle如何更改表空間的數(shù)據(jù)文件位置詳解
這篇文章主要給大家介紹了關(guān)于Oracle如何更改表空間的數(shù)據(jù)文件位置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11PLSQL創(chuàng)建新用戶并導(dǎo)入導(dǎo)出.dmp文件全過程
plsql導(dǎo)入.sql和.dmp文件時會經(jīng)常用到,對于初學(xué)者來說可能沒有那么簡單,畢竟oracle數(shù)據(jù)庫比較麻煩,這篇文章主要給大家介紹了關(guān)于PLSQL創(chuàng)建新用戶并導(dǎo)入導(dǎo)出.dmp文件的相關(guān)資料,需要的朋友可以參考下2023-11-11Oracle和MySQL的數(shù)據(jù)導(dǎo)入為何差別這么大
這篇文章主要介紹了Oracle和MySQL的數(shù)據(jù)導(dǎo)入有哪些區(qū)別,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08