2012-03-23 3 views
7

Ecco il mio codiceNon in grado di inviare UTF-8 e-mail utilizzando Delphi indy

corpo e-mail ha alcuni caratteri 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; 

E questo è quello che ottengo

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

Utilizzando delphi 2009

risposta

2

Funzionante

ordine degli eventi è molto importante

Questo funziona

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

Questo non fa

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

13

Questo è di progettazione. Quando viene impostata la proprietà ContentType, il setter della proprietà può aggiornare la proprietà CharSet con un valore predefinito se l'input non specifica esplicitamente un set di caratteri. Alcuni tipi di contenuto, in particolare nel dominio text/, hanno valori predefiniti di set di caratteri specifici dettati in vari RFC. Indy cerca di seguire quelle regole come meglio può. Come tale, è necessario impostare la proprietà CharSet al valore previsto dopo aver impostato la proprietà ContentType, come già scoperto:

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

Si può anche fare questo, invece:

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

Nella mia caso, se aggiungo un attachement, devo specificare solo il set di caratteri:

pMsg->CharSet = "UTF-8";

Else il mailreader mostra il codice sorgente della posta.