Как отправить электронное письмо, содержащее греческие символы, используя TIdMessage и Delphi XE * UPDATED * - PullRequest
4 голосов
/ 15 сентября 2011

Мы хотим отправить по электронной почте, используя D-XE и компонент TIdMessage Indy, следующий htm-файл в качестве основного текста:

<html>

<head>
<meta http-equiv=Content-Type content="text/html; charset=windows-1253">
<meta name=Generator content="Microsoft Word 12 (filtered)">
<style>
<!--
 /* Font Definitions */
 @font-face
    {font-family:"Cambria Math";
    panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
    {font-family:Tahoma;
    panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
    {margin:0cm;
    margin-bottom:.0001pt;
    font-size:12.0pt;
    font-family:"Times New Roman","serif";
    color:black;}
.MsoChpDefault
    {font-size:10.0pt;}
@page Section1
    {size:595.3pt 841.9pt;
    margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
    {page:Section1;}
-->
</style>

</head>

<body bgcolor=white lang=EL>

<div class=Section1>

<p class=MsoNormal><span lang=EN-US style='font-family:"Tahoma","sans-serif"'>Abcd</span><span
lang=EN-US style='font-family:"Tahoma","sans-serif"'> </span><span
style='font-family:"Tahoma","sans-serif"'>αβγδ ά&#8118;&#8048;&#7938; </span></p>

</div>

</body>

</html>

(Хорошо, фактический файл другой, но проблема та же).

В приведенном выше файле, если вы сохраните его как temp.htm и загрузите его в Internet Explorer, вы увидите 4 латинских символа, 4 греческих символа без тона и 4 греческих символа с тоном(вариации альфа - первая буква греческого алфавита).Примерно так:

Abcd αβγδ άᾶὰἂ

Пока все хорошо.

Если мы загрузим указанный выше файл в свойстве BodyTIdMessage и отправьте его по электронной почте, оно выглядит так:

Abcd ????? ᾶὰἂ

Как видите, греческие буквы из монотонного алфавита заменены на ?????- протестировано с использованием Mozilla Thunderbird 3 на WinXP.

Свойства компонента TIdMessage следующие:

TIdMessage Properties

Я попытался установить CharSetдо Windows-1253 но не повезло.

Есть идеи, как это может работать?

ОБНОВЛЕНИЕ:

Ответы на ваши вопросы:

Необработанный источник сообщений после был получен: (адреса электронной почты были отредактированы)

From - Thu Sep 15 11:11:06 2011
X-Account-Key: account3
X-UIDL: 00007715
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00400000
X-Mozilla-Keys:                                                                                 
Return-Path: [redacted]
X-Envelope-To: [redacted]
X-Spam-Status: No, hits=0.0 required=5.0
    tests=AWL: 0.194,BAYES_20: -0.73,HTML_MESSAGE: 0.001,
    MIME_HEADER_CTYPE_ONLY: 0.56,MIME_HTML_ONLY: 0.001,MISSING_MID: 0.001,
    CUSTOM_RULE_FROM: ALLOW,TOTAL_SCORE: 0.027,autolearn=no
X-Spam-Level: 
Received: from localhost ([127.0.0.1])
    by [redacted]
    for [redacted];
    Thu, 15 Sep 2011 11:10:59 +0300
From: [redacted]
Subject: Test msg
To: [redacted]
Content-Type: text/html; charset=us-ascii
Sender: [redacted]
Reply-To: [redacted]
Disposition-Notification-To: [redacted]
Return-Receipt-To: [redacted]
Date: Thu, 15 Sep 2011 11:10:59 +0300

<html>

<head>
<meta http-equiv=Content-Type content="text/html; charset=windows-1253">
<meta name=Generator content="Microsoft Word 12 (filtered)">
<style>
<!--
 /* Font Definitions */
 @font-face
    {font-family:"Cambria Math";
    panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
    {font-family:Tahoma;
    panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
    {margin:0cm;
    margin-bottom:.0001pt;
    font-size:12.0pt;
    font-family:"Times New Roman","serif";
    color:black;}
.MsoChpDefault
    {font-size:10.0pt;}
@page Section1
    {size:595.3pt 841.9pt;
    margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
    {page:Section1;}
-->
</style>

</head>

<body bgcolor=white lang=EL>

<div class=Section1>

<p class=MsoNormal><span lang=EN-US style='font-family:"Tahoma","sans-serif"'>Abcd</span><span
lang=EN-US style='font-family:"Tahoma","sans-serif"'> </span><span
style='font-family:"Tahoma","sans-serif"'>???? ?&#8118;&#8048;&#7938; </span></p>

</div>

</body>

</html>

Mozilla Thunderbird сообщает также Message Encoding: Western (ISO-8859-1).Я пытался вставить в компонент IdMessage разные кодировки, такие как windows-1253 (греческий) или UTF-8 - результат был одинаковым.Кроме того, я попытался преобразовать htm-файл в UTF-8 (используя Блокнот ++) - он выглядел одинаково (я изменил кодировку вручную в html meta info).Отправил сообщение еще раз.Результат: Abcd ??? 2? 3 ???? ᾶὰἂ

Ответы [ 3 ]

3 голосов
/ 16 сентября 2011

Если вы посмотрите на свои собственные скриншоты, вы увидите, что TIdMessage и передаваемое электронное письмо настроены на использование US-ASCII в качестве CharSet.Вот почему ваши данные изменяются.

Если вы загружаете HTML-код в свойство TIdMessage.Body или TIdText.Body, вам необходимо декодировать данные в UTF-16 (поскольку это то, что Bodyсвойство используется в XE), а затем установите для свойства TIdMessage.CharSet или TIdText.CharSet значение windows-1253, чтобы данные UTF-16 правильно перекодировались при отправке электронного письма, например:

Enc := CharsetToEncoding('windows-1253');
try
  IdMessage.Body.LoadFromFile('file.htm', Enc);
  IdMessage.ContentType := 'text/html';
  IdMessage.CharSet := 'windows-1253';
finally
  Enc.Free;
end;

или:

Enc := CharsetToEncoding('windows-1253');
try
  with TIdText.Create(IdMessage.MessageParts, nil) do
  begin
    Body.LoadFromFile('file.htm', Enc);
    ContentType := 'text/html';
    CharSet := 'windows-1253';
  end;
finally
  Enc.Free;
end;

Если вместо этого вы загружаете HTML-код в объект TIdAttachment, вам не нужно ничего декодировать / кодировать вручную, поскольку данные вложения отправляются как есть.

with TIdAttachmentFile.Create(IdMessage.MessageParts, 'file.htm') do
begin
  ContentType := 'text/html';
end;
0 голосов
/ 10 февраля 2014

Я использую Indy 10 и Delphi XE2 (Unicode std Strings), установив в сообщении CharSet значение 'ISO-8859-7' и добавляя текст в тело, используя UTF8Encode

TempMess := TIdMessage.Create(self); TempMess.CharSet :='ISO-8859-7'; TempMess.Body.Add(UTF8Encode('Καλημέρα!!!'));

0 голосов
/ 15 сентября 2011

Попробуйте установить ContentTransferEncoding, например, для цитирования-печати.Помните, что почта по-прежнему использует 7-битные символы (если сервер не объявляет, что может обрабатывать 8-битные или двоичные данные), поэтому необходимо правильное кодирование передачи.

...