Не удалось отправить письмо в формате UTF-8 с помощью delphi indy - PullRequest
8 голосов
/ 23 марта 2012

Вот мой код

В теле письма есть символы Unicode

  LSMTP := TIdSMTP.Create(nil);
  try
    LMsg := TIdMessage.Create(LSMTP);
    try
      with LMsg do
      begin
        Subject := Subj;
        Recipients.EMailAddresses := Email;    
        WriteToLog(cInformation,'To: '+Recipients.EMailAddresses);    
        From.Address := ReplaceVariables(From_Address);    
        From.Name    := ReplaceVariables(From_Name);    
        Body.Text    := EmailMessage;    
        ContentTransferEncoding := '8bit';    
        CharSet := 'UTF-8';    
        ContentType := 'text/plain';    
     end;

И вот что я получаю

Content-Type: text/plain; charset=us-ascii <<<<< WRONG
Content-Transfer-Encoding: 8bit
Date: Fri, 23 Mar 2012 17:53:19 +0000

Использование delphi 2009

Ответы [ 3 ]

14 голосов
/ 23 марта 2012

То есть по замыслу. Когда свойство ContentType устанавливается, установщик свойств может обновить свойство CharSet значением по умолчанию, если входные данные явно не указывают кодировку. Определенные типы контента, особенно в области text/, имеют определенные значения по умолчанию для набора символов, заданные в различных RFC. Инди пытается следовать этим правилам, как может. Таким образом, вам нужно установить свойство CharSet в соответствии с вашим предполагаемым значением после того, как вы установили свойство ContentType, как вы уже обнаружили:

//LMsg.CharSet := 'UTF-8';
LMsg.ContentType := 'text/plain';
LMsg.CharSet := 'UTF-8';

Вы также можете сделать это вместо:

LMsg.ContentType := 'text/plain; charset=UTF-8';
3 голосов
/ 23 марта 2012

Получил это работает.Порядок событий очень важен.

Этот работает:

LMsg.ContentType:='text/plain';
LMsg.CharSet:='UTF-8';

Этот не работает:

LMsg.CharSet:='UTF-8';
LMsg.ContentType:='text/plain';
2 голосов
/ 25 марта 2014

В моем случае, если я добавлю вложение, я должен указать только кодировку:

pMsg->CharSet = "UTF-8";

В противном случае программа чтения почты покажет исходный код письма.

...