文档章节

利用utl_smtp从oracle数据库发送带blob附件的电子邮件

adamduan
 adamduan
发布于 2016/12/12 13:11
字数 733
阅读 60
收藏 0

在之前的《利用utl_smtp从oracle数据库发送电子邮件》一文中,我们讨论了如何利用utl_smtp代码从oraclepl/sql应用程序中发送超文本模式的电子邮件。本文将继续深入探讨如何利用另外一种方法扩展这个程序包,使之能够在发送的电子邮件中加载二进制大对象(blob)附件。这里以最常用的pdf文件为例,看看如何把存储在数据库中的pdf文件发送给不同的收信人。

  首先,需要把方法函数添加到包头说明里,以便其他的程序包能够调用:

 

  procedure send_blob ( 
p_sender varchar2, 
p_recipient varchar2, 
p_subject varchar2, 
p_filename varchar2, 
p_blob blob);

 

  接下来把实际的方法函数插入到包体里:

 

procedure send_blob (

      p_sender varchar2,

      p_recipient varchar2,

      p_subject varchar2,

      p_filename varchar2,

      p_blob blob) is     

 

    c utl_smtp.connection;

    v_raw raw(57);

    v_length integer := 0;

    v_buffer_size integer := 57;

    v_offset integer := 1;     

 

  begin     

 

    common(p_sender, p_recipient, p_subject, c); 

 

    utl_smtp.write_data( c, 'content-disposition: attachment; filename="' || p_filename || '"' || utl_tcp.crlf);

    utl_smtp.write_data( c, 'content-transfer-encoding: base64' || utl_tcp.crlf );

    utl_smtp.write_data( c, utl_tcp.crlf );     

 

    v_length := dbms_lob.getlength(p_blob);     

 

    <<while_loop>>

    while v_offset < v_length loop

      dbms_lob.read( p_blob, v_buffer_size, v_offset, v_raw );

      utl_smtp.write_raw_data( c, utl_encode.base64_encode(v_raw) );

      utl_smtp.write_data( c, utl_tcp.crlf );

      v_offset := v_offset + v_buffer_size;

    end loop while_loop;

 

    utl_smtp.write_data( c, utl_tcp.crlf );

    utl_smtp.close_data( c );

    utl_smtp.quit( c );

 

  exception

    when utl_smtp.transient_error or utl_smtp.permanent_error then

      utl_smtp.quit( c );

      raise;

    when others then

    raise;

  end send_blob;

 

利用utl_smtp从oracle数据库发送带blob附件的电子邮件第2部分:(电脑编程网整理,请尊重作者权益,转载注明出处;)

  代码注释

  上述代码要求必须为实际上传的blob对象添加一个文件名(filename),而且必须确认该文件名扩展名正确,这样在网络另一端的电子邮件客户才有可能正确地打开这个对象文件。也就是说,在本例中blob对象是一份pdf文件,所以其上传的文件名必须是abc.pdf这种格式才行。

  你可能发现,在上面的方法函数中,没有发送主体部分(body)。这里只是为了把大家的视线集中在blob附件的发送上面,所以吧邮件主体部分省略掉。如果你需要发送邮件主体部分,完全可以把包含邮件主体的代码添加进去。

  方法函数中奇怪的while loop语句

 

  <<while_loop>>

    while v_offset < v_length loop

      dbms_lob.read( p_blob, v_buffer_size, v_offset, v_raw );

      utl_smtp.write_raw_data( c, utl_encode.base64_encode(v_raw) );

      utl_smtp.write_data( c, utl_tcp.crlf );

      v_offset := v_offset + v_buffer_size;

    end loop while_loop;

 

  为了使utl_encode包运行,缓冲区的大小必须是57,这就是为什么我们要使用loop循环执行,并把blob文件截断称57字节大小片断。这个过程把blob对象转换成原始二进制格式,然后把这些57字节长短的片断发送到电子邮件流中,并在每个57字节片断后添加一个行尾符。

  只要你掌握了utl_smtp的基础用法,在里面加上一个附件并不成问题,赶快实践一下吧。

本文转载自:http://biancheng.dnbcw.info/oracle/42197.html

上一篇: mysql 密码重置
adamduan
粉丝 10
博文 84
码字总数 8447
作品 0
大连
程序员
私信 提问
Python_014 SMTP发邮件

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 python的smtplib提供了一种很方便的途径发送电子邮件...

g00m
2015/02/21
851
0
Windows Azure Cloud Service (27) 在Windows Azure发送邮件(上)

 《Windows Azure Platform 系列文章目录》   许多Web应用都具有发送邮件通知的功能,不管是作为用户注册流程的一部分,还是通知用户一系列重要事件的发生。如果您是一个.NET的开发人员,...

zting科技
2017/04/30
0
0
python模块学习 ---- smtplib 邮件发送

在基于互联网的应用中,程序经常需要自动地发送电子邮件。如:一个网站的注册系统会在用户注册时发送一封邮件来确认注册;当用户忘记登陆密码的时候,通过邮件来取回密码。smtplib模块是pyt...

taote
2013/05/08
213
0
python 利用smtplib发邮件

!/usr/bin/env python import smtplib TO = "to**@sina.com" FROM = "from**@qq.com" PSW = "**" Serveraddr = "smtp.qq.com" msg = ["From: %s"% FROM, "To: %s"% TO, "Subject: just for t......

charlesdong1989
2012/03/19
220
0
Oracle 存储过程发邮件

在 Oracle 的运维过程中,常常需要监控任务执行情况,这时候如果用 Java 或 Python 都可以自定义一个发邮件提醒的功能,但如果能调用 Oracle 自带的的一些包来实现邮件提醒,不仅调用方便,而...

DreamOver
2017/07/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部