2012-03-23 29 views
7

Đây là mã của tôiKhông thể gửi UTF-8 email bằng delphi indy

Email cơ thể đã có một số ký tự 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; 

Và đây là những gì tôi nhận được

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

Sử dụng delphi 2009

Trả lời

2

Có hoạt động

thứ tự của sự kiện là rất quan trọng

một này hoạt động

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

Điều này không

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

13

Đó là theo thiết kế. Khi thuộc tính ContentType đang được thiết lập, thuộc tính setter có thể cập nhật thuộc tính CharSet với giá trị mặc định nếu đầu vào không chỉ định rõ ràng một bộ ký tự. Một số loại nội dung nhất định, đặc biệt trong lĩnh vực text/, có các mặc định ký tự cụ thể được quy định trong các RFC khác nhau. Indy cố gắng tuân theo những quy tắc đó tốt nhất có thể. Như vậy, bạn cần phải thiết lập các CharSet tài sản với giá trị dự định của bạn sau khi bạn đã thiết lập các ContentType tài sản, như bạn đã phát hiện ra:

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

Bạn cũng có thể làm điều này thay vì:

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

Trong tôi trường hợp, Nếu tôi thêm một attachement, tôi phải chỉ định các charset:

pMsg->CharSet = "UTF-8";

khác các mailreader hiển thị mã nguồn của thư.

Các vấn đề liên quan