`
winie
  • 浏览: 224577 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

通过Oracle发送Email

阅读更多

 本篇是通过Oracle10g发送Email实例,该Procedure支持中文邮件、HTML代码、多收件人。

   在Procedure中p_receiver为收件人地址,多收件人以“,”(英文逗号)分割,p_sub为邮件标题,p_txt为邮件内容(支持HTML)。代码如下:

create or replace procedure bsd_sendemail (p_receiver varchar2,p_sub varchar2,p_txt varchar2)
is
p_user varchar2(30) := '';
p_pass varchar2(30) := '';
p_sendor varchar2(20) := 'Gnie';
p_server varchar2(20) := 'Mail_Server_IP';
p_port number := 25;
p_need_smtp number := 0;
p_subject varchar2(4000);
l_crlf varchar2(2) := utl_tcp.crlf;
l_sendoraddress varchar2(4000);
l_splite        varchar2(10) := '++';
boundary            constant varchar2(256) := '-----BYSUK';
first_boundary      constant varchar2(256) := '--' || boundary || l_crlf;
last_boundary       constant varchar2(256) := '--' || boundary || '--' || l_crlf;
multipart_mime_type constant varchar2(256) := 'multipart/mixed; boundary="' || boundary || '"';

type address_list is table of varchar2(100) index by binary_integer;
my_address_list address_list;
---------------------------------------分割邮件地址----------------------------------------------
procedure p_splite_str(p_str varchar2,p_splite_flag int default 1) is
   l_addr varchar2(254) := '';
   l_len  int;
   l_str  varchar2(4000);
   j      int := 0; --表示邮件地址或者附件的个数
begin
   /*处理接收邮件地址列表,包括去空格、将;转换为,等*/
   l_str := trim(rtrim(replace(replace(p_str, ';', ','), ' ', ''), ','));
   l_len := length(l_str);
   for i in 1 .. l_len loop
     if substr(l_str, i, 1) <> ',' then
       l_addr := l_addr || substr(l_str, i, 1);
     else
       j := j + 1;
       if p_splite_flag = 1 then --表示处理邮件地址
         --前后需要加上'<>',否则很多邮箱将不能发送邮件
         l_addr := '<' || l_addr || '>';
         --调用邮件发送过程
         my_address_list(j) := l_addr;
       end if;
       l_addr := '';
     end if;
     if i = l_len then
       j := j + 1;
       if p_splite_flag = 1 then
         --调用邮件发送过程
         l_addr := '<' || l_addr || '>';
         my_address_list(j) := l_addr;
       end if;
     end if;
   end loop;
end;
------------------------------------------------写邮件头和邮件内容------------------------------------------
procedure write_data(p_conn   in out nocopy utl_smtp.connection,
                      p_name   in varchar2,
                      p_value  in varchar2,
                      p_splite varchar2 default ':',
                      p_crlf   varchar2 default l_crlf) is
begin
   /* utl_raw.cast_to_raw 对解决中文乱码问题很重要*/
   utl_smtp.write_raw_data(p_conn, utl_raw.cast_to_raw(convert(p_name||p_splite||p_value ||p_crlf, 'ZHS16CGB231280')));
end;
----------------------------------------写mime邮件尾部-----------------------------------------------------
procedure end_boundary(conn in out nocopy utl_smtp.connection, last in boolean default false) is
begin
   utl_smtp.write_data(conn, utl_tcp.crlf);
   if (last) then
     utl_smtp.write_data(conn, last_boundary);
   end if;
end;
---------------------------------------------真正发送邮件的过程--------------------------------------------
procedure p_email(p_sendoraddress2 varchar2, --发送地址
                   p_receiveraddress2 varchar2) --接受地址
  is
   l_conn utl_smtp.connection; --定义连接
begin
   /*初始化邮件服务器信息,连接邮件服务器*/
   l_conn := utl_smtp.open_connection(p_server, p_port);
   utl_smtp.helo(l_conn, p_server);
   /* smtp服务器登录校验 */
   if p_need_smtp = 1 then
     utl_smtp.command(l_conn, 'AUTH LOGIN', '');
     utl_smtp.command(l_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_user))));
     utl_smtp.command(l_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_pass))));
   end if;

   /*设置发送地址和接收地址*/
   utl_smtp.mail(l_conn, p_sendoraddress2);
   utl_smtp.rcpt(l_conn, p_receiveraddress2);

   /*设置邮件头*/
   utl_smtp.open_data(l_conn);
   /*设置日期*/
   --write_data(l_conn, 'Date', to_char(sysdate-1/3, 'dd Mon yy hh24:mi:ss'));
   /*设置发送人*/
   write_data(l_conn, 'From', p_sendor);
   /*设置接收人*/
   write_data(l_conn, 'To', p_receiver);
   /*设置邮件主题*/
   select replace('=?GB2312?B?'||utl_raw.cast_to_varchar2(utl_encode.base64_encode(rawtohex(p_sub)))||'?=',utl_tcp.crlf,'')     into p_subject from dual;
   write_data(l_conn, 'Subject', p_subject);

   write_data(l_conn, 'Content-Type', multipart_mime_type);
   utl_smtp.write_data(l_conn, utl_tcp.crlf);
   utl_smtp.write_data(l_conn, first_boundary);
   write_data(l_conn, 'Content-Type', 'text/html;charset=gb2312');
   --单独空一行,否则,正文内容不显示
   utl_smtp.write_data(l_conn, utl_tcp.crlf);
   /* 设置邮件正文
     把分隔符还原成chr(10)。这主要是为了shell中调用该过程,如果有多行,则先把多行的内容合并成一行,并用 l_splite分隔
     然后用 l_crlf替换chr(10)。这一步是必须的,否则将不能发送邮件正文有多行的邮件
   */
   write_data(l_conn, '', replace(replace(p_txt, l_splite, chr(10)), chr(10), l_crlf), '', '');
   end_boundary(l_conn);

   /*关闭数据写入*/
   utl_smtp.close_data(l_conn);
   /*关闭连接*/
   utl_smtp.quit(l_conn);

end;
---------------------------------------------主过程-----------------------------------------------------
begin
l_sendoraddress := '<' || p_sendor || '>';
p_splite_str(p_receiver);--处理邮件地址
for k in 1 .. my_address_list.count loop
   p_email(l_sendoraddress, my_address_list(k));
end loop;
/*处理邮件地址,根据逗号分割邮件*/
end;

   在PL/SQL中测试一下它的性能如何:

分享到:
评论

相关推荐

    用oracle发送邮件

    在Oracle数据库环境中,发送邮件是一项常见的任务,尤其在自动化报告、报警或数据交换等场景下。Oracle提供了一种称为UTL_MAIL的内置包,用于在PL/SQL代码中实现邮件发送功能。本篇文章将深入探讨如何利用Oracle的...

    oracle邮件配置

    Oracle 邮件配置是 Oracle 应用程序中的一项重要功能,允许用户通过电子邮件发送和接收通知、报表和其他业务信息。在本文中,我们将详细介绍 Oracle 邮件配置的步骤和要点。 Oracle 邮件配置步骤 1. 登录 Oracle ...

    oracle发送邮件存储过程

    总之,Oracle发送邮件的存储过程是通过`UTL_SMTP`包与SMTP服务器通信来实现的,它允许数据库系统自动化发送邮件的任务,提高了工作效率。如果你需要调试或修改这个存储过程,确保你有合适的SMTP服务器设置,并且理解...

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能 Oracle P/L SQL实现发送Email、浏览网页等网络操作功能,以下是此过程包的头部,包体经常打包处理plb,感兴趣用户可以下载下来。 --.使用聚合函数实现 多行...

    Oracle发送SMTP邮件程序

    完全可用的oracle发邮件程序,只要编译一下就可以用

    Oracle eMail Center User Guide Release 11i

    Oracle eMail Center是Oracle公司的一款企业级电子邮件管理系统,主要用于处理和管理企业的电子邮件通信。Release 11i是该产品的一个特定版本,发布于2004年,它提供了丰富的功能和增强的性能来满足企业对高效、安全...

    jsp+oracle通讯录

    在这个项目中,开发者使用JSP作为前端展示页面,通过Servlet进行业务逻辑处理,而数据存储则依靠了强大的Oracle数据库。 JSP是Java平台上的动态网页技术,它允许开发人员在HTML代码中嵌入Java代码,从而实现动态...

    oracle10g发送email示例

    总之,通过Oracle 10g的PL/SQL过程,我们可以创建一个功能强大的电子邮件发送工具,不仅支持中文邮件和HTML格式,还能处理多个收件人。这个功能对自动化任务和通知系统非常有用,能极大地提高工作效率。在实际应用中...

    oracle 日常维护

    - **检查关于root用户和Oracle用户的email**:如果配置了邮件通知,检查是否有异常报告发送给管理员。 - **检查Oracle日志文件**:包括归档日志、重做日志、alert日志等,分析可能存在的错误或异常。 5. **常用...

    oracle存储过程实现发邮件

    oracle存储过程实现发邮件,oracle存储过程实现发邮件,oracle存储过程实现发邮件

    Python笔记 之 cx_oracle和smtp模块简单应用

    结合`cx_Oracle`和`smtp`,我们可以创建一个简单的应用程序,用于接收用户提交的数据,将其存储到Oracle数据库,并通过电子邮件将处理结果发送给用户。例如,用户通过表单提交请假申请,程序可以将申请信息存入...

    ORACLE日常巡检

    - 测试发送email以确保配置正确。 --- 以上是关于Oracle日常巡检中的一些基础检查项,这些检查可以帮助DBA及时发现并解决问题,确保Oracle数据库稳定高效地运行。接下来,我们将会进一步探讨一些高级巡检项目,如...

    email-邮件发送系统

    Web版可能是一个基于Web界面的工具,让用户通过浏览器发送和管理邮件,无需安装额外的桌面软件。 总的来说,邮件发送系统提供了一套完整的解决方案,包括批量发送、个性化营销、数据管理以及灵活的发送选项,是现代...

    mctp.zip_MCTP_oracle

    描述中提到“oracle发送邮件的存储过程很实用可以发送”,这表明压缩包中的“mctp.sql”文件可能是一个SQL脚本,用于在Oracle数据库环境中实现邮件发送功能。 在Oracle数据库中,发送邮件通常不是内置的功能,但...

    oracle巡检手册

    - **检查EMAIL设置**:确保数据库错误报警邮件能够正确发送到ROOT用户和ORACLE用户的邮箱,以便于及时获取数据库异常信息。 3. **检查ORACLE对象状态** - **检查ORACLE控制文件状态**:控制文件记录了数据库的...

    Oracle DBA日常巡检最佳实践

    **3.3 检查oracle用户的email** - **目的**:确认备份任务完成后发送的通知邮件是否到达。 - **方法**:登录oracle用户的邮箱账户,检查是否有备份任务完成的通知邮件。 #### 四、检查Oracle数据库性能(基础巡检...

    Oracle数据库日常维护方案书

    - oracle用户的email:确认备份通知是否发送成功,及时了解备份状态。 - **数据库迁移** - 针对企业未来发展的需求,提供数据库迁移方案,确保业务平滑过渡。 - **数据库运维** - **检查数据库基本状况** - ...

    Oracle数据库日常维护手册.pdf

    - **操作**:通常可以通过查看操作系统的日志文件(如Linux下的`/var/log/messages`)来监控Oracle数据库运行过程中可能遇到的问题。 - 需要定期检查这些日志文件,寻找与Oracle相关的错误或警告信息。 - 特别注意...

    博主推荐C# Winform定时发送邮箱(附源码)

    支持对oracle数据定时查询,然后把查询结果发送邮箱;2.灵活可配置,日志目录,数据库相关连接,展示的字段,展示的格式,发送的邮箱,表格的风格等; 3.可以在此基础上,支持扩展,定时查询数据(任何数据库),...

Global site tag (gtag.js) - Google Analytics