关于indy控件发smtp邮件的问题?请各位指点!

angowb 2003-09-11 05:21:27
1。用smtp.163.com做发件服务器,老是被163smtp服务器阻塞,但用foxmail发就不会有这个问题,请指点?

2。smtp服务器需要验证,调用Authenticate() 调用结果为false,却能发送???为什么(我想先调用Authenticate()函数,检查是否通过验证)

代码:
//---------------------------------------------------------------------------

void __fastcall TfrmMail::bbtnOkClick(TObject *Sender)
{
if(ADODataSet1->Active)
{
ADODataSet1->Close();
}
ADODataSet1->CommandText = "select * from UserTable where UserID = " + IntToStr(CUID);
ADODataSet1->Open();
SmtpUserEmail = ADODataSet1->FieldByName("email")->Value;
SmtpAuthType = ADODataSet1->FieldByName("SmtpAuthType")->Value ? 1 : 0;
SmtpUserId = ADODataSet1->FieldByName("SmtpUserId")->Value;
SmtpPwd = ADODataSet1->FieldByName("SmtpPwd")->Value;
SmtpHost = ADODataSet1->FieldByName("SmtpHost")->Value;
SmtpPort = ADODataSet1->FieldByName("SmtpPort")->Value;

IdMsgSend->Clear();
IdMsgSend->Subject = edtSubject->Text; //{ Subject: header }
IdMsgSend->Body->Assign(Memo1->Lines);
IdMsgSend->Recipients->EMailAddresses = edtTo->Text; //{ To: header }
IdMsgSend->CCList->EMailAddresses = edtCC->Text;// {CC}
IdMsgSend->BccList->EMailAddresses = edtBCC->Text; //{BBC}
IdMsgSend->Priority = TIdMessagePriority(cboPriority->ItemIndex);// { Message Priority }
SetAttachment();

switch (SmtpAuthType)
{
// {authentication settings}
case 0:
SMTP->AuthenticationType = atNone;
break;
case 1:
SMTP->AuthenticationType = atLogin; //{Simple Login}
break;
}

SMTP->Host = SmtpHost; //SmtpServerName;
SMTP->Port = SmtpPort; //SmtpServerPort;
SMTP->UserId = SmtpUserId; //SmtpServerUser;
SMTP->Password = SmtpPwd; //SmtpServerPassword;
IdMsgSend->From->Text = SmtpUserEmail; //from address UserEmail;

if (chkReturnReciept->Checked)
{
IdMsgSend->ReceiptRecipient->Text = IdMsgSend->From->Text; //{We set the recipient to the From E-Mail address }
}
else
{
IdMsgSend->ReceiptRecipient->Text = ""; //{indicate that there is no receipt recipiant}
}


if(!SMTP->Connected())
{
SMTP->Connect();
}


if(!SMTP->Connected())
{
MessageBox(this->Handle,"连接失败", "Infomation", MB_OK | MB_ICONINFORMATION);
}

// TStringList *strs = SMTP->AuthSchemesSupported;
// for(int i = 0; i < strs->Count; i++)
// {
// ShowMessage(strs->Strings[i]);
// }

//?????????????????????????????????????????????????????????????????
//调用结果为false,却能发送???
//?????????????????????????????????????????????????????????????????
if(SMTP->Authenticate())
{
MessageBox(this->Handle,"SMTP服务器需要身份验证", "Infomation", MB_OK | MB_ICONINFORMATION);
}

try
{
SMTP->Send(IdMsgSend);
MessageBox(this->Handle,"发送成功", "Infomation", MB_OK | MB_ICONINFORMATION);
}
catch(...)
{
MessageBox(this->Handle,"发送失败", "Infomation", MB_OK | MB_ICONINFORMATION);
}
if(SMTP->Connected())
{
SMTP->Disconnect();
}
}
//---------------------------------------------------------------------------
...全文
79 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
angowb 2003-09-12
  • 打赏
  • 举报
回复
up
angowb 2003-09-12
  • 打赏
  • 举报
回复
up
angowb 2003-09-12
  • 打赏
  • 举报
回复
to invalid(空心菜) 大侠:
我想应该调用登陆验证,如果验证成功则发送邮件,否则不发送邮件,所以不能在send()之后调用Authenticate()啊
invalid 2003-09-12
  • 打赏
  • 举报
回复
IdSMTP是在发送前才进行身份验证的吧。
那么你调用验证是就是失败了(因为还没有验证)。
你试试在发送后调用一下。
angowb 2003-09-12
  • 打赏
  • 举报
回复
请各位高手指点啊
thp 2003-09-11
  • 打赏
  • 举报
回复
关注
使用TIdAntiFreeze对抗“冻结”   Indy使用一个特殊的组件TIdAntiFreeze来透明地解决客户程序用户界面“冻结”的问题。TIdAntiFreeze在Indy内部定时中断对栈的调用,并在中断期间调用Application.ProcessMessages方法处理消息,而外部的Indy调用继续保存阻塞状态,就好像TIdAntiFreeze对象不存在一样。你只要在程序中的任意地方添加一个TIdAntiFreeze对象,就能在客户程序中利用到阻塞式Socket的所有优点而避开它的一些显著缺点。   Indy使用了线程技术   阻塞式Socekt通常都采用线程技术,Indy也是如此。从最底层开始,Indy的设计都是线程化的。因此用Indy创建服务器和客户程序跟在Unix下十分相似,并且Delphi的快速开环境和Indy对WinSock的良好封装使得应用程序创建更加容易。   Indy服务器模型   一个典型的Unix服务器有一个或多个监听进程,它们不停地监听进入的客户连接求。对于每一个需要服务的客户,都fork一个新进程来处理该客户的所有事务。这样一个进程只处理一个客户连接,编程就变得十分容易。   Indy服务器工作原理同Unix服务器十分类似,只是Windows不像Unix那样支持fork,而是支持线程,因此Indy服务器为每一个客户连接分配一个线程。   图1显示了Indy服务器的工作原理。Indy服务器组件创建一个同应用程序主线程分离的监听线程来监听客户连接求,对于接受的每一个客户,都创建一个新的线程来为该客户提供服务,所有与这一客户相关的事务都由该线程来处理。   使用组件TIdThreadMgrPool,Indy还支持线程池。   线程与Indy客户程序   Indy客户端组件并未使用线程。但是在一些高级的客户程序中,程序员可以在自定义的线程中使用Indy客户端组件,以使用户界面更加友好。

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