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