CREATE OR REPLACE PROCEDURE SCOTT.HTML_EMAIL(
P_TO IN VARCHAR2, --收件人地址
P_SUBJECT IN VARCHAR2, --邮件主题
P_HTML IN VARCHAR2 DEFAULT NULL--邮件内容支持HTML代码
)
IS
L_BOUNDARY VARCHAR2(255) DEFAULT 'a1b2c3d4e3f2g1';
L_CONNECTION UTL_SMTP.CONNECTION;
L_BODY_HTML CLOB := EMPTY_CLOB; --THIS LOB WILL BE THE EMAIL MESSAGE
L_OFFSET NUMBER;
L_AMMOUNT NUMBER;
L_TEMP VARCHAR2(32767) DEFAULT NULL; L_ACCOUNT VARCHAR2(100);
L_PASSWORD VARCHAR2(100); P_FROM VARCHAR2(200);
P_TEXT VARCHAR2(200);
P_SMTP_HOSTNAME VARCHAR2(200);
P_SMTP_PORTNUM VARCHAR2(200);
BEGIN P_FROM:='test@163.com'; --发件人地址
P_SMTP_HOSTNAME:='smtp.163.com'; --smtp服务器
P_SMTP_PORTNUM:='25'; --smtp服务器端口号
L_ACCOUNT:='test@163.com';--登录服务器用账号
L_PASSWORD:='123456'; --登录服务器密码 P_TEXT:='there is no text'; L_CONNECTION := UTL_SMTP.OPEN_CONNECTION(P_SMTP_HOSTNAME,25);
UTL_SMTP.ehLO(L_CONNECTION,P_SMTP_HOSTNAME); --问候服务器,注意此用用了EHLO,没有使用HELO --输入用户名密码
utl_smtp.command(l_connection, 'AUTH LOGIN ');
utl_smtp.command(l_connection, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(L_ACCOUNT))));
utl_smtp.command(l_connection,utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(L_PASSWORD)))); UTL_SMTP.MAIL(L_CONNECTION, '<' || P_FROM|| '>'); --发件人信息
UTL_SMTP.RCPT(L_CONNECTION, '<' || P_TO|| '>'); --收件人地址
--记得在地址两边加<>,否则可能会报错 L_TEMP := L_TEMP || 'MIME-Version: 1.0 ' || CHR(13) || CHR(10);
L_TEMP := L_TEMP || 'To: ' || P_TO || CHR(13) || CHR(10);
L_TEMP := L_TEMP || 'From: ' || P_FROM || CHR(13) || CHR(10);
L_TEMP := L_TEMP || 'Subject: ' || P_SUBJECT || CHR(13) || CHR(10);
L_TEMP := L_TEMP || 'Reply-To: ' || P_FROM || CHR(13) || CHR(10);
L_TEMP := L_TEMP || 'Content-Type: multipart/alternative; boundary= '|| CHR(34)||L_BOUNDARY||CHR(34)||CHR(13)||CHR(10); ----------------------------------------------------
-- WRITE THE HEADERS --写入头信息
DBMS_LOB.CREATETEMPORARY(L_BODY_HTML,FALSE,10);
DBMS_LOB.WRITE(L_BODY_HTML,LENGTH(L_TEMP),1,L_TEMP); -- ----------------------------------------------------
-- -- WRITE THE TEXT BOUNDARY
-- L_OFFSET:=DBMS_LOB.GETLENGTH(L_BODY_HTML) +1;
-- L_TEMP:= CHR(13)||CHR(10)||'-- '||L_BOUNDARY||CHR(13)||CHR(10);
-- L_TEMP:= L_TEMP||'Content-Type:text/plain;charset=us-ascii'||CHR(13)||CHR(10)||CHR(13)||CHR(10);
-- DBMS_LOB.WRITE(L_BODY_HTML,LENGTH(L_TEMP),L_OFFSET,L_TEMP); -- ----------------------------------------------------
-- -- WRITE THE PLAIN TEXT PORTION OF THE EMAIL
-- L_OFFSET := DBMS_LOB.GETLENGTH(L_BODY_HTML) + 1;
-- DBMS_LOB.WRITE(L_BODY_HTML,LENGTH(P_TEXT),L_OFFSET,P_TEXT); ----------------------------------------------------
-- WRITE THE HTML BOUNDARY
L_TEMP := CHR(13)||CHR(10)||CHR(13)||CHR(10)|| '--' ||L_BOUNDARY|| CHR(13)||CHR(10);
L_TEMP := L_TEMP||'Content-Type:text/html; '|| CHR(13)||CHR(10)||CHR(13)||CHR(10);
L_OFFSET := DBMS_LOB.GETLENGTH(L_BODY_HTML) + 1;
DBMS_LOB.WRITE(L_BODY_HTML,LENGTH(L_TEMP),L_OFFSET,L_TEMP); ----------------------------------------------------
-- WRITE THE HTML PORTION OF THE MESSAGE
L_OFFSET := DBMS_LOB.GETLENGTH(L_BODY_HTML) + 1;
DBMS_LOB.WRITE(L_BODY_HTML,LENGTH(P_HTML),L_OFFSET,P_HTML); ----------------------------------------------------
-- WRITE THE test vale
-- L_TEMP :='我是中国人';
-- L_OFFSET := DBMS_LOB.GETLENGTH(L_BODY_HTML) + 1;
-- DBMS_LOB.WRITE(L_BODY_HTML,LENGTH(L_TEMP),L_OFFSET,L_TEMP); ----------------------------------------------------
-- WRITE THE FINAL HTML BOUNDARY
-- L_TEMP :=CHR(13)||CHR(10) ||CHR(13)||CHR(10) || '-- '|| L_BOUNDARY|| '-- '||CHR(13);
-- L_OFFSET :=DBMS_LOB.GETLENGTH(L_BODY_HTML) + 1;
-- DBMS_LOB.WRITE(L_BODY_HTML,LENGTH(L_TEMP),L_OFFSET,L_TEMP); ----------------------------------------------------
-- SEND THE EMAIL IN 1900 BYTE CHUNKS TO UTL_SMTP
L_OFFSET:= 1;
L_AMMOUNT:= 1900;
UTL_SMTP.OPEN_DATA(L_CONNECTION);
WHILE L_OFFSET < DBMS_LOB.GETLENGTH(L_BODY_HTML) LOOP
UTL_SMTP.WRITE_RAW_DATA(L_CONNECTION,UTL_RAW.cast_to_raw(DBMS_LOB.SUBSTR(L_BODY_HTML,L_AMMOUNT,L_OFFSET)));
L_OFFSET:= L_OFFSET+L_AMMOUNT ;
L_AMMOUNT:= LEAST(1900,DBMS_LOB.GETLENGTH(L_BODY_HTML)- L_AMMOUNT);
END LOOP; -- UTL_SMTP.write_raw_data(L_CONNECTION, UTL_RAW.cast_to_raw('我是中国人'));
UTL_SMTP.CLOSE_DATA(L_CONNECTION);
UTL_SMTP.QUIT(L_CONNECTION);
-- dbms_output.put_line(DBMS_LOB.SUBSTR(L_BODY_HTML,DBMS_LOB.GETLENGTH(L_BODY_HTML),1));
DBMS_LOB.FREETEMPORARY(L_BODY_HTML);
dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||'发送邮件成功!!!');
exception
when others then
dbms_output.put_line(dbms_utility.format_error_stack);
dbms_output.put_line(dbms_utility.format_call_stack);
dbms_output.put_line(sqlerrm);
END;
/

