zoukankan      html  css  js  c++  java
  • 利用UTL_SMTP发送邮件

    最近有空研究了一下用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

    参考样例:

    CREATE OR REPLACE PROCEDURE Send_Mail(p_Recipient VARCHAR2
                                         , -- 邮件接收人
                                          p_Subject   VARCHAR2
                                         , -- 邮件标题
                                          p_Message   VARCHAR2 -- 邮件正文
                                          ) IS
      --下面四个变量请根据实际邮件服务器进行赋值
      v_Mailhost VARCHAR2(30) := 'mail.gxlu.com.cn'; --SMTP服务器地址
      v_User     VARCHAR2(30) := 'abc'; --登录SMTP服务器的用户名
      v_Pass     VARCHAR2(20) := '123456'; --登录SMTP服务器的密码
      v_Sender   VARCHAR2(50) := 'abc@gxlu.com.cn'; --发送者邮箱,一般与 ps_user 对应
      v_Conn     Utl_Smtp.Connection; --到邮件服务器的连接
      v_Msg      VARCHAR2(4000); --邮件内容
    BEGIN
      v_Conn := Utl_Smtp.Open_Connection(v_Mailhost, 25);
      Utl_Smtp.Ehlo(v_Conn, v_Mailhost); --是用 ehlo() 而不是 helo() 函数
      --否则会报:ORA-29279: SMTP 永久性错误: 503 5.5.2 Send hello first.
      Utl_Smtp.Command(v_Conn, 'AUTH LOGIN'); -- smtp服务器登录校验
      Utl_Smtp.Command(v_Conn
                      ,Utl_Raw.Cast_To_Varchar2(Utl_Encode.Base64_Encode(Utl_Raw.Cast_To_Raw(v_User))));
      Utl_Smtp.Command(v_Conn
                      ,Utl_Raw.Cast_To_Varchar2(Utl_Encode.Base64_Encode(Utl_Raw.Cast_To_Raw(v_Pass))));
      Utl_Smtp.Mail(v_Conn, '<' || v_Sender || '>'); --设置发件人
      Utl_Smtp.Rcpt(v_Conn, '<' || p_Recipient || '>'); --设置收件人
      -- 创建要发送的邮件内容 注意报头信息和邮件正文之间要空一行
      v_Msg := 'Date:' || To_Char(SYSDATE, 'yyyy mm dd hh24:mi:ss') || Utl_Tcp.Crlf || 'From: ' ||
               v_Sender || '' || Utl_Tcp.Crlf || 'To: ' || p_Recipient || '' || 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(v_Msg)); --这样写标题和内容都能用中文
      Utl_Smtp.Close_Data(v_Conn); --关闭流
      Utl_Smtp.Quit(v_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;
    

    原文出自 http://blog.itpub.net/14854071/viewspace-752889/

  • 相关阅读:
    贪心经典例题大赏
    【暑假培训1】7.13
    【7.10校内test】T1高级打字机
    【7.10校内test】T3经营与开发
    【7.10校内test】T2不等数列
    【7.9校内test】T2 极值问题
    【7.9校内test】T1挖地雷
    <知识整理>2019清北学堂提高储备D5
    <知识整理>2019清北学堂提高储备D4
    <知识整理>2019清北学堂提高储备D2
  • 原文地址:https://www.cnblogs.com/ruicccc/p/13227700.html
Copyright © 2011-2022 走看看