读书人

IdSMTP(Indy10)在Delphi2009中的乱码有

发布时间: 2012-05-10 16:02:39 作者: rapoo

IdSMTP(Indy10)在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; 



[解决办法]
没用过2009,帮顶
[解决办法]
GZ
[解决办法]
你把AnsiString换成WideString试一下
[解决办法]
应该是INDY的问题。

INDY10的邮件单元我还是比较熟悉,不过现在还只是用D2007暂时不去考虑D2009

读书人网 >.NET

热点推荐