--發(fā)送郵件的主過(guò)程如下所述:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
Procedure send_mail_ (p_From Varchar2, --郵件發(fā)送人 p_Fromuser Varchar2, --發(fā)件人昵稱(chēng) p_Touser Varchar2, --接受人昵稱(chēng) p_To Varchar2, --郵件接收人 p_Cc Varchar2, --郵件抄送人 p_Subject Varchar2, --郵件標(biāo)題 p_Message Varchar2, --郵件內(nèi)容 p_User Varchar2, --郵件驗(yàn)證用戶(hù) p_Mailhost VARCHAR2, --郵件的服務(wù)地址 p_Psd Varchar2 --郵件驗(yàn)證密碼 ) 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ù)否則會(huì)報(bào):ORA-29279: SMTP 永久性錯(cuò)誤: 503 5.5.2 Send hello first. Utl_Smtp.Command(v_Conn, 'AUTH LOGIN' ); -- smtp服務(wù)器登錄校驗(yàn) 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)容注意報(bào)頭信息和郵件正文之間要空一行 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 -- 這前面是報(bào)頭信息 || p_Message; -- 這個(gè)是郵件正文 Utl_Smtp.Open_Data(v_Conn); --打開(kāi)流 Utl_Smtp.Write_Raw_Data(v_Conn,Utl_Raw.Cast_To_Raw( Convert ( 'Content-Type:text/html;charset=utf-8' || v_Msg, 'ZHS16GBK' ))); --這樣寫(xiě)標(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ī)?lái)的利用Oracle數(shù)據(jù)庫(kù)發(fā)送郵件的實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的,在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!
原文鏈接:http://www.cnblogs.com/samwolf911/archive/2016/09/02/5833199.html