【问题标题】:Oracle9i send HTML email with specific charactersOracle9i 发送带有特定字符的 HTML 电子邮件
【发布时间】:2016-12-11 18:44:01
【问题描述】:

上下文:我正在尝试使用 Oracle 过程(仅 html/text,而不是 text/plain)发送邮件。 我使用 Oracle 9i

问题:当html消息中包含é(é)这样的字符时,它会忽略它,只写;。 但是当我在 html 消息中直接写 é 时,它会发送 e ,这样更好。

例子:

消息发送:

l_html := '<html>
            <head><title>Test HTML message</title></head>
                  <p>trying à with accent : à</p>
                  <p>trying HTML encoding of foreign language characters : &agrave;
            </body>
            </html>';

消息接收:

trying a with accent : a

trying HTML encoding of foreign language characters : ; 

是否可以使用 Oracle 9i 将两者都转换为相同的“a”或“à”?

我使用的一些代码:

l_boundary      CONSTANT VARCHAR2(255) DEFAULT 'a1b2c3d4e3f2g1';

l_temp := l_temp || 'MIME-Version: 1.0' || carriageReturn;     
l_temp := l_temp || 'To: ' || p_to || carriageReturn;          
l_temp := l_temp || 'Cc: ' || p_cc || carriageReturn;           
l_temp := l_temp || 'From: ' || p_from || carriageReturn;
l_temp := l_temp || 'Subject: ' || p_subject || carriageReturn;
l_temp := l_temp || 'Reply-To: ' || p_from || carriageReturn;
l_temp := l_temp || 'Content-Type: multipart/alternative; boundary=' || CHR(34) || l_boundary || CHR(34) || carriageReturn; 

-- Write the HTML boundary
l_temp := carriageReturn || carriageReturn || '--' || l_boundary || carriageReturn;
l_temp := l_temp || 'content-type: text/html; charset=windows-1252' || carriageReturn || carriageReturn;
l_offset := dbms_lob.getlength(l_body_html) + 1;
dbms_lob.WRITE(l_body_html, LENGTH(l_temp), l_offset, l_temp);

有人可以帮帮我吗?

【问题讨论】:

    标签: oracle email plsql oracle9i


    【解决方案1】:

    您声明了charset=windows-1252 - 这真的是您数据库的字符集吗?

    检查这个查询:

    SELECT PARAMETER, VALUE
    FROM NLS_DATABASE_PARAMETERS
    WHERE parameter = 'NLS_CHARACTERSET';
    

    字符串是用你数据库的字符集写的,你不应该硬编码charset=windows-1252,更好用

    SELECT 'charset='||UTL_I18N.MAP_CHARSET(VALUE) 
    FROM NLS_DATABASE_PARAMETERS
    WHERE parameter = 'NLS_CHARACTERSET';
    

    考虑使用NCLOB 而不是CLOB。在这种情况下,上述查询必须改为 WHERE parameter = 'NLS_NCHAR_CHARACTERSET'

    ...甚至更多:考虑迁移您的 15 岁 数据库版本!

    更新

    试试

    buffer VARCHAR2(4000);
    
    ClobLen := DBMS_LOB.GETLENGTH(l_html);
    LOOP
        EXIT WHEN l_offset > ClobLen;
        DBMS_LOB.READ(l_html, 1000, l_offset, buffer);
        UTL_SMTP.WRITE_RAW_DATA(con, UTL_RAW.CAST_TO_RAW(buffer));
        l_offset := l_offset + 1000;
    END LOOP;   
    

    用于 HTML 正文。如果您的消息始终小于 32k 个字符,您也可以直接使用 UTL_SMTP.WRITE_RAW_DATA(con, UTL_RAW.CAST_TO_RAW(l_html));

    更新 2

    您是否在邮件中添加任何附件?如果没有,那么您不需要任何l_boundary。仅需要边界来将邮件文本与附件分开。

    如果您想发送带有附件的邮件,请尝试使用Content-Type: text/html;Content-Type: multipart/mixed; 而不是Content-Type: multipart/alternative;

    【讨论】:

    • 感谢您的快速回复。实际上,我们数据库的字符集不是 windows-1252,而是 WE8ISO8859P1。顺便说一句,我不能使用带有 UTL_I18N 的查询,我有一个执行错误 ORA-00904: "UTL_I18N"."MAP_CHARSET": identicateur non valide。 Thie 迁移待定,但我需要在迁移完成之前找到解决方案 ^^
    • 顺便说一下,当我使用 charset=WE8ISO8859P1 时,我的示例电子邮件发送 $eacute; 而不是 ;。它不能解决我的问题:/
    • 应该是charset=ISO-8859-1WE8ISO8859P1 是 Oracle 字符集名称,您必须使用 IANA 名称。
    • 注意!但结果还是一样。
    • 愚蠢的问题:你运行select 'trying à with accent : à' from dual;时得到正确的输出吗?
    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 2013-11-26
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多