首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2012-10-12 
IdSMTP在Delphi2009中发送邮件乱码在Delphi2007中运行正确, 发送的Email可以正常显示中文.但当然把Delphi

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;interfaceuses  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挺成熟的啊

热点排行