2016-12-08 8 views
0

Контекст: Я пытаюсь отправить письма с помощью процедуры Oracle (только HTML/текст, а не текст/обычный). Я использую Oracle 9i.Oracle9i отправить HTML-адрес электронной почты со специальными символами

Проблема: Когда 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?

код, который я использую:

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'; 

Рассмотрим использование NCLOB вместо CLOB , В этом случае выше запрос должен быть WHERE parameter = 'NLS_NCHAR_CHARACTERSET'.

... и даже больше: рассмотрите вопрос о переносе 15 лет выпуск базы данных!

Update

попробовать

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. Вы также можете сделать UTL_SMTP.WRITE_RAW_DATA(con, UTL_RAW.CAST_TO_RAW(l_html));, если ваше сообщение всегда меньше 32 тысяч символов.

Update 2

ли вы делать какие-либо вложения в вашей почте? Если нет, то вам не нужен l_boundary. Граница просто необходима, чтобы отделять текст письма от вложения.

Вместо Content-Type: multipart/alternative; попробуйте Content-Type: text/html; или Content-Type: multipart/mixed; в случае, если вы хотите отправить письма с приложением.

+0

Благодарим вас за быстрый ответ. Фактически, набор символов нашей базы данных не является окном-1252, это WE8ISO8859P1. Кстати, я не могу использовать запрос с UTL_I18N, у меня есть ошибка выполнения ** ORA-00904: «UTL_I18N». «MAP_CHARSET»: identicateur non valide **. Миграция в ожидании, но мне нужно найти решение до этого завершения миграции ^^ – nbadaud

+0

И, кстати, когда я использую ** charset = WE8ISO8859P1 **, мой пример электронной почты отправляет ** $ eacute; ** вместо * *; **. Это не разрешает мою проблему:/ – nbadaud

+0

Это должно быть 'charset = ISO-8859-1'. 'WE8ISO8859P1' - это имя набора символов Oracle, вы должны использовать имя IANA. –

 Смежные вопросы

  • Нет связанных вопросов^_^