利用idsmtp和idmessage编写一个发送邮件的小程序有问题啊(100分)

  • 主题发起人 主题发起人 qq01949
  • 开始时间 开始时间
Q

qq01949

Unregistered / Unconfirmed
GUEST, unregistred user!
利用idsmtp和idmessage编写一个发送邮件的小程序,但执行后总出现“already connected”,并且邮件发送不成功,何解??谢谢
附部分代码:
procedure TForm1.Button2Click(Sender: TObject);
begin
idmessage1.From.Address:=edit_from.Text;
idmessage1.From.Name:=edit_username.Text;
idmessage1.Recipients.EMailAddresses:=edit_to.Text;
idmessage1.Subject:=edit_subject.Text;
idmessage1.Body.Add(memo1.Text);
tidattachment.Create(idmessage1.MessageParts,edit_file.Text);
idsmtp1.Host:=edit_smtp.Text;
idsmtp1.Username:=edit_username.Text;
idsmtp1.Password:=edit_password.Text;
idsmtp1.AuthenticationType:=atlogin;
idsmtp1.Connect;
idsmtp1.Send(idmessage1);
end;
 
idsmtp1.Connect; 没有看到disconnect
第一次应该可以,后面就不行了。
 
Delphi开发WEBMAIL程序


通常,实现WEBMAIL采用mailto.exe的CGI、在HTML文件中写入“< form action="mailto:电子邮箱地址" method=post >”语句或者调用WINDOWS API函数。采用WINDOWS API 和在HTML文件中写入“< form action="mailto:电子邮箱地址" method=post >”语句都要求用户的浏览器装入EXCHANGE、OUTLOOKEXPRESS、或OUTLOOK等软件,而且还有一些浏览器不支持MAILTO语句。而采用CGI的形式实现WEBMAIL对用户的浏览器没有要求,但效率不高。CGI技术正在逐渐被ISAPI/NSAPI技术所取代。本文就来讨论一下采用ISAPI技术实现WEBMAIL。


使用Delphi 4开发Web Server程序是非常简单的,Delphi 4中提供了大量的元件和对象,支持Web Server程序的开发。 下面通过一个例子来介绍如何利用DELPHI开发一个响应用户输入的ISAPI的WEBMAIL程序。只有在发送服务器上注册的用户才能通过在浏览器发送邮件。为了简单,程序没有对传送的数据提供保密。


首先,在WEB服务器端安装数据库引擎dbe

并设置好数据库别名:yh

指向一个包含用户名和用户密码的数据库文件user.db。接着建立两个HTML文件,名字分别为:dl.html

qd.html,放在WEB服务器的缺省目录下(如:C:/INETPUB/WWWROOT)。


dl.html的内容如下:


< html >


< head >< title > 发送邮件系统< /title >< /head >


< body >


< h1 >发送邮件系统< /h1 >


< p > 请输入您的用户名及密码。< /p >


< form method=”post” action="/scripts/xsmd" >


< p >用户名:< input type="text" length=10


name="username" >


密码:< input type="password"


length=10 name="password" >< /p >


< p >< input type="submit" value="确定" >


< input type="reset" value="清除" >< /p >


< /form >


< /body >


< /html >


qd.html文件内容如下:


< html >< head >< title >填表< /title >< /head >


< body >


< form method=”post” action="feedback" >


< p >请填入接收邮件地址:toaddress:


< input type=”text” length=20


name=”toaddress” >< /p >


< p >请填入主题。< input type="text"


length=20 name="subject" >< /p >


< p >内容:< /p >


< p >< input type=“textarea”length=40


width=40 name=”body” >< /p >


< p >< input type="submit" value="确定" >


< input type="reset" value="清除" >< /p >


< /form >


< /body >


< /html >



在DELPHI中新建一个基于ISAPI的WEB SERVER APPLICATION,手动增加nmsmtp1

query1

pageproducer1。


其中:pageproducer1的property: htmlfile:c:/inetpub/www.root/qd.html。nmsmtp1的 property:host(发送邮件服务器的地址。)在这里为smtp.netease.com.。port:25。 全局变量为: sername:string;flag:boolean;


增加一个路径为/feedback的动作项,其代码如下:


procedure TWebModule1.WebModule1WebActionItem1


