上下文:我正在尝试使用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 : à
</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);
有人能帮助我吗?
答案 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;
,以防您希望发送带附件的邮件。