发现问题后,试着在网上搜索相关问题,有说是指定字符集idmessage.charset。然而这种方式并不能解决。
试过用D7写Demo验证,是没问题。D7与D2009字符编码差别在ansi和unicode,故而怀疑Indy在unicode的中文字编码处理上存在问题——可能存在转换时数据丢失。
最后尝试在idmessage正文部分做如下处理:
idmessage1.CharSet := 'gb2312';
idmessage1.ContentTransferEncoding := 'base64';//关键是设置编码转换,避免数据丢失
以上处理,在邮件正文部分可正确显示中文。但是主题中的汉字仍然是乱码,故仿照正文编码转换,最后才正确显示,如下:
var
ss: string;
begin
ss:= Format('=?gb2312?B?%s?=', [Encodestring(edit1.Text)]);
idmessage1.subject := ss;