Action(Sender: TObject;


Request: TWebRequest; Response:


TWebResponse; var Handled: Boolean);


Var Count:integer;


S:string;


Begin


Query1.close;


Query1.sql.clear;


S:=’select count(username) from


user.db where username=”’;


S:=s+request.contentfields.values[‘username’]+’”’;


S:=s+’ and password=”’;


S:=s+request.contentfields.values[‘psword’]+’”’;


Query1.sql.add(S);


Query1.open;


If query1.count=0


then response.content:=’< html >< head >< title >


< /title >< body >用户名、密码不正确,请重新输入


< /body >< /html >’


Else


Username:=request.contentfields.values[‘username’];


Response.content:=pageproducer1.content;


End;




再增加一个路径为/sendmail 的动作项,


它的程序代码如下:


procedure TWebModule1.WebModule1Web


ActionItem2Action(Sender: TObject;


Request: TWebRequest; Response:


TWebResponse; var Handled: Boolean);


Var body:string;


Begin


Flag:=true;


body:=request.contentfields.values[‘body’];


Pageproducer1.htmldoc.clear;


Pageproducer1.htmldoc.add(‘< html >< body >’);


Nmsmtp1.postmessage.clear;


Nmsmtp1.postmessage.fromaddress:=username+


’@netease.com’;


Nmsmtp1.postmessage.from:=username;


Nmsmtp1.postmessage.body.add(body);


Nmsmtp1.postmessage.toaddress.add


(request.contentfields.values[‘toaddress’]);


Nmsmtp1.postmessage.subject:=


request.contentfields.values[‘subject’];


Nmsmtp1.connect;


If flag=true then begin Nmsmtp1.sendmail;


nmsmtp1.disconntent;end


pageproducer1.htmldoc.add


(‘< /body >< /html >’);


response.content:=pageproducer1.content;




end;




增加nmsmtp1的事件如下:


procedure TWebModule1.NMSMTP1Connect(Sender: TObject);


begin


pageproducer1.htmldoc.add


('< p >已经和发送邮件服务器连接< /p >');


end;




procedure TWebModule1.NMSMTP1Connection


Failed(Sender: TObject);


begin


flag:=false;


pageproducer1.htmldoc.add


('< p >连接失败< /P >');


end;




procedure TWebModule1.NMSMTP1ConnectionRequired


(var Handled: Boolean);


begin


pageproducer1.htmldoc.add('< p >要求进行连接< /p >');


end;






procedure TWebModule1.NMSMTP1Failure(Sender: TObject);


begin


pageproducer1.htmldoc.add('< p >发送邮件失败< /p >');


flag:=false;


end;




procedure TWebModule1.NMSMTP1Header


Incomplete(var handled: Boolean;


hiType: Integer);


begin


pageproducer1.htmldoc.add('< p >head不完整< /p >');


flag:=false;


end;






procedure TWebModule1.NMSMTP1InvalidHost


(var Handled: Boolean);


begin


pageproducer1.htmldoc.add('< p >


发送邮件服务器地址无效< /p >');


flag:=false;


end;






procedure TWebModule1.NMSMTP1RecipientNot


Found(Recipient: String);


begin


pageproducer1.htmldoc.add


('< p >接受邮件地址不正确< /p >');


flag:=false;


end;






procedure TWebModule1.NMSMTP1Success(


Sender: TObject);


begin


pageproducer1.htmldoc.add('< p >


成功发送邮件< /p >');


end; 

将project存为sendmail.dpr,编译后放到WEB服务器的可执行文件路径下(如:c:/intpub/scripts)

即可响应HTML文件dl.htm的用户输入,并且如果用户的用户名及密码正确则可进入发送邮件的页面,用户填写接受邮件地址及主题、内容后即可发送邮件。此程序在NT SERVER上调试通过。
 
delphi7中已没有nmsmtp了
 
我好像是这样做的:
if idsmtp1.Connected then idsmtp1.Disconnect;
idsmtp1.Connect;

好像POP3也有这个问题
 
procedure TForm1.Button2Click(Sender: TObject);
begin
idsmtp1.disconnect ;
idmessage1.From.Address:=edit_from.Text;
idmessage1.From.Name:=edit_username.Text;
idmessage1.Recipients.EMailAddresses:=edit_to.Text;
idmessage1.Subject:=edit_subject.Text;
idmessage1.Body.Add(memo1.Text);
tidattachment.Create(idmessage1.MessageParts,edit_file.Text);
idsmtp1.Host:=edit_smtp.Text;
idsmtp1.Username:=edit_username.Text;
idsmtp1.Password:=edit_password.Text;
idsmtp1.AuthenticationType:=atlogin;
idsmtp1.Connect;
idsmtp1.Send(idmessage1);
end;
试试吧!
 
procedure TfmMail.SpeedButton2Click(Sender: TObject);
var
fmErrorDlg :TfmErrorDlg;
fmHintDlg :TfmHintDlg;
iId :integer;
begin
//检查输入框是否正确
//定义邮件信息
//连接SMTP服务器
//连接成功的话,发送邮件,并将邮件写入已发送邮件中
//断开SMTP服务器,提示已成功发送
if leToAddress.Text = '' then
begin
fmErrorDlg := TfmErrorDlg.Create(self);
fmErrorDlg.lMsg1.Caption := '';
fmErrorDlg.lMsg2.Caption := '收件箱地址必须填写,请';
fmErrorDlg.lMsg3.Caption := '查看...';
fmErrorDlg.ShowModal;
fmErrorDlg.Free;
leToAddress.SetFocus;
Exit;
end;

if leSubject.Text = '' then
begin
fmHintDlg := TfmHintDlg.Create(self);
fmHintDlg.lMsg1.Caption := '您将要发送的邮件尚无主题,您';
fmHintDlg.lMsg2.Caption := '确定要发送吗?单击[确定]发送';
fmHintDlg.lMsg3.Caption := '单击[取消]取消发送。';
fmHintDlg.ShowModal;
fmHintDlg.Free;
if not bIsOkButtonClicked then
begin
leSubject.SetFocus;
Exit;
end;
end;

adqTemp.Close;
adqTemp.SQL.Clear;
adqTemp.SQL.Add('select * from Mail where Default = 1');
adqTemp.Open;
if not adqTemp.Eof then
begin
IdSMTP1.Username := adqTemp.FieldByName('UserID').AsString;
IdSMTP1.Password := adqTemp.FieldByName('PassWord').AsString;
IdSMTP1.Host := adqTemp.FieldByName('SMTPAddress').AsString;
end;
IdSMTP1.Port := 25;
adqTemp.Close;
// IdMailMessage.ContentType := 'text/html';
// IdMailMessage.ContentTransferEncoding := 'binary' ;
IdMailMessage.From.Address := leFromAddress.Text;
IdMailMessage.From.Name := leFromMan.Text;
IdMailMessage.Subject := leSubject.Text;
IdMailMessage.Body.Assign(mBody.Lines);
IdMailMessage.Date := Now;
IdMailMessage.Recipients.EMailAddresses := leToAddress.Text;
// IdMailMessage.ContentType := 'text/plain';
// IdMailMessage.ContentTransferEncoding := '7bit';

try
try
IdSMTP1.Connect(1000);
IdSMTP1.AuthenticationType := atLogin;
IdSMTP1.Authenticate;
IdSMTP1.Send(IdMailMessage);
adqTemp.SQL.Clear;
adqTemp.SQL.Add('select * from sendedMail order by ID DESC');
adqTemp.Open;
if adqTemp.Eof then
iId := 0
else
iId := adqTemp.FieldByName('ID').AsInteger;
adqTemp.Close;
IdMailMessage.SaveToFile(sAppPath + 'Mail/Sended/' + leToAddress.Text+IntToStr(iId + 1)+'.eml',false);
adqMail.Close;
adqMail.SQL.Clear;
adqMail.SQL.Add('select * from SendedMail');
adqMail.Open;
adqMail.Append;
adqMail.FieldByName('ID').AsInteger := iId + 1;
adqMail.FieldByName('FileName').AsString := leToAddress.Text+IntToStr(iId + 1)+'.eml';
adqMail.FieldByName('Date').AsString := FormatDateTime('YYYY-MM-DD',Now);
adqMail.Post;
except on E:Exception do
sbStatus.Panels[1].Text:= '邮件发送失败';
end;
finally
if IdSMTP1.Connected then IdSMTP1.Disconnect;
lbAnnex.Clear;
end;
 
以上是我发送邮件的代码
 
后退
顶部