Oracle9i发送带有特定字符的HTML电子邮件

时间:2016-12-08 10:23:06

标签: oracle email plsql oracle9i

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

问题:当html消息包含某些字符时,例如& eacute; (é),它忽略它,它只写; 。 但是当我在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);

有人能帮助我吗?

1 个答案:

答案 0 :(得分:0)

您声明了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: multipart/alternative;尝试Content-Type: text/html;Content-Type: multipart/mixed;,以防您希望发送带附件的邮件。