IdSMTP在Delphi2009中发送邮件乱码解决方法

IdSMTP在Delphi2009中发送邮件乱码
在Delphi2007中运行正确, 发送的Email可以正常显示中文.
但当然把Delphi升级为2009之后, 无论如何发送的邮件中只要是中文就变成乱码.

似乎是Delphi中的String默认为WideString的问题,
但我也试过在调用IdSMTP.send之,设定相关的变量为AnsiString,结果依然是乱码.

有人可以帮忙研究一下吗?

环境: CodeGear™ Delphi® 2009 Architect , Indy 10.2.3

类代码如下:
Delphi(Pascal) code

unit TccMail;

interface
uses
  Forms,Sysutils, Classes,IdSMTP, IdMessage,TccUtils;

Type TTccMail=Class(TObject)
  private
    FSmtp: TIdSMTP;
    FMsg: TIdMessage;
    FToList: String;
    FSubject: String;
    FBodys: TStrings;
    procedure SetSubject(const Value: String);
    procedure SetToList(const Value: String);
    procedure TccMailFailedRecipient(Sender: TObject; const AAddress, ACode, AText: String;
    var VContinue: Boolean);
  public
    constructor Create;
    destructor Destroy; override;
    property ToList: String read FToList write SetToList;
    property Subject: String read FSubject write SetSubject;
    property Bodys: TStrings read FBodys;
    function Send: boolean;
    procedure Clear;
end;

implementation

{ TTccMail }

procedure TTccMail.Clear;
begin
  FToList:='';
  FSubject:='';
  FBodys.Clear;
end;

constructor TTccMail.Create;
begin
  FSmtp:=TIdSMTP.Create(nil);
  FMsg:=TIdMessage.Create(nil);
  FBodys:=TStringList.Create;
end;

destructor TTccMail.Destroy;
begin
  FSmtp.Free;
  FMsg.Free;
  FreeAndNil(FBodys);
  inherited;
end;

function TTccMail.Send: boolean;
begin
  if FToList='' then raise exception.Create('Empty Recepients');
  FSmtp.Host     := '********************';
  FSmtp.Username := '********';
  FSmtp.Password := '********';
  FMsg.CharSet := 'GB2312';
  FMsg.ContentType := 'text/html';
  FMsg.Encoding:=meMIME;
  FMsg.From.Name := 'SYSTEM_CN';
  FMsg.From.Address := '************';
  FMsg.Date:=Now-8/24;
  FMsg.Subject := Subject;
  FMsg.Body.AddStrings(Bodys);
  FMsg.Recipients.EMailAddresses := ToList;
  FSmtp.Connect;
  FSmtp.Send(FMsg);
  FSmtp.Disconnect;
  ToList:='';
  Subject:='';
  Bodys.Clear;
  result:=true;
end;

procedure TTccMail.SetSubject(const Value: String);
begin
  FSubject := Value;
end;

procedure TTccMail.SetToList(const Value: String);
begin
  FToList := Value;
end;

end.



调用方式,一种用默认的String,一种是指明为AnsiString,结果依然是乱码:
Delphi(Pascal) code

function SendMail(ToList,Subject: String; Bodys: TStrings):boolean;
var
  TccMail: TTccMail;
begin
  TccMail:=TTccMail.Create;
  try
    TccMail.ToList := ToList;
    TccMail.Subject := Subject;
    TccMail.Bodys.AddStrings(Bodys);
    Result:=TccMail.Send;
  finally
    TccMail.Free;
  end;
end;

function SendMail(ToList,Subject: AnsiString; Body: AnsiString):boolean;
var
  TccMail:TTccMail;
begin
  TccMail:=TTccMail.Create;
  try
    TccMail.ToList := ToList;
    TccMail.Subject := Subject;
    TccMail.Bodys.Add(Body);
    Result:=TccMail.Send;
  finally
    TccMail.Free;
  end;
end;



------解决方案--------------------
中文是WideChar 和 WideString
你改一下 试试
------解决方案--------------------
没用过2009,帮顶
------解决方案--------------------
AnsiString其实对应的还是ASC码而不是Unicode码
而WideChar和WideString对应的就是Unicode码
建议还是用D7
2009刚出来 有的东西还得实践来检验
D7挺成熟的啊