IdSMTP(Indy10)在Delphi2009中的乱码问题, 含源码, 高手进来研究下...

FDZhong 2008-10-09 02:21:49
在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;
...全文
1717 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
whtsp 2012-05-09
  • 打赏
  • 举报
回复
要回复了才能看???
txxxxxxzzzzzz 2011-11-06
  • 打赏
  • 举报
回复
内容是中文,但是我弄了半天,标题还是不行,提示什么range error
一剑飘雪 2011-06-13
  • 打赏
  • 举报
回复
高人啊 学习了
李秋步 2010-04-17
  • 打赏
  • 举报
回复
哈哈,我用delphi2010的idMessage,设置了charset=gb2312,邮件内容就是中文的拉!

www.demc.cn
neugls 2009-07-05
  • 打赏
  • 举报
回复
呵呵,谢谢楼主,我太爱你了@!
namelysweet 2008-12-31
  • 打赏
  • 举报
回复
不错!收藏一下。
pu_xin 2008-12-09
  • 打赏
  • 举报
回复
我在使用IdHTTP时也遇到这个问题,刚才下载参考一下,谢谢
深宇 2008-12-04
  • 打赏
  • 举报
回复
经过我近两个星期的调试,已经成功的实现在D2009自带的INDY中收发邮件而不乱码了,因为修改的地方太多,这里就不帖出来了,有兴趣的可以下载来看看
FDZhong 2008-11-04
  • 打赏
  • 举报
回复
重新换也2007了。不过还是感谢,见者有分。。。
DoorKey 2008-10-11
  • 打赏
  • 举报
回复
应该是INDY的问题。

INDY10的邮件单元我还是比较熟悉,不过现在还只是用D2007暂时不去考虑D2009
FDZhong 2008-10-09
  • 打赏
  • 举报
回复
调用方法我用到两种, 一种是直接用String, 另一种是用AnsiString,
因为D2009的String默认就是等价于WideString的.

所以我的调用方式中,已经用到了WideString 和 AnsiString 两种,
结果都是不正确的结果..

继续等~~
各位帮忙研究看....谢谢
fangsp 2008-10-09
  • 打赏
  • 举报
回复
你把AnsiString换成WideString试一下
FDZhong 2008-10-09
  • 打赏
  • 举报
回复
谢谢! 我在线等~~
cyl3110235 2008-10-09
  • 打赏
  • 举报
回复
GZ
喝口水 2008-10-09
  • 打赏
  • 举报
回复
没用过2009,帮顶

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