2016-12-08 10 views
0

컨텍스트 : 오라클 절차 (텍스트/일반 텍스트가 아닌 html/텍스트 만)로 메일을 보내려고합니다. Oracle 9i을 사용합니다.Oracle9i는 특정 문자가 포함 된 HTML 전자 메일을 보냅니다.

문제점 : html 메시지에 & 같은 일부 문자가 포함 된 경우; (é), 무시합니다. ;. 그러나 직접 ely을 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 : ; 

이 가능 같은 후 "a"또는 "A로 모두 변환인가 "Oracle 9i를 사용하고 있습니까?

내가 사용하는 일부 코드 :

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

당신은 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'; 

CLOB 대신 NCLOB를 사용하도록 고려해서는 안 . 위의 경우 쿼리는 WHERE parameter = 'NLS_NCHAR_CHARACTERSET'이어야합니다.

... 및 기타 : 마이 그 레이션을 고려하십시오 15 세 데이터베이스 출시!

는 업데이트

는 HTML의 몸

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; 

을 시도합니다. 메시지가 항상 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

빠른 답장을 보내 주셔서 감사합니다. 사실 우리 데이터베이스의 문자 집합은 windows-1252가 아니며 WE8ISO8859P1입니다. 그건 그렇고, 내가 UTL_I18N와 쿼리를 사용할 수 없습니다, 나는 실행 오류 ** ORA - 00904 : "UTL_I18N". "MAP_CHARSET": identideur 비 valide **. Thie 마이그레이션은 보류 중입니다.하지만 마이그레이션을 완료하기 전에 해결책을 찾아야합니다. ^^ – nbadaud

+0

그리고 ** charset = WE8ISO8859P1 **을 사용하면 예제 이메일에서 ** $ eacute; ** 대신 * $ eacute; **를 전송합니다. *; **. 내 문제를 해결하지 않습니다 :/ – nbadaud

+0

'charset = ISO-8859-1'이어야합니다. 'WE8ISO8859P1'은 오라클 문자 집합 이름이고 IANA 이름을 사용해야합니다. –