indy简单的邮件发送问题,高分求解!!! ( 积分: 150 )

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

lczh8420

Unregistered / Unconfirmed
GUEST, unregistred user!
大家看看下面的一段代码:为什么老是出错呢?
type
IdSMTP: TIdSMTP;
IdMsgSend: TIdMessage;
mmContent: TMemo;
edtTo: TEdit;
edtSubject: TEdit;
edtFrom: TEdit;
edtSrvPw: TEdit;
edtSrvUser: TEdit;

procedure TEmailForm.Button1Click(Sender: TObject);
begin
{ 根据用户所填写的内容创建邮件 }
with IdMsgSend do
begin
Body.Assign(mmContent.Lines); //邮件正文
From.Text := edtFrom.Text; //邮箱名称
Subject := edtSubject.Text; //邮件主题
From.Address := Trim(edtFrom.Text); //发件人地址
Recipients.EMailAddresses := Trim(edtTo.Text); //收件人地址
Priority := mpNormal; { Message Priority }
IdMsgSend.ContentType:= 'text/plain';

CCList.EMailAddresses := edtTo.Text; {CC}
BccList.EMailAddresses := edtTo.Text; {BBC}
end;

{ 发送邮件 }
with IdSMTP do
begin
Host := 'mx.mail.163.com'; // 将Host赋值为目的地
Port := 25; // smtp服务默认的端口为25
IdSMTP.AuthenticationType := atNone;

Username := edtSrvUser.Text;
Password := edtSrvPw.Text;

try
Connect; //连接到服务器
Send(IdMsgSend); //发送刚才创建的邮件
ShowMessage('发送完毕'); //发送完毕后提示
finally
Disconnect; //断开服务器连接
end;
end;
end;
 
大家看看下面的一段代码:为什么老是出错呢?
type
IdSMTP: TIdSMTP;
IdMsgSend: TIdMessage;
mmContent: TMemo;
edtTo: TEdit;
edtSubject: TEdit;
edtFrom: TEdit;
edtSrvPw: TEdit;
edtSrvUser: TEdit;

procedure TEmailForm.Button1Click(Sender: TObject);
begin
{ 根据用户所填写的内容创建邮件 }
with IdMsgSend do
begin
Body.Assign(mmContent.Lines); //邮件正文
From.Text := edtFrom.Text; //邮箱名称
Subject := edtSubject.Text; //邮件主题
From.Address := Trim(edtFrom.Text); //发件人地址
Recipients.EMailAddresses := Trim(edtTo.Text); //收件人地址
Priority := mpNormal; { Message Priority }
IdMsgSend.ContentType:= 'text/plain';

CCList.EMailAddresses := edtTo.Text; {CC}
BccList.EMailAddresses := edtTo.Text; {BBC}
end;

{ 发送邮件 }
with IdSMTP do
begin
Host := 'mx.mail.163.com'; // 将Host赋值为目的地
Port := 25; // smtp服务默认的端口为25
IdSMTP.AuthenticationType := atNone;

Username := edtSrvUser.Text;
Password := edtSrvPw.Text;

try
Connect; //连接到服务器
Send(IdMsgSend); //发送刚才创建的邮件
ShowMessage('发送完毕'); //发送完毕后提示
finally
Disconnect; //断开服务器连接
end;
end;
end;
 
给你一段以前我写的代码:
//------以下为验证邮件组成是否完整----------------------
if Trim(Edit1.Text)='' then //判断收件人地址是否为空;
begin
StatusBar1.Panels[2].Text:='编辑邮件'; //恢复原设置
Application.MessageBox('收件人地址不能为空!','提示',MB_OK OR MB_ICONINFORMATION);
Edit1.SetFocus;
ToolButton9.Enabled:=True;
exit;
end;
//-----以下为判断电子邮件地址是否合法;
if Trim(Edit1.Text)<>'' then
begin
if NOT IsEmail(Trim(edit1.Text)) then
begin
StatusBar1.Panels[2].Text:='编辑邮件'; //恢复原设置
Application.MessageBox('电子邮件地址不合法!','提示',MB_OK OR MB_ICONINFORMATION);
Edit1.SetFocus;
Edit1.SelectAll;
exit;
end;
end;
//-----以上为判断电子邮件地址是否合法;
if Trim(Edit3.Text)='' then //判断邮件主题是否为空;
begin
StatusBar1.Panels[2].Text:='编辑邮件';
Application.MessageBox('邮件主题不能为空!','提示',MB_OK OR MB_ICONINFORMATION);
Edit3.SetFocus;
Exit;
end;
//------以下为验证邮件组成是否完整----------------------
{以下为构造邮件体}
//---------------以下为构造邮件体 --------------
IdMessage1.Subject :=Trim('SB'+Trim(Edit3.Text)); //标题 注:上报的主题中都有:'SB‘两个字母;
IdMessage1.Body.Assign(Memo1.Lines); //正文
IdMessage1.Recipients.EMailAddresses :=Trim(Edit1.Text); //收信人地址
//---------------以上为构造邮件体 --------------
{以上为构造邮件体}
Initializtion_email;{初始化邮件服务器配置}
//以下为连接到:SMTP 服务器
IdSMTP1.Disconnect;
Try
IdSMTP1.Connect;
except
begin
StatusBar1.Panels[2].Text:='无法连接到邮件服务器:'+IdSMTP1.Host;
Application.MessageBox(Pchar('无法连接到邮件服务器:'+IdSMTP1.Host+#13+'请检查邮件服务器配置是否完整、正确!'),'提示',MB_OK OR MB_ICONINFORMATION);
exit;
end;
end; //end try
//以上为连接:SMTP邮件服务器;
//-----以下为邮件服务器验证--------------------
//验证身份
if (IdSMTP1.AuthSchemesSupported.IndexOf('LOGIN')<>-1) then
begin //服务器要求验证
StatusBar1.panels[2].text:='服务器要求进行身份验证';
IdSMTP1.AuthenticationType :=atLogin;
StatusBar1.Panels[2].Text:='服务器开始进行身份验证';
try
if IdSMTP1.Authenticate then //通过验证
StatusBar1.Panels[2].text:='服务器通过身份验证'
else
StatusBar1.panels[2].text:='服务器验证失败';
except begin
StatusBar1.Panels[2].Text:='服务器验证失败';
IdSMTP1.Disconnect ; //异常刚断开连接
end
end; //end try
end
else begin //服务器不要求验证
StatusBar1.Panels[2].Text:='服务器不需要身份验证';
end;
//-----以上为邮件服务器验证--------------------
//--------------以下代码为表示发送信件---------
StatusBar1.Panels[2].Text:='正在发送邮件,请稍后......';
try
IdSMTP1.Send(IdMessage1);
StatusBar1.Panels[2].Text:='邮件发送成功!';
Send_nip_add;//将邮件的信息记录入数据库;
Clear_list;//初始化发件箱;
Application.MessageBox('邮件发送成功!','提示',MB_OK OR MB_ICONINFORMATION);
except
StatusBar1.panels[2].text:='邮件发送失败!';
end;
IdSMTP1.Disconnect ; //发送完后断开连接
StatusBar1.Panels[2].Text:='SMTP:';
end;


注:
procedure TEmail_mainfrm.Initializtion_email;
var
fi:TiniFile; //定义:INI文件变量;
fn:string;
begin
//以下为从INI文件中获取:发送邮件服务器的的相关参数,即初始化邮件服务器属性;
fn:=ExtractFilePath(Paramstr(0))+'mail.ini';
fi:=TiniFile.Create(fn);
try
IdSMTP1.Host :=fi.ReadString('MAILINFO','sHOST',''); //获得:邮件服务器名称
IdSMTP1.Port :=strtoint(Trim(fi.ReadString('MAILINFO','sPORT',''))); //获得:邮件服务器端口号;
IdSMTP1.Username:=fi.ReadString('MAILINFO','user_name',''); //获得用户名
IdSMTP1.Password:=fi.ReadString('MAILINFO','user_pwd',''); //获得用户密码
IdMessage1.From.Address:=fi.ReadString('MAILINFO','email_address','');//获得发信人电子邮件地址
finally
fi.Free;
end;
//以上为从INI文件中读取:发送邮件服务器的相关配置参数,即初始化邮件服务器属性;
end;
 
弹出的错误提示是:EIDProtocolReplyError with message'Reject by MX Filter BlackList(ccDRKuyQVEJL2OQD.2.X.20)' .各位DFW们,帮帮忙啊.急!急!急啊!!!
 
TO myweb_pch:
谢谢您的作答,您发给我的我也是这么写的,可是为什么运行到 IdSMTP1.Send(IdMessage1);得时候就会弹出上面的错误呢?我不得起解.能给我讲一下原因吗?
 
呵呵,你也看到了'Reject by MX Filter BlackList(ccDRKuyQVEJL2OQD.2.X.20)。
因为,有很多群发邮件都是用Indy做的,所以163把Indy给封了
Indy发送的时候,会有标识,而163看到这个标识,就会拒绝服务
当然了,还有其它的邮箱会拒绝Indy
你所要做的就是自己从Indy源代码中把该标识删除(找到IDMessage.pas,再其中搜索Values['X-Library'] ,把它所在的行注释掉,然后保存,重新编译控件包,或者重新安装控件,要么把这个单元加入工程也可以。)
,或者使用新版本的Indy,新版本Indy已经不带有标识了
 
楼上说得对注释掉Values['X-Library']
 
to twos,jfyes:
我用的是indy 9版本的,已经删除了Values['X-Library'] ;
为什么还是弹出该错误来呢?谢谢您们的答复,可是问题还是不能解决的.
 
163的就是不行,而tom的就可以?能给个解释嘛?大家给点意见啊.谢谢
 
IdSMTP.AuthenticationType := atNone;
是不是必须认证才可以?
改成 IdSMTP.AuthenticationType := atLogin; 试试看
 
to twos:
这个我也试过了,效果一样的.
应该是163阻止用indy发送邮件吧,但是如何绕过他呢?实在不知道怎么办了[:(]
请高手指导啊,分不够再加......
 
不会吧?我去年还可以发的
难道今年又做什么手脚了?
你还有其它的邮箱吧?
你用tom的邮箱给我发封信,我看一下
我的地址
twos@etang.com
 
to twos:
已发送,请接收,那个你打开的时候可能会出现问题.因为我用的是indy 9控件.而代码里面的是老版本的.再老版本上运行应该没关系.
请帮我指正一下,谢谢
 
注释掉Values['X-Library'],重新编译一下indy组件包,再编译程序就可以啦
 
给你一段我自己写的代码,超精简! 保证100%可以发EMAIL````` 我测试过了

procedure TForm1.Button1Click(Sender: TObject);
begin
try
IdSMTP1.AuthenticationType:=atLogin; //设置登陆类型
IdSMTP1.Username:=Edit1.Text; //设置登陆帐号
IdSMTP1.Password:=Edit2.Text; //设置登陆密码
IdSMTP1.Host:=Edit3.Text; //设置SMTP地址
IdSMTP1.Port:=strtoint(Edit4.Text); //设置端口 必须转化为整型
IdSMTP1.Connect; //开始连接服务器
except
Showmessage('连接失败,请重试!');
Exit; //连接失败 的话 退出该执行过程
end;
IdMessage1.Body.Clear; //先清空上次发送的内容
IdMessage1.Subject:=Edit5.Text; //设置邮件发送的标题
IdMessage1.Body.Assign(Memo1.Lines); //设置邮件发送的主体
IdMessage1.From.Address:=Edit6.Text; //设置邮件的发件人 也就是说该邮件来自什么地方
IdMessage1.Recipients.EMailAddresses:=Edit7.Text; //收件人的地址
try
idSMTP1.Send(IdMessage1);
Showmessage('邮件发送成功!');
except
Showmessage('邮件发送失败!');
end;

end;
 
虽然问题没有解决,但是我还是给大家发分算了,唉.你们说的我都试过了,可以的话我就不用请教大家了.tom是可以的,就是163和sina的怎么都不行.不管了先转发算了.慢慢解决吧[:(]
 
后退
顶部