http://blog.csdn.net/blaider/article/details/5672729

Oracle 10G 使用UTL_SMTP发送中文电子邮件[Z]的更多相关文章

  1. 使用UTL_SMTP发送中文电子邮件

    就是在原有TOM源码的基础上修改utl_smtp.write_data中,将输出内容进行一下数据转换,这样可以保证中文输出不会出现乱码 ----------------------------- cr ...

  2. 使用UTL_SMTP发送中文邮件及使用UTL_TCP从附件服务器获取中文附件

    先上最重要的干货 发送邮件正文及主题的时候一定要使用convert重新编码 主题: utl_smtp.write_raw_data(l_mail_conn, utl_raw.cast_to_raw(c ...

  3. 利用Oracle数据库的UTL_SMTP发送HTML 邮件

    Ok, that looks hard, but if you use this procedure I wrote, its really quite easy, it does all of th ...

  4. CentOS 6.3(x86_64)下安装Oracle 10g R2

    目 录 一.硬件要求二.软件三.系统安装注意四.安装Oracle前的系统准备工作五.安装Oracle,并进行相关设置六.升级Oracle到patchset 10.2.0.4七.使用rlwrap调用sq ...

  5. 【转】CentOS 6.3(x86_64)下安装Oracle 10g R2

    目 录 一.硬件要求二.软件三.系统安装注意四.安装Oracle前的系统准备工作五.安装Oracle,并进行相关设置六.升级Oracle到patchset 10.2.0.4七.使用rlwrap调用sq ...

  6. 【转】CentOS 6.3(x86_32)下安装Oracle 10g R2

    一.硬件要求 1.内存 & swap Minimum: 1 GB of RAMRecommended: 2 GB of RAM or more 检查内存情况 # grep MemTotal / ...

  7. CentOS 6.3(x86_32)下安装Oracle 10g R2

    一.硬件要求 1.内存 & swap Minimum: 1 GB of RAMRecommended: 2 GB of RAM or more 检查内存情况 # grep MemTotal / ...

  8. CentOS 6.5(x86_32)下安装Oracle 10g R2

    一.硬件要求 1.内存 & swap Minimum: 1 GB of RAMRecommended: 2 GB of RAM or more 检查内存情况 # grep MemTotal / ...

  9. 08.安装Oracle 10g和SQLServer2008(仅作学习使用VirtualBox虚拟机来安装节省电脑资源)

    1.虚拟机和宿主机共享文件夹. 2.右ctrl+F切换VirtualBox全屏 3.安装Oracle 10g 4.输入密码:root------------>下一步 5.勾选网络配置" ...

随机推荐

  1. oracle 两个时间相减

    oracle 两个时间相减默认的是天数 oracle 两个时间相减默认的是天数*24 为相差的小时数 oracle 两个时间相减默认的是天数*24*60 为相差的分钟数 oracle 两个时间相减默认 ...

  2. JAVA按字节读取文件

    JAVA的IO流一直都是我比较头疼的部分(我没有系统学过JAVA,一般需要实现什么功能再去看文档). 最近遇到一个需求:一个字节一个字节地读取一个文件.网上很多方法,代码一大堆.我在这里和大家分享一个 ...

  3. SPOJ 4206 Fast Maximum Matching (二分图最大匹配 Hopcroft-Carp 算法 模板)

    题目大意: 有n1头公牛和n2头母牛,给出公母之间的m对配对关系,求最大匹配数.数据范围:  1 <= n1, n2 <= 50000, m <= 150000 算法讨论: 第一反应 ...

  4. css 实现进度条

    <select id="progress" onchange="changeProgress(this)"> <option value=&q ...

  5. Memcache入门知识

    Memcache适合做缓存,是一款管理内存的很小的软件,实现对内存数据的管理,一般我们用memcache存储临时数据,因为内存不能储存永久化的数据,内存里面的数据,断电就消失了. memcache可以 ...

  6. JVM学习积累

    1. Java代码编译和执行的整个过程包含了三个重要的机制: Java源码编译机制 类加载机制 类执行机制 2. 关于Java源码编译机制 Java源码编译由以下三个过程组成: 分析和输入符号表 注解 ...

  7. 关于安卓的log学习

    什么时候会产生log文件? 1. 程序异常退出 Uncaused Exception. 2. 程序强制关闭 Force Closed(FC). 3. 程序无响应 Application No Resp ...

  8. python笔记之提取网页中的超链接

    python笔记之提取网页中的超链接 对于提取网页中的超链接,先把网页内容读取出来,然后用beautifulsoup来解析是比较方便的.但是我发现一个问题,如果直接提取a标签的href,就会包含jav ...

  9. ubuntu下安装fiddler

    因为工作中需要用到fiddler工具  现在工作环境迁移到ubuntu14 下  发现fiddler只支持windows网上也有很多推荐 号称可以代替fiddler   但因为功能使用上比较习惯  并 ...

  10. stopWeblogic时提示错误以及无法关闭服务

    执行: y@y:~/oracle/middleware/user_projects/domains/yshy_domain/bin$ ./stopWebLogic.sh 错误信息如下: Stoppin ...