邮件为何不能群发(只能同时发两个,三个以上就不行)?附代码,请帮检查哪里有问题。 难道是163的邮箱限制? ( 积分: 50 )

  • 主题发起人 主题发起人 baoyun
  • 开始时间 开始时间
B

baoyun

Unregistered / Unconfirmed
GUEST, unregistred user!
这是《80例上手Delphi 7编程》中的邮件群发例子,使用SMTP协议发送邮件,用了Indy系列组件中的TidMessage 和 TIdSMTP。
但是我怎么运行后不能群发?
代码如下:

procedure TForm1.sendclick(Sender: TObject);
var
i: integer;
begin
if ListBox1.Items.Count = 0 then
begin
showmessage('发送列表为空,邮件发送失败!');
exit;
end;
if mailmemo.Text = '' then
begin
showmessage('邮件内容为空!');
exit;
end;

Button1.Enabled := False;
if cb_authentication.Checked then //服务器验证
begin
IdSMTP1.AuthenticationType := atLogin;
IdSMTP1.Username := le_user.Text;
IdSMTP1.Password := le_pass.Text;
end else
begin
IdSMTP1.AuthenticationType := atNone;
end;
IdSMTP1.Host := le_smtp.Text;
IdSMTP1.Port := StrToIntDef(le_port.Text, 25); //如果转换错误默认25

IdSMTP1.Connect; //连接
try
Tag := 1; //设置中断标志
for i := 0 to ListBox1.Items.Count - 1 do
begin //循环发送
if Tag = 0 then exit; //如果中断则退出群发
SendEmail(ListBox1.Items.Strings);{SendEmail()是设置发送邮件信息的函数,另外附在下面}
IdSMTP1.Send(IdMessage1);
ListBox1.ItemIndex := i;
Application.ProcessMessages;
end;
finally
Tag := 0;
IdSMTP1.Disconnect;
Button1.Enabled := True;
end;
end;

{设置发送邮件信息的函数}
function TForm1.SendEmail(aAddr: string): boolean;
begin
IdMessage1.Body.Assign(mailmemo.Lines);
IdMessage1.From.Text := le_email.Text;
IdMessage1.ReplyTo.EMailAddresses := le_email.Text;
IdMessage1.Recipients.EMailAddresses := aAddr;
IdMessage1.Subject := le_title.Text;
end;
 
这是《80例上手Delphi 7编程》中的邮件群发例子,使用SMTP协议发送邮件,用了Indy系列组件中的TidMessage 和 TIdSMTP。
但是我怎么运行后不能群发?
代码如下:

procedure TForm1.sendclick(Sender: TObject);
var
i: integer;
begin
if ListBox1.Items.Count = 0 then
begin
showmessage('发送列表为空,邮件发送失败!');
exit;
end;
if mailmemo.Text = '' then
begin
showmessage('邮件内容为空!');
exit;
end;

Button1.Enabled := False;
if cb_authentication.Checked then //服务器验证
begin
IdSMTP1.AuthenticationType := atLogin;
IdSMTP1.Username := le_user.Text;
IdSMTP1.Password := le_pass.Text;
end else
begin
IdSMTP1.AuthenticationType := atNone;
end;
IdSMTP1.Host := le_smtp.Text;
IdSMTP1.Port := StrToIntDef(le_port.Text, 25); //如果转换错误默认25

IdSMTP1.Connect; //连接
try
Tag := 1; //设置中断标志
for i := 0 to ListBox1.Items.Count - 1 do
begin //循环发送
if Tag = 0 then exit; //如果中断则退出群发
SendEmail(ListBox1.Items.Strings);{SendEmail()是设置发送邮件信息的函数,另外附在下面}
IdSMTP1.Send(IdMessage1);
ListBox1.ItemIndex := i;
Application.ProcessMessages;
end;
finally
Tag := 0;
IdSMTP1.Disconnect;
Button1.Enabled := True;
end;
end;

{设置发送邮件信息的函数}
function TForm1.SendEmail(aAddr: string): boolean;
begin
IdMessage1.Body.Assign(mailmemo.Lines);
IdMessage1.From.Text := le_email.Text;
IdMessage1.ReplyTo.EMailAddresses := le_email.Text;
IdMessage1.Recipients.EMailAddresses := aAddr;
IdMessage1.Subject := le_title.Text;
end;
 
邮件地址列表为1~2个就可以,三个或以上就会出现如下错误信息:
CoremailSys:Error: too many letters during this connection.
 
走过路过的前辈帮看看吧。为什么会这样?
 
难等啊,难过.再看看书先
 
这本书我也有,你可以上盒 子找站长问一下,这书好像是他写的
 
谢谢文生。得到提醒后我到盒子上去问了。如果那边先有答案我再贴到这里来大家看。
 
原来都是用163邮箱试的,总是这样失败。刚才改用QQ邮箱发,竟然可以群发10个。这样说的话是不是163的邮箱限制啊。但是foxmail用163邮箱可以群发一堆都没有问题,为什么?郁闷。
 
http://www.pmit.com.cn/printpage.asp?ArticleID=1240

好像是提示邮箱太满了吧,因为这个信息是SMTP服务器的信息
SMTP :559 Error

所以换个邮箱看看,可能163有什么特别的技术
 
现在的163免费邮箱有2G,我只有10来封邮件在里面,肯定不是邮箱容量问题,用Foxmail群发就可以,用例子程序就报错,唉。邮件服务器配置改为QQ或者sohu等邮箱就没问题。
163不知道用了什么技术来防垃圾邮件吧。不知道foxmail又是怎么发的。
 
自己做个邮件服务器。
 
发邮件:
在控件栏的INDY CLIENTS栏里,放入IdSMTP1
在控件栏的INDY MISC栏里,放入IdSMTP1 和一个OpenDialog1
edit1为发送到的地址
edit2为次数
edit3为 服务器
edit4为断口,一般是25
edit5为帐号
edit6为密码
edit7为发送封数
edit10为延迟毫秒数
edit8为主题
edit9为附件路径
RadioButton1.caption 为 "发送到"
CheckBox1.caption 为"发送人"
CheckBox2.caption 为"以HTML格式发送"
CheckBox3.caption为"添加附件"
定义全局变量 noloop:boolean;
将IdSMTP1的ASCLLFILTER属性设置为true
定义函数
function Isemail(var email:string):boolean;
begin
if (pos('@',email)>1) and (pos('.',email)>3) then
result:=true
else
result:=false;
end;
窗体创建时的代码为
procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.text:='baobao2601@qianlong.com';
edit2.text:='1';
edit3.Text:='smtp.263.net';
edit4.text:='25';
edit5.text:='baobao2601';
edit6.text:='1756520';
edit7.Text:='1';
edit10.text:='1000';
end;
打开附件按钮的代码为
procedure TForm1.Button2Click(Sender: TObject);
begin
OpenDialog1.Filter:= '所有文件(*.*)|*.*';
if Opendialog1.Execute then
Edit9.Text:=Opendialog1.FileName;
end;

服务器的文本框的改变代码为
procedure TForm1.Edit3Change(Sender: TObject);
var
s:integer;
adr:string;
begin
s:=pos('.',Edit3.Text);
adr:=copy(Edit3.Text,s+1,Length(Edit3.Text));
Label2.Caption:=Edit5.Text+'@'+adr;
end;

帐号文本框的离开代码为
procedure TForm1.Edit5Exit(Sender: TObject);
var
s:integer;
adr:string;
begin
s:=pos('.',Edit3.Text);
adr:=copy(Edit3.Text,s+1,Length(Edit3.Text));
Label2.Caption:=Edit5.Text+'@'+adr;
end;

发送按钮的代码为
procedure TForm1.Button1Click(Sender: TObject);
var recname,r,i,s,f:integer;
mail:string;
mailfile:Textfile;
begin
s:=0;
f:=0;
if Edit7.Text='0' then Edit7.Text:='1';
for i:=1 to StrToInt(Edit7.Text) do
begin
if noloop then break;
mail:=Edit1.Text;
if Isemail(mail)=false then
begin
showmessage('请输入正确的邮件地址');
exit;
end;
if CheckBox1.Checked=false then
begin
showmessage('请选择发件人1');
exit;
end;
IdSMTP1.AuthenticationType := atLogin;
IdSMTP1.username:= Edit5.Text;
IdSMTP1.Password := Edit6.Text;
IdSMTP1.Host := Edit3.Text;
IdSMTP1.Port :=StrTOInt(Edit4.Text);
if CheckBox3.Checked then
IdMessage1.ContentType:='text/html, charset=gb2312';
try
IdSMTP1.Connect;
except
Memo2.Lines.Add('连接服务器'+Edit3.Text+'失败');
end;
IdMessage1.Subject:=Edit8.Text; //主题
IdMessage1.Recipients.EMailAddresses:=Edit1.Text; //地址
IdMessage1.From.Address:=Label2.caption;
IdMessage1.Body.Clear;
IdMessage1.Body.Assign(Memo1.Lines);
if CheckBox3.Checked then
TIdAttachment.Create(IdMessage1.MessageParts, Edit9.Text);
try
IdSMTP1.Send(IdMessage1);
Memo2.Lines.Add(Label2.Caption+'发送邮件到'+Edit1.Text+'成功');
inc(s);
except
Memo2.Lines.Add(Label2.Caption+'发送邮件到'+Edit1.Text+'失败');
inc(f);
end;
IdSMTP1.Disconnect;
sleep(strtoint(Edit10.Text)); //end try
end; //end for
Memo2.Lines.Add('发送完毕!成功发送'+IntToStr(s)+'封,失败'+IntToStr(f)+'封');
end;
再改一下就可以群发了,群发的地址,可以放在txt文件里,然后读取
 
楼上的和例子程序没什么区别。没有说出解决办法。
盒子上cnxxx提示的对,地址分割就行了。

s:='';//var s:string;
for i := 0 to ListBox1.Items.Count - 1 do
begin //将地址分割用于一次发出而不是多次发出
s :=s+ListBox1.Items.Strings)+';';
end;
SendEmail(s);
IdSMTP1.Send(IdMessage1);
结束。谢谢各位。
 
后退
顶部