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. asp.net 发送邮件函数两则

    using System.Net.Mail; using System.Text; using System.Net; #region 邮件发送 /// <summary> /// 邮件发 ...

  2. Android Service(下)

    转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...

  3. Ext.net GridPanel获取选中行的数据

    1.前台页面 在button中添加ExtraParams   <DirectEvents> <Click> <ExtraParams> <ext:Pramet ...

  4. hdu1064Financial Management

    Problem Description Larry graduated this year and finally has a job. He’s making a lot of money, but ...

  5. 13年山东省赛 The number of steps(概率dp水题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud The number of steps Time Limit: 1 Sec  Me ...

  6. yii2安装与初始化-Yii2学习笔记(一)

    一.安装项目: 使用composer下载安装yii2 advanced安装包: composer create-project yiisoft/yii2-app-advanced advanced(自 ...

  7. Python中for\while的用法

    代码示例 board = [] for i in range(5): board.append(i) print board board = [] i = 0 while i < 5: boar ...

  8. php 去掉 头尾 空格 2种方法

    看似很简单的问题,其实还是有点坑的,首先这里 空格转义,不是字符串,直接用trim()是去不掉. 1,用preg_replace替换 $test = " dfadad 论责民与三英的关系77 ...

  9. load Event

    document.addEventListener("DOMContentLoaded");------------------load document.body.addEven ...

  10. Keil C51 与 ARM 并存方法

    第一:先安装keil C51 V4.01(如果先安装ARM的话还没有试过,应该也是可以的)到文件夹keil C51,运行破解补丁,选择C51版本,RealView MDK Professional进行 ...