首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle9i发送带有特定字符的HTML

Oracle9i发送带有特定字符的HTML
EN

Stack Overflow用户
提问于 2016-12-08 10:23:05
回答 1查看 361关注 0票数 0

上下文:我试图用过程发送邮件(只有html/文本,而不是文本/纯文本)。我使用Oracle9i

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

例子:

消息发送:

代码语言:javascript
复制
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>';

消息接收:

代码语言:javascript
复制
trying a with accent : a

trying HTML encoding of foreign language characters : ; 

是否可以使用Oracle 9i将两者转换为后面的"a“或"à”?

一些我使用的代码:

代码语言:javascript
复制
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);

有人能帮帮我吗?

EN

回答 1

Stack Overflow用户

发布于 2016-12-08 12:27:23

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

请检查此查询:

代码语言:javascript
复制
SELECT PARAMETER, VALUE
FROM NLS_DATABASE_PARAMETERS
WHERE parameter = 'NLS_CHARACTERSET';

字符串是用字符集写的数据库,不要硬编码charset=windows-1252,更好的使用。

代码语言:javascript
复制
SELECT 'charset='||UTL_I18N.MAP_CHARSET(VALUE) 
FROM NLS_DATABASE_PARAMETERS
WHERE parameter = 'NLS_CHARACTERSET';

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

..。还有更多:考虑迁移您的已有15年历史的数据库版本!

更新

试一试

代码语言:javascript
复制
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;,以防您喜欢发送带有附件的邮件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41037043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档