在Delphi2007中运行正确, 发送的Email可以正常显示中文.
但当然把Delphi升级为2009之后, 无论如何发送的邮件中只要是中文就变成乱码.似乎是Delphi中的String默认为WideString的问题,
但我也试过在调用IdSMTP.send之,设定相关的变量为AnsiString,结果依然是乱码.有人可以帮忙研究一下吗?环境: CodeGear™ Delphi® 2009 Architect , Indy 10.2.3类代码如下: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,结果依然是乱码: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;

解决方案 »

  1.   

    中文是WideChar 和 WideString
    你改一下 试试
      

  2.   

    AnsiString其实对应的还是ASC码而不是Unicode码
    而WideChar和WideString对应的就是Unicode码
    建议还是用D7
    2009刚出来 有的东西还得实践来检验
    D7挺成熟的啊
      

  3.   

    原来是用D2007的, 听说2009的Unicode支持, 所以才升级的, 谁知道一升之后, 原来不会乱码的东西, 反而乱码了 ~_^至于WideString的问题, D2009中的String类型,默认就是WideString的
    我把它改为AnsiString就是想要模仿为D2007中的String. (D2007和D7的String与AnsiString是等价的.)问题没有解决,继续等~~......
      

  4.   

    经过我近两个星期的调试,已经成功的实现在D2009自带的INDY中收发邮件而不乱码了,因为修改的地方太多,这里就不帖出来了,有兴趣的可以下载来看看
      

  5.   

    哈哈,我用delphi2010的idMessage配合idSMTP,设置了charset=gb2312,邮件内容就是中文的拉!www.demc.cn
      

  6.   

    "哈哈,我用delphi2010的idMessage配合idSMTP,设置了charset=gb2312,邮件内容",确实可行,谢谢!!!