利用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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,关于您提到的使用 UTL_SMTP 发邮件,给自己发邮件有正文内容,给别人发邮件没有正文内容的问题,我猜测是您在发送邮件时没有添加邮件正文内容,或者您添加的邮件正文内容格式不正确导致的。 在使用 UTL_SMTP 发送邮件时,需要调用 UTL_SMTP.WRITE_DATA 函数将邮件正文内容写入到邮件中。正文内容的格式需要按照邮件的格式要求进行指定,通常是使用 HTML 格式或纯文本格式。 以下是一个使用 UTL_SMTP 发送 HTML 格式邮件的示例代码: ``` DECLARE l_mail_conn UTL_SMTP.connection; l_mail_host VARCHAR2(255) := 'smtp.example.com'; l_mail_port PLS_INTEGER := 25; l_mail_user VARCHAR2(255) := 'user@example.com'; l_mail_pass VARCHAR2(255) := 'password'; l_mail_to VARCHAR2(255) := 'recipient@example.com'; l_mail_subject VARCHAR2(255) := 'Test Email'; l_mail_body VARCHAR2(32767) := '<html><body><h1>This is a test email!</h1></body></html>'; BEGIN l_mail_conn := utl_smtp.open_connection(l_mail_host, l_mail_port); utl_smtp.helo(l_mail_conn, l_mail_host); utl_smtp.mail(l_mail_conn, l_mail_user); utl_smtp.rcpt(l_mail_conn, l_mail_to); utl_smtp.data(l_mail_conn, 'Subject:' || l_mail_subject || utl_tcp.crlf); utl_smtp.data(l_mail_conn, 'From: ' || l_mail_user || utl_tcp.crlf); utl_smtp.data(l_mail_conn, 'To: ' || l_mail_to || utl_tcp.crlf); utl_smtp.data(l_mail_conn, 'Content-Type: text/html; charset=UTF-8' || utl_tcp.crlf); utl_smtp.data(l_mail_conn, utl_tcp.crlf); utl_smtp.write_data(l_mail_conn, l_mail_body); utl_smtp.quit(l_mail_conn); END; ``` 请注意,这只是一个示例代码,并且需要根据您的实际情况进行调整。希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值