用Oracle自动发邮件

来源:互联网 发布:麦迪生涯数据统计 编辑:程序博客网 时间:2024/05/16 01:54

 用Oracle自动发邮件 2013-01-18 16:21:16

分类: Linux

原文地址:用Oracle发邮件 作者:arron0754

    最近有空研究了一下用Oracle自带UTL_SMTP发送邮件的方法,标准步骤如下:

1.建立到SMTP Server的连接: UTL_SMTP.OPEN_CONNECTION

2.执行初始握手信号:        UTL_SMTP.EHLO/HELO

2.5 设置SMTP服务器登录校验(看需要)                     

3.设置发件人:              UTL_SMTP.MAIL                   

4.设置收件人:              UTL_SMTP.RCPT                   

5.打开数据流:              UTL_SMTP.OPEN_DATA              

6.写邮件内容:             UTL_SMTP.WRITE_RAW_DATA

  包括

  邮件的头部

      Date: 2012 12 19 17:25:00||UTL_TCP.CRLF

      From: 发件人||UTL_TCP.CRLF

      To:收件人||UTL_TCP.CRLF

      Subject:邮件主题|| UTL_TCP.CRLF || UTL_TCP.CRLF

  邮件正文  

7.关闭数据流:              UTL_SMTP.CLOSE_DATA             

8.退出连接:               UTL_SMTP.QUIT

 

参考样例:

 

1.  CREATE OR REPLACE PROCEDUREsend_mail(p_recipient VARCHAR2, --邮件接收人

2.                                           p_subject VARCHAR2, --邮件标题

3.                                           p_message VARCHAR2 --邮件正文

4.  ) 

5.  IS

6.    --下面四个变量请根据实际邮件服务器进行赋值

7.    v_mailhost VARCHAR2(30) := 'mail.gxlu.com.cn'; --SMTP服务器地址

8.    v_user VARCHAR2(30) := 'abc'; --登录SMTP服务器的用户名

9.    v_pass VARCHAR2(20) := '123456'; --登录SMTP服务器的密码

10.   v_sender VARCHAR2(50) := 'abc@gxlu.com.cn'; --发送者邮箱,一般与 ps_user 对应

11.   v_connUTL_SMTP.connection; --到邮件服务器的连接

12.   v_msg VARCHAR2(4000); --邮件内容

13. BEGIN

14.   v_conn := UTL_SMTP.open_connection(v_mailhost, 25);

15.   UTL_SMTP.ehlo(v_conn, v_mailhost); --是用 ehlo() 而不是 helo()函数

16.   --否则会报:ORA-29279: SMTP永久性错误: 503 5.5.2 Send hellofirst.

17.   UTL_SMTP.command(v_conn, 'AUTH LOGIN'); -- smtp服务器登录校验

18.   UTL_SMTP.command(v_conn,

19.                    UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_user))));

20.   UTL_SMTP.command(v_conn,

21.                    UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_pass))));

22.   UTL_SMTP.mail(v_conn, '<' || v_sender || '>'); --设置发件人

23.   UTL_SMTP.rcpt(v_conn, '<' || p_recipient || '>'); --设置收件人

24.   --创建要发送的邮件内容注意报头信息和邮件正文之间要空一行

25.   v_msg := 'Date:' || TO_CHAR(SYSDATE, 'yyyy mm ddhh24:mi:ss') ||

26.            UTL_TCP.CRLF || 'From: ' || v_sender || '' || UTL_TCP.CRLF ||

27.            'To: ' || p_recipient || '' || UTL_TCP.CRLF || 'Subject: ' ||

28.            p_subject || UTL_TCP.CRLF || UTL_TCP.CRLF --这前面是报头信息

29.            || p_message; --这个是邮件正文

30.   UTL_SMTP.open_data(v_conn); --打开流

31.   UTL_SMTP.write_raw_data(v_conn, UTL_RAW.cast_to_raw(v_msg)); --这样写标题和内容都能用中文

32.   UTL_SMTP.close_data(v_conn); --关闭流

33.   UTL_SMTP.quit(v_conn); --关闭连接

34. EXCEPTION

35.   WHENOTHERS THEN

36.     DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);

37.     DBMS_OUTPUT.put_line(DBMS_UTILITY.format_call_stack);

38. END send_mail;

 

原创粉丝点击