从Oracle9i中发送电子邮件
Oracle的包utl_smtp提供了從數(shù)據(jù)庫中直接發(fā)送電子郵件的功能,這里介紹一下其使用方法
網(wǎng)上找到的例子以及Oracle文檔中的例子都沒有提到authorized的問題,我的測試中使用的是
163的免費信箱,發(fā)送時老是報錯:
ORA-20000: Failed to send mail due to the following error:?
ORA-29279: SMTP 永久性錯誤: 553 You are not authorized to send mail as <MAIL FROM:demo@163.com>, authentication is required
后來在metalink上找到解決方法:要在程序中增加登錄smtp服務(wù)器的過程!
? 測試環(huán)境: RedHat AS 3.0? Oracle 9.2.0.6
SMTP服務(wù)器: smtp.163.com(ip地址202.108.44.205)
下面是存儲過程的源代碼,注意數(shù)據(jù)庫服務(wù)器必須要能訪問smtp.163.com
CREATE OR REPLACE PROCEDURE send_mail (
? p_recipient IN?? VARCHAR2,
? p_message?? IN?? VARCHAR2,
? p_subject?? IN?? VARCHAR2 default 'Oracle Perf Report '||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),
? p_sender??? IN?? VARCHAR2 default?'demo@163.com')
?
IS
? v_mailhost varchar2(30) := '202.108.44.205';? -- SMTP服務(wù)器地址
? mail_conn utl_smtp.connection;
? msg varchar2(4000);
?
? p_user? varchar2(30) := 'demo';?????? -- 登錄SMTP服務(wù)器的用戶名
? p_pass? varchar2(30) := 'demo';?????? -- 登錄SMTP服務(wù)器的密碼
??
BEGIN
? /* 創(chuàng)建要發(fā)送的郵件內(nèi)容 注意報頭信息和郵件正文之間要空一行 */
? msg := 'Date:' ||to_char(sysdate,'dd mon yy hh24:mi:ss') || utl_tcp.CRLF ||
???????? 'From: ' || p_sender || '<'||p_sender||'>' ||utl_tcp.CRLF ||
???????? 'To: '|| p_recipient || '<' || p_recipient || '>' ||utl_tcp.CRLF||
???????? 'Subject: '||p_subject || utl_tcp.CRLF ||utl_tcp.CRLF||
???????? p_message;
? -- dbms_output.put_line(msg);
??
? mail_conn := utl_smtp.open_connection(v_mailhost,25);
? utl_smtp.helo(mail_conn,v_mailhost);
??
? /* smtp服務(wù)器登錄校驗 */
? utl_smtp.command(mail_conn, 'AUTH LOGIN');?
? utl_smtp.command(mail_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_user))));?
? utl_smtp.command(mail_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_pass))));
? utl_smtp.mail(mail_conn,p_sender);
? utl_smtp.rcpt(mail_conn,p_recipient);
??
? /* 發(fā)送數(shù)據(jù) */
? utl_smtp.data(mail_conn, msg);
? utl_smtp.quit(mail_conn);
EXCEPTION
? WHEN OTHERS THEN
??? dbms_output.put_line(dbms_utility.format_error_stack);
??? dbms_output.put_line(dbms_utility.format_call_stack);
??
END send_mail;
測試這個存儲過程:
SQL> exec send_mail('demo2@163.com','This?is a oracle send mail demo!!!');
PL/SQL procedure successfully completed
參考資料:
1、《Oracle9i Supplied PL/SQL Packages and Types Reference》100 UTL_SMTP
2、網(wǎng)友mugen的《oracle 發(fā)郵件的程序》:http://blog.itpub.net/post/76/9913
總結(jié)
以上是生活随笔為你收集整理的从Oracle9i中发送电子邮件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Undo TableSpace ①.管理
- 下一篇: Oracle Golden Gate 系