Oracle 10G 使用UTL_SMTP发送中文电子邮件[Z]

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:=‘[email protected]‘; --发件人地址
        P_SMTP_HOSTNAME:=‘smtp.163.com‘; --smtp服务器
        P_SMTP_PORTNUM:=‘25‘;                    --smtp服务器端口号
        L_ACCOUNT:=‘[email protected]‘;--登录服务器用账号
        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

时间: 2024-11-08 16:43:24

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

使用UTL_SMTP发送中文电子邮件

就是在原有TOM源码的基础上修改utl_smtp.write_data中,将输出内容进行一下数据转换,这样可以保证中文输出不会出现乱码 ----------------------------- create or replace procedure html_email( p_to in varchar2, p_from in varchar2, p_subject in varchar2, p_text in varchar2 default null, p_html in varchar2

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

先上最重要的干货 发送邮件正文及主题的时候一定要使用convert重新编码 主题: utl_smtp.write_raw_data(l_mail_conn, utl_raw.cast_to_raw(convert('Subject:' || p_subject || utl_tcp.crlf, 'ZHS16GBK'))); 正文内容: utl_smtp.write_raw_data(l_mail_conn, utl_raw.cast_to_raw(convert(p_text_msg, 'ZHS

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

Ok, that looks hard, but if you use this procedure I wrote, its really quite easy, it does all of the work for you: create or replace procedure html_email( p_to in varchar2, p_from in varchar2, p_subject in varchar2, p_text in varchar2 default null,

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

一.硬件要求 1.内存 & swap Minimum: 1 GB of RAMRecommended: 2 GB of RAM or more 检查内存情况 # grep MemTotal /proc/meminfo # grep SwapTotal /proc/meminfo 2.硬盘 由于CentOS安装后差不多有4~5G,再加上Oracle等等的安装,所以请准备至少10G的硬盘空间. 检查磁盘情况 # df -h 二.软件 系统平台:CentOS 6.3(x32) CentOS-6.3-i

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

目 录 一.硬件要求二.软件三.系统安装注意四.安装Oracle前的系统准备工作五.安装Oracle,并进行相关设置六.升级Oracle到patchset 10.2.0.4七.使用rlwrap调用sqlplus中历史命令 一.硬件要求 1.内存 & swap Minimum: 1 GB of RAMRecommended: 2 GB of RAM or more 检查内存情况 # grep MemTotal /proc/meminfo # grep SwapTotal /proc/meminfo

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

1.虚拟机和宿主机共享文件夹. 2.右ctrl+F切换VirtualBox全屏 3.安装Oracle 10g 4.输入密码:root------------>下一步 5.勾选网络配置"用户已验证" 6.出现概要预览--------->直接点击"安装" 7.等待...出现如下界面后点击"口令管理" 8.解锁两个账户,并创建密码.scott/tiger  sys/root HR/hr----------->确定----------&

配置ORACLE 10g或11g绿色版客户端和PLSQL环境

 本方法是通过使用ORACLE官方提供的精简版客户端,即绿色免安装的客户端. 下载地址(此处提供的是官方各版本下载地址): Windows 32位系统中使用的客户端下载地址 其他系统环境中使用的客户端下载地址 Instant client的版本很多:主要是Basic和Basic Lite. Basic版本包括了所有的支持运行OCI.OCCI.JDBC.JDBC-OCI的文件,支持多种语言. Basic Lite是Basic版本的精简版,只包括了英文的错误描述,也只支持Unicode.ASCII和

Install Oracle 10g on Red Hat Linux 5.3 Step by Step

一.虚拟机配置 1. 虚拟机(VBox 4.3.12) 2. 配置虚拟机网卡网络,选择host-only,VirtualBox Host-Only Network网卡IP为设置为192.168.1.100 二.安装RedHat 5.3操作系统(序列号:9f3013459b745c13) 具体过程略,注意在自定义软件包那里选择现在配置,选取"开发工具"."旧的开发工具"."X工具"下所有包即可 三.系统环境配置 1.配置网卡 [[email pro

Oracle 10g 物理Dataguard日常操作维护(二)

3.3进程日志的监控操作 3.3.1 查看备库进程状态 SQL>select process,client_process,sequence#,status from v$managed_standby PROCESS   CLIENT_P  SEQUENCE#    STATUS ---------       --------     ---------- -      ----------- ARCH      ARCH            153       CLOSING ARCH