使用indy9不能发送邮件的兄弟注意了,这里有解决方法!(10分)

  • 主题发起人 主题发起人 lzf1010
  • 开始时间 开始时间
L

lzf1010

Unregistered / Unconfirmed
GUEST, unregistred user!
1、
找到procedure TIdSMTP.Send(AMsg: TIdMessage);这个函数将SendCmd('RSET');这行注销
2、IdMessageCoderMIME这个单元,将下面的常量IndyMIMEBoundary,IndyMultiPartAlternativeBoundary,IndyMultiPartRelatedBoundary改成你自己需要的就可以了。

从这里可以看出,部分门户网站的免费邮箱专门针对indy组件做了限制!现在borland已经决定出售delphi了,这些门户还暗地里捅上一刀,真是阴险!
 
顶一下,其实很早之前就有好多邮件服务器把indy特征记录了,一般用Indy原始代码都发不出去的,呵呵,自己动手丰衣足食!改改就不错!请问一句,那个SendCmd('RSET')是什么 意思?通讯的时候是不是可以忽略这个cmd?
 
是要注释掉这一行才行,不注释掉这行会报异常!

是最近两个星期才出现发不出邮件的现象的,之前一直没问题。
 
呵呵,2006自带那个indy10就没问题,不过还是建议要改掉那三个常量,因为说不准那天就又被封杀了
 
呵呵,明白了。
恩,常量一定要改,建议一劳永逸的改成一个自动生成初始化值的常量,在单元的initialization中动态初始化,这样每次执行程序都会不同:)嘻嘻。更保险。
 
看来indy开发组已经注意到自己的控件被人封杀了,2006自带的Indy10现在这三个常量已经是每次执行程序都不同的了,而且也是放在initialization中动态初始化
 
支持!支持!
非常感谢楼主!
 
非常感谢!
 
我写了个程序测试了一下Indy9的smtp控件,发现是这样的:
1.对有的邮件服务器,这样的写法是没有问题的,比如使用foxmail服务器版做的服务端。
2.对另一些邮件服务器的确会出错。但把顺序改一下,先进行身份验证auth,然后再发送RSET指令就正确了。
3.换用Indy10后就正确了。仔细比较了Indy9和Indy10的这部分代码,觉得是9版本实现的有问题造成的。
 
难道非要回复了才能收藏此贴吗:)

测试一下
 
[:(]还是不太明白,不过确实最近我用Indy9写的程序发不了邮件了~~
 
to vmao:
在你project所在文件夹中新建一个文件夹,将IdMessageClient.pas,IdMessageCoderMIME.pas这两个文件copy到这个新建的文件夹中,然后按我所说的方法修改这两个文件,最后在IDE中打开Project->Options->Directories/Conditionals->Search path中加入这个新建的文件夹所在的路径,重新编译就可以了。
 
1.SendCmd('RSET')是什么 意思?通讯的时候是不是可以忽略这个cmd?
2.那三个常量有什么作用,把它的value随便换成什么都可以吗?
 
1、SendCmd('RSET')一定要注销,否则会报异常
2、那三个常量随便换成什么都可以,不过一定要长,最好是随机的GUID(在IDE的代码编辑器里同时按下Ctrl+shift+G可以产生GUID)!因为这三个常量是用来分割邮件内容的的分隔符。
 
我以前是好的,现在老报这个错误,是怎么回事~
550 5.7.1 Unable to relay for user@domain.com
 
按照我说的来修改也不行吗?
 
是的,我已经改过了~~,奇怪了~ 我是直接改的Indy的代码,没有复制过来,把搜索地址指向了原来的Source文件夹
 
procedure TSendMailf.BtnSendClick(Sender: TObject);
var inifile:tinifile;
sSender:string; //发件人地址
i,j,iCount:integer;
sReceipter,sAddress:string;//收件人和地址
sBody : string; //邮件内容,有替代
begin
Unsend.Lines.Clear;
//1.删除空行
i:=0;
while (i<self.txtRecipters.Lines.Count) do
begin
if self.txtRecipters.Lines.Strings = '' then
begin
self.txtRecipters.Lines.Delete(i);
i:=i-1;
end;
i:=i+1;
end;

if self.txtRecipters.Lines.Count = 0 then
begin
showmessage('没有收件人!');
abort;
end;

//1 总进度
self.ProgressBar.Max := self.txtRecipters.Lines.Count;
self.ProgressBar.Step :=1;
self.ProgressBar.Position :=0;

//1.读取配置文件
inifile:=tinifile.Create(extractfilepath(application.exename)+'/setting.ini');
try
self.IdSMTP.AuthenticationType := atLogin;
self.IdSMTP.Host := inifile.ReadString('Setting','HostName','');
self.IdSMTP.Port := inifile.ReadInteger('Setting','port',25);
self.IdSMTP.Username := inifile.ReadString('Setting','UserName','');
self.IdSMTP.Password := inifile.ReadString('Setting','Password','');
sSender := inifile.ReadString('Setting','Sender','');
finally
inifile.free;
end;

//2.构建Idmessage
self.IdMessage.Subject := trim(self.txtTitle.Text);
self.IdMessage.From.Text := sSender;

//3.添加附件
for i:=0 to self.ListView.Items.Count-1 do
begin
TidAttachment.Create(idMessage.MessageParts ,self.ListView.Items.Caption);
end;

//
iCount := 0;

try
IdSMTP.Connect(5000);
for i:=0 to self.txtRecipters.Lines.Count -1 do
begin
sReceipter := '';
sAddress := '';
sBody := self.txtBody.Lines.Text;
sReceipter := copy(self.txtRecipters.Lines.Strings,1,pos(',',self.txtRecipters.Lines.Strings)-1);
sAddress := copy(self.txtRecipters.Lines.Strings,length(sReceipter)+2,length(self.txtRecipters.Lines.Strings));
if sReceipter='' then sReceipter := copy(sAddress,1,pos('@',sAddress)-1); //修正receipter;
self.IdMessage.Recipients.EMailAddresses := sAddress;
sBody := stringreplace(sBody,'[Receipter]',sReceipter,[rfReplaceAll]);
self.IdMessage.Body.Text := sBody;
try
IdSMTP.Send(IdMessage);
Unsend.Lines.Add(self.txtRecipters.Lines.Strings);
iCount := iCount +1;
except
raise;
//错误地址以后处理
end;
self.ProgressBar.Position := self.ProgressBar.Position + self.ProgressBar.Step;
end;
finally
IdSMTP.Disconnect;
end;
//
showmessage('发送完成!');
end;
 
你应该复制出来!!在新的文件夹里看到这两个文件的DCU生成了那些修改才算是生效了!
 
后退
顶部