Plsql PL/SQL-使用utl\U smtp发送西里尔字符

Plsql PL/SQL-使用utl\U smtp发送西里尔字符,plsql,utf-8,Plsql,Utf 8,在我的例子中,我使用NVARCHAR2列在Oracle 11g db中存储和检索西里尔字符(参见下面的一个简单示例) 我现在的目标是使用NVARCHAR2列准备并发送一封使用UTL_SMTP的电子邮件 我发现有几个帖子与类似的东西相关,但没有一个是有效的(即:) 我收到的电子邮件中总是有转换问题。 是否有人也有同样的需求并找到了解决方案?经过几天的工作和大量的谷歌搜索,我找到了适合我的解决方案。 代码如下: create or replace procedure pr_send_mail_by_

在我的例子中,我使用NVARCHAR2列在Oracle 11g db中存储和检索西里尔字符(参见下面的一个简单示例)

我现在的目标是使用NVARCHAR2列准备并发送一封使用UTL_SMTP的电子邮件

我发现有几个帖子与类似的东西相关,但没有一个是有效的(即:)

我收到的电子邮件中总是有转换问题。
是否有人也有同样的需求并找到了解决方案?

经过几天的工作和大量的谷歌搜索,我找到了适合我的解决方案。 代码如下:

create or replace procedure pr_send_mail_by_rawdata(p_subject nvarchar2, p_body nvarchar2) as
   lv_server  varchar2(255) := 'localhost';
   lv_rcpt    varchar2(255) := 'you@gmail.com';
   lv_from    varchar2(255) := 'me <me@gmail.com>';
   lv_subject varchar2(4000):= 'cyrillic';

   lv_conn    utl_smtp.connection;
begin
   lv_conn := utl_smtp.open_connection(lv_server);
   UTL_SMTP.helo (lv_conn, lv_server);
   UTL_SMTP.mail (lv_conn, lv_from);
   UTL_SMTP.rcpt (lv_conn, lv_rcpt);
   UTL_SMTP.open_data (lv_conn);

   UTL_SMTP.WRITE_DATA(lv_conn, 'From' || ': ' || lv_from || UTL_TCP.CRLF);
   UTL_SMTP.WRITE_DATA(lv_conn, 'To' || ': ' || lv_rcpt || UTL_TCP.CRLF);



   lv_subject := '=?UTF8?Q?'||replace(utl_encode.TEXT_ENCODE(p_subject,'UTF8'),'='||chr(13) || chr(10)) || '?=';
   UTL_SMTP.write_raw_data(lv_conn, utl_raw.cast_to_raw('Subject' || ': ' || lv_subject||utl_tcp.crlf ));


   utl_smtp.write_data(lv_conn, 'MIME-version: 1.0' || utl_tcp.CRLF);
   utl_smtp.write_data(lv_conn, 'Content-Type: text/html; charset=KOI8-R;'||utl_tcp.CRLF);
   utl_smtp.write_data(lv_conn, 'Content-Transfer-Encoding: QUOTED-PRINTABLE'||utl_tcp.CRLF);
   utl_smtp.write_data(lv_conn, utl_encode.TEXT_ENCODE(p_body,'CL8KOI8R'));     
   utl_smtp.write_data(lv_conn, utl_tcp.crlf);      
   utl_smtp.close_data(lv_conn);
   utl_smtp.quit(lv_conn);
end;
创建或替换过程pr_send_mail_by_rawdata(p_subject nvarchar2,p_body nvarchar2)作为
lv_服务器varchar2(255):='localhost';
lv_rcpt varchar2(255):='you@gmail.com';
来自varchar2的lv_(255):=“我”;
lv_subject varchar2(4000):=“西里尔语”;
lv_连接utl_smtp.connection;
开始
lv_连接:=utl_smtp.打开_连接(lv_服务器);
UTL_SMTP.helo(lv_连接,lv_服务器);
UTL_SMTP.mail(lv_conn,lv_from);
UTL_SMTP.rcpt(lv_连接,lv_rcpt);
UTL_SMTP.open_数据(lv_连接);
UTL|U SMTP.WRITE|U数据(lv|u conn,'From'| |':'| | lv| u From | | UTL|u TCP.CRLF);
UTL|U SMTP.写入|U数据(lv|conn,'至'| |':'| | lv|U rcpt | | UTL|U TCP.CRLF);
lv|U主题:='=?UTF8?Q?'|替换(utl|U编码。文本|U编码(p|U主题,'UTF8'),'='| chr(13)| | chr(10))| |?=';
UTL|U SMTP.写入原始数据(lv|U conn,UTL|U raw.cast|U to|U raw('Subject'| |':'| | lv| U Subject | | UTL|U tcp.crlf));
utl_smtp.write_数据(lv_conn,“MIME版本:1.0”| | utl_tcp.CRLF);
utl_smtp.write_数据(lv_conn,'Content Type:text/html;charset=KOI8-R;'| | utl_tcp.CRLF);
utl_smtp.write_数据(lv_conn,“内容传输编码:QUOTED-PRINTABLE”| utl_tcp.CRLF);
utl_smtp.write_数据(lv_conn,utl_encode.TEXT_encode(p_body,'CL8KOI8R'));
utl_smtp.write_数据(lv_conn,utl_tcp.crlf);
utl_smtp.close_数据(lv_连接);
utl_smtp.quit(lv_conn);
结束;
两件事的管理方式不同:

  • 主题: 文本转换为utf8格式
  • 该机构: 文本转换为KOI8-R(字符集:CL8KOI8R)
  • create or replace procedure pr_send_mail_by_rawdata(p_subject nvarchar2, p_body nvarchar2) as
       lv_server  varchar2(255) := 'localhost';
       lv_rcpt    varchar2(255) := 'you@gmail.com';
       lv_from    varchar2(255) := 'me <me@gmail.com>';
       lv_subject varchar2(4000):= 'cyrillic';
    
       lv_conn    utl_smtp.connection;
    begin
       lv_conn := utl_smtp.open_connection(lv_server);
       UTL_SMTP.helo (lv_conn, lv_server);
       UTL_SMTP.mail (lv_conn, lv_from);
       UTL_SMTP.rcpt (lv_conn, lv_rcpt);
       UTL_SMTP.open_data (lv_conn);
    
       UTL_SMTP.WRITE_DATA(lv_conn, 'From' || ': ' || lv_from || UTL_TCP.CRLF);
       UTL_SMTP.WRITE_DATA(lv_conn, 'To' || ': ' || lv_rcpt || UTL_TCP.CRLF);
    
    
    
       lv_subject := '=?UTF8?Q?'||replace(utl_encode.TEXT_ENCODE(p_subject,'UTF8'),'='||chr(13) || chr(10)) || '?=';
       UTL_SMTP.write_raw_data(lv_conn, utl_raw.cast_to_raw('Subject' || ': ' || lv_subject||utl_tcp.crlf ));
    
    
       utl_smtp.write_data(lv_conn, 'MIME-version: 1.0' || utl_tcp.CRLF);
       utl_smtp.write_data(lv_conn, 'Content-Type: text/html; charset=KOI8-R;'||utl_tcp.CRLF);
       utl_smtp.write_data(lv_conn, 'Content-Transfer-Encoding: QUOTED-PRINTABLE'||utl_tcp.CRLF);
       utl_smtp.write_data(lv_conn, utl_encode.TEXT_ENCODE(p_body,'CL8KOI8R'));     
       utl_smtp.write_data(lv_conn, utl_tcp.crlf);      
       utl_smtp.close_data(lv_conn);
       utl_smtp.quit(lv_conn);
    end;