使用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 default null,
    p_smtp_hostname in varchar2,
    p_smtp_portnum  in varchar2)
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;
begin
    l_connection := utl_smtp.open_connection( p_smtp_hostname, p_smtp_portnum );
    utl_smtp.helo( l_connection, p_smtp_hostname );
    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   := ‘--‘ || 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 final html boundary
    l_temp   := 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_data(l_connection,
        --                    dbms_lob.substr(l_body_html,l_ammount,l_offset));
        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.close_data(l_connection);
    utl_smtp.quit( l_connection );
    dbms_lob.freetemporary(l_body_html);
end;
/
show errors
时间: 2024-12-04 22:55:10

使用UTL_SMTP发送中文电子邮件的相关文章

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

使用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

Servlet向客户端发送中文数据的编码情况

(更多内容请关注本人微信订阅号:it_pupil) 本文讲述服务端servlet向客户端浏览器发送中文数据的编码情况,需要抓住下面几点: 输出流发送数据,必须是以字节形式传输的.也就是说,如果你在服务端定义一个字符串,那么servlet要先编码成字节数组,再发送到客户端. 客户端浏览器在收到字节码数据时,需要将其解码成字符串显示出来. 在服务端,如果你使用的是字节流,那么只需要注意两点:  拿到字符串,以特定形式编码成字节数组(如UTF-8).(字节数组是你人工转换的) 告诉浏览器,以相同方式解

ADB 发送中文短信

最近好多朋友说adb 不支持发送中文的短信,也不知道为啥要用adb 来发送短信,昨天想到这个问题,所以修改了一下自己的adb,支持发送中文的短信了. adb shell am start -a android.intent.action.SENDTO -d sms:10086 --es sms_body 中文 下载地址: http://bcs.duapp.com/myandroidtools/AndroidAdb.exe 只公开可执行程序,不公开源代码,喷子们看清楚,不要乱喷. 需要更详细的可以

如何使用短信猫发送中文短信

使用短信猫收发短信,原理是通过串口通信发送AT指令.当你发送中文短信时,你会又喜悦又困惑,短信确实收到了,但是是乱码的.本文介绍如何正确发送中文短信. AT AT\r\r\nOK\r\n 设置modem为SMS text mode AT+CMGF=1<ENTER> AT+CMGF=1\r\r\r\nOK\r\n 查询当前参数 AT+CSMP?<ENTER> AT+CSMP?\r\r\r\n+CSMP:1,167,0,0\r\n\r\nOK\r\n displays the code

C# Socket的方式发送中文,接收方收到乱码

场景: 使用 Socket的方式向下位机发送中文信息,下位机收到的中文是乱码 原因: 了解到的原因是上位机与下位机的发送与接收的编码与解码方式不一致 比如上位机采用 Encoding.UTF8.GetBytes()的方式编码发送信息 下位机采用 Encoding.Default.GetString()的方式解码的方式收信息 一个用UTF8,一个使用Default就出现了编码与解码的不一致,导致下位机收到乱码的信息. 此时改变上位机或下位机的编码.解码方式,保持两者的一致性就可解决. 解决: 方案

MVC 解决方案: 页面在 IE 浏览器发送中文查询字符串时乱码

今天参照 MvcMusicStore 的教程开始学习 MVC. 在 Browse 页面中我尝试以中文发送查询字符串, 结果得到乱码. 遇到问题我就查资料, 结果查到很多方法, 最主流的方法是往 Web.Config 里加入 <globalization requestEncoding="gbk" responseEncoding="gbk" culture="zh-CN" fileEncoding="gbk" />

UDP发送中文

procedure TForm1.SpeedButton1Click(Sender: TObject); begin udp.Send('localhost', 1234, 'abc123'); // 发送字符, 这样发中文接收方会乱码 end; procedure TForm1.SpeedButton2Click(Sender: TObject); var b: TBytes; s: string; begin s := '你好'; b := BytesOf(s); udp.SendBuffe

Yii Swiftmailer 发送中文附件

所用的是Yii2 的basic框架.它本身集成了邮件发送插件swiftmailer,发送邮件是很方便的,但是当发送的邮件带有中文名称的附件时,就出现了问题,邮件所带的附件显示名称错误.比如原名"测试.doc"的附件,发出来后看到的名字只有".doc". 这是因为swiftmailer中使用的一个basename()函数不支持中文. 对于basic版本框架,路径在/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mim