上下文:我试图用过程发送邮件(只有html/文本,而不是文本/纯文本)。我使用Oracle9i。
问题:当html消息包含一些字符(如& eacute; (é) )时,它会忽略它,它只写;。但是,当我在html消息中直接写é时,它会发送e wich更好。
例子:
消息发送:
l_html := '<html>
<head><title>Test HTML message</title></head>
<p>trying à with accent : à</p>
<p>trying HTML encoding of foreign language characters : à
</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);有人能帮帮我吗?
发布于 2016-12-08 12:27:23
您声明了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;,以防您喜欢发送带有附件的邮件。
https://stackoverflow.com/questions/41037043
复制相似问题