IdSMTP在Delphi2009中发送邮件乱码解决方法
IdSMTP在Delphi2009中发送邮件乱码
在Delphi2007中运行正确, 发送的Email可以正常显示中文.
但当然把Delphi升级为2009之后, 无论如何发送的邮件中只要是中文就变成乱码.
似乎是Delphi中的String默认为WideString的问题,
但我也试过在调用IdSMTP.send之,设定相关的变量为AnsiString,结果依然是乱码.
有人可以帮忙研究一下吗?
环境: CodeGear™ Delphi® 2009 Architect , Indy 10.2.3
类代码如下:
调用方式,一种用默认的String,一种是指明为AnsiString,结果依然是乱码:
------解决方案--------------------
中文是WideChar 和 WideString
你改一下 试试
------解决方案--------------------
没用过2009,帮顶
------解决方案--------------------
AnsiString其实对应的还是ASC码而不是Unicode码
而WideChar和WideString对应的就是Unicode码
建议还是用D7
2009刚出来 有的东西还得实践来检验
D7挺成熟的啊
在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挺成熟的啊