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

bsd_sendemail

阅读更多

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, 'AUTHLOGIN', '');
    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,'ddMonyyhh24: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;

分享到:
评论

相关推荐

    0008-rtl_bsd_drv_v195.00.tgz

    标题中的"0008-rtl_bsd_drv_v195.00.tgz"是一个针对FreeBSD操作系统的RTL(Realtek)网卡驱动程序的压缩包,版本号为v195.00。这个文件主要是为了解决在FreeBSD 9.2版本中,系统无法识别rtl8168系列网卡的问题。rtl...

    bsd_type.h

    bsd_type.h

    BSP_Press+Temp_Demo_传感器_压力传感器86BSD_DEMO_86BSD_

    总的来说,"BSP_Press+Temp_Demo_传感器_压力传感器86BSD_DEMO_86BSD"项目提供了一个完整的压力和温度监测解决方案,涵盖了从硬件接口到软件驱动,再到数据处理的全链条。这对于任何需要压力和温度测量的系统设计者...

    BSD_ROOTKIT设计

    BSD_ROOTKIT设计 BSD_ROOTKIT设计

    BSD_贝叶斯逐步判别_BSD_

    **BSD(贝叶斯逐步判别)是一种统计分析方法,常用于分类问题,特别是当数据具有多类别的特征时。该方法基于贝叶斯定理,通过逐步选择最能区分不同类别的特征来构建判别模型。在本资料中,作者提供了一个名为“BSD.m...

    _bsd_types.h

    _bsd_types.h

    xc2s_ibis.zip__1532.bsd_ibis_ibis xilinx_xilinx IBIS模型

    标题中的“xc2s_ibis.zip__1532.bsd_ibis_ibis xilinx_xilinx IBIS模型”提到了“xc2s”,这代表Xilinx公司的Spartan系列FPGA,具体是Spartan-2系列。"ibis"指的是IBIS(Input/Output Buffer Information ...

    BSD_ixp400AccessLibrary-3_0_1.zip_zip

    【标题】"BSD_ixp400AccessLibrary-3_0_1.zip" 提供的是一种针对IXP400处理器的访问库,版本为3.0.1,该库可能用于开发或维护基于BSD(Berkeley Software Distribution)操作系统的嵌入式系统。在这一版本中,开发者...

    2.11BSD_X44:2.11BSD_X44。 一个实现4.4BSD(Lite 2)vm和vnodes的2.11BSD

    2.11BSD_X44(TBA) 2.11BSD在BSD的历史上是独一无二的,直到最近十年,它仍在收到其代码库的补丁程序。 也是唯一一个接收从4BSD的多个版本反向移植的补丁程序的BSD。 2.11BSD_X44是2.11BSD并延续了这一传统。 用...

    [4.4BSD].The.Design.and.Implementation.of.the.4.4B_4.4BSD_bsd 4.

    4.4BSD操作系统设计与实现,值得研究

    FreeBSD_Manual.rar_BSD_freebsd_linux manual

    FreeBSD 中文使用手册 本手册适用于安装 FreeBSD 5.4-RELEASE 和 FreeBSD 6.0-RELEASE 以及它们的日常使用。

    unix_bsd_linux文件系统结构图.png

    此文件对您来说没那么重要,请不要下载,仅仅为了积分上传,

    freebsd.tar.gz_BSD_FreeBSD内核源码_freebsd source_freebsd.tar_linux

    FreeBSD的内核架构基于Berkeley Software Distribution (BSD)系统,它的设计目标是提供高性能、可移植性和可靠性。内核主要由以下几个部分组成: - **调度器**:负责进程的调度,确保系统资源的公平分配。 - **内存...

    PC-BSD_+9.1+用户手册

    PCBSD是基于freebsd的以桌面应用为目的的操作系统,...为解决bsd安装软件的难题,除了与原有的 FreeBSD Ports 系统相容外,pcbsd开发了一种全新的方式,PBI,通过PBI安装软件跟windows中一样,只需要双击就可以了。

    oracle10g发送email示例

    代码如下: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’;...

    socket_4.4BSD_Lite:套接字

    socket_4.4BSD_Lite 套接字源码

    BSD68,BSD100.rar

    BSD68和BSD100是两个在计算机视觉和图像处理领域中广泛使用的数据集,尤其在深度学习的训练和评估中占据重要地位。这两个数据集由加利福尼亚大学伯克利分校的研究人员创建,因此通常被称为Berkeley Segmentation ...

    bsd-mailx_8.1.2-0.20071201cvs-3_i386.deb mailx_20071201-3_all.deb

    标题中的"bsd-mailx_8.1.2-0.20071201cvs-3_i386.deb"和"mailx_20071201-3_all.deb"指的是两个不同的邮件处理软件的 Debian 包。`bsd-mailx` 是一个基于 BSD 的邮件传输代理,而 `mailx` 是一个命令行接口的邮件...

    bsdl.rar_BSD\L_bsdl_bsdl下载网

    【BSD\L_bsdl_bsdl下载网】是一个与编程相关的压缩包,主要包含源代码文件,用于在Basic语言环境中测试BGA(Ball Grid Array)技术。这个压缩包的名称"bsdl.rar"暗示了它可能与某种名为"BSDL"(可能是"Ball Grid ...

Global site tag (gtag.js) - Google Analytics