2012-03-23 11 views
7

Aquí está mi códigoNo es capaz de enviar UTF-8 de correo electrónico usando Delphi Indy

Email cuerpo tiene algunos caracteres 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; 

Y esto es lo que me pasa

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

Uso delphi 2009

Respuesta

2

Lo tengo trabajando

orden de los acontecimientos es muy importante

funciona Éste

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

éste no

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

13

Eso es por diseño. Cuando se establece la propiedad ContentType, el establecimiento de la propiedad puede actualizar la propiedad CharSet con un valor predeterminado si la entrada no especifica explícitamente un juego de caracteres. Ciertos tipos de contenido, especialmente en el dominio text/, tienen valores predeterminados de conjunto de caracteres específicos dictados en varios RFC. Indy intenta seguir esas reglas lo mejor que puede. Como tal, es necesario establecer la propiedad CharSet a su valor previsto después de haber establecido la propiedad ContentType, como ya descubrió:

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

También puede hacer esto en su lugar:

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

En mi caso, si añado un attachement, i sólo debe especificar el conjunto de caracteres:

pMsg->CharSet = "UTF-8";

lo contrario el mailreader mostrar el código fuente del correo.

Cuestiones relacionadas