太奇怪了!太奇怪了!这个问题太奇怪了!我给200分!不够再加!!(200分)

  • 主题发起人 主题发起人 pogoo
  • 开始时间 开始时间
P

pogoo

Unregistered / Unconfirmed
GUEST, unregistred user!
其实我的思路很简单:开一个线程,在 Execute 中执行一个循环,来发送10封信
(badding001~badding010@btamail.net.cn),但每次总是前8封信能够正常发送,
后两封则不行。我把发送、接收的信息保存在了文本文件里,如下:

前8封邮件正常发送的信息
......
send: .
recv: 250 Requested mail action okay, completed.
send: MAIL FROM:<pogoo@btamail.net.cn>
recv: 553 Too much sessions in a connection.
send: RCPT TO:<badding009@btamail.net.cn>
recv: 503 Bad sequence of commands
send: DATA
recv: 503 Bad sequence of commands
......
我查了 Rfc2821 文档(Simple Mail Transfer Protocol),上面提及:在 MAIL FROM: 时,
如果邮件传输通道中仍有 session 尚未完成,则 Server 会答复 553 错误。但这就使我
感到奇怪了!根据最上面两行的信息:
end: .
recv: 250 Requested mail action okay, completed.
说明第8封信也已经发送完成,server也给了答复。但为何会出现 “Too much sessions in
a connection.”信息。我的程序大致如下:
procedure TMainForm.Button1Click(Sender: TObject);
begin
......
SendMailThread := TSendMailThread.Create;
SendMailThread.FreeOnTerminate := True;
SendMailThread.OnTerminate := ThreadsDone;
if Abort then
Exit;
SendMailThread.Resume;
end;
procedure TSendMailThread.Execute;
begin
Try
......
ExecuteSendMail;
except
on Error: Exception do {?}
raise;
end;
end;
procedure TSendMailThread.ExecuteSendMail;
var
i, j: integer;
ReceStr: string;
begin
......
Send(SMTPServer, 'HELO ' + GetLocalHostName);
if Aborted then Exit;
Receive(SMTPServer,ReceStr);
if Aborted then Exit;
for i := 0 to 9 do
begin
Send(SMTPServer, 'MAIL FROM:'+'<pogoo@btamail.net.cn>');
if Aborted then Exit;
Receive(SMTPServer,ReceStr);
if Aborted then Exit;
Send(SMTPServer, 'RCPT TO:' + '<' + MailAddressList + '>');
if Aborted then Exit;
Receive(SMTPServer,ReceStr);
if Aborted then Exit;
Send(SMTPServer, 'DATA');
if Aborted then Exit;
Receive(SMTPServer,ReceStr);
if Aborted then Exit;
for j := 0 to MailMsgRowCount-1 do //MailMsgRowCount是经编码后的邮件文件的行数
Send(SMTPServer, MailRowStr[j]); //MailRowStr[j]是邮件文件每行的内容
if Aborted then Exit;
Send(SMTPServer, '');
Send(SMTPServer, '.');
if Aborted then Exit;
Receive(SMTPServer,ReceStr);
if Aborted then Exit;
......
//Synchronize(DisplaySentMailCount);
end;
if Aborted then Exit;
Send(SMTPServer, 'QUIT');
if Aborted then Exit;
Receive(SMTPServer,ReceStr);
if Aborted then Exit;
......
end;
为了找出问题所在,我把线程中涉及 VCL 同步的代码全部去掉了,可问题依旧。
我该怎么办呀!再搞不定,经理就要搞定我了---让我下岗!!!!!!!!!
 
recv: 250 Requested mail action okay, completed.
加上 SEND: QUIT
RECV: 250 OK
send: MAIL FROM:<pogoo@btamail.net.cn>
recv: 553 Too much sessions in a connection.
send: RCPT TO:<badding009@btamail.net.cn>

你发完信都没有退出来,呵呵!

我的EMAIL:adnilzhou@sohu.com,愿意跟你交流邮件系统开发经验。
 
每封信发送完毕后你有没有QUIT?
还有就是SMTP Server有没有限制(一段时间内)?
 
不能等到10封信都发完以后再QUIT吗?或者用下面方法更为妥帖?
S: MAIL FROM:<pogoo@btamail.net.cn>
R: 250 OK
for i := 0 to 9 do
begin
S: RCPT TO:<MailAddressList>
R: 250 OK
end;
S: DATA
R: 354 Start mail input; end with <CRLF>.<CRLF>
S: ......
S: <CRLF>.<CRLF>
R: 250 OK
S: QUIT
  R: 250 OK
这种方法是否更好?
另外,在向 SERVER 发送一系列命令时,必须要等到 SERVER 的回复后,才能继续发送下
一条命令吗?如果是这样的话!那么等待 SERVER 的回复过程,岂不是在耗费宝贵的时间?
有办法解决吗?谢谢所有参与此问题的网友!
 
for i := 0 to 9 do
begin
S: RCPT TO:<MailAddressList>
R: 250 OK
end;

这样的方法有不无不妥,只是所有的人受到邮件后会发现信体中的收件人和邮件内容
都是一样的。
还有就是rcpt to的数量也是有限制的,发多了服务器会拒绝。
 
SMTP服务器限制,最好用楼上的办法,发完一封就退出。
 
我在 for 循环中加入了 QUIT 指令,如下:
Send(SMTPServer, 'HELO ' + GetLocalHostName);
if Aborted then Exit;
Receive(SMTPServer,ReceStr);
if Aborted then Exit;
for i := 0 to 9 do
begin
Send(SMTPServer, 'MAIL FROM:'+'<pogoo@btamail.net.cn>');
if Aborted then Exit;
Receive(SMTPServer,ReceStr);
if Aborted then Exit;
Send(SMTPServer, 'RCPT TO:' + '<' + MailAddressList + '>');
if Aborted then Exit;
Receive(SMTPServer,ReceStr);
if Aborted then Exit;
Send(SMTPServer, 'DATA');
if Aborted then Exit;
Receive(SMTPServer,ReceStr);
if Aborted then Exit;
for j := 0 to MailMsgRowCount-1 do //MailMsgRowCount是经编码后的邮件文件的行数
Send(SMTPServer, MailRowStr[j]); //MailRowStr[j]是邮件文件每行的内容
if Aborted then Exit;
Send(SMTPServer, '');
Send(SMTPServer, '.');
if Aborted then Exit;
Receive(SMTPServer,ReceStr);
if Aborted then Exit;
Send(SMTPServer, 'QUIT');
if Aborted then Exit;
Receive(SMTPServer,ReceStr);
if Aborted then Exit;

......
//Synchronize(DisplaySentMailCount);
end;
结果发现情况更糟,只能发一封信了,信息如下:
send: .
recv: 250 Requested mail action okay, completed.
send: QUIT
recv: 221 btamail.net.cn closing connection.
send: MAIL FROM:<pogoo@btamail.net.cn>
然后就停在这里不动了,这到底是怎么回事呀?!?!?!?!?!?!
 
后退
顶部