使用的是126的smtp服务器,需要身份认证    SmtpCli1->HdrFrom="[email protected]";
    SmtpCli1->HdrTo="[email protected]";
    SmtpCli1->HdrSubject="test";
    SmtpCli1->SignOn="test";
    SmtpCli1->FromName="[email protected]";
    SmtpCli1->Host="smtp.126.com";
    SmtpCli1->Port=25;
    SmtpCli1->Username="xxxx";
    SmtpCli1->Password="xxxxxxxxxxxxxx";
    SmtpCli1->Open();
    SmtpCli1->Mail();但不知道为什么总是提示    smtp component not ready

解决方案 »

  1.   

    Ics的SMTP是一个异步模式的,当调用Open的时候后台在与服务器进行连接,调用会立即返回,而这个时候,也许还没有完成连接,就再次调用Mail,当然会报Not Ready.建议可以先建立连接,等待连接建立完成之后再Mail.
      

  2.   

    请问僵哥,怎样等待连接建立完成之后再Mail?
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    const
      TimeOut:Integer = 15(*秒*)*1000;
    var
      I:Integer;
      IsTimeOut:Boolean;
    begin
      SmtpCli1.HdrFrom:='[email protected]';
      SmtpCli1.HdrTo:='[email protected]';//这个收件人,只是邮件显示的收件人,但是并不是真正的邮件接收者
      SmtpCli1.HdrSubject:='test';
      SmtpCli1.SignOn:='test';
      SmtpCli1.FromName:='xxx';
      SmtpCli1.RcptName.Add('[email protected]');//这个才是真正的邮件接收者(可是以多个)
      SmtpCli1.Host:='smtp.126.com';
      SmtpCli1.Port:='25';
      SmtpCli1.Username:='UserName';
      SmtpCli1.Password:='******';
      SmtpCli1.MailMessage.Add('Mailer Testing!');//邮件内容.
      SmtpCli1.AuthType := smtpAuthLogin;//126的需要进行验证,即ESMTP
      SmtpCli1.Open;
      I := TimeOut;
      IsTimeOut := True;
      repeat
        Application.ProcessMessages;
        if (SmtpCli1.RequestType = smtpOpen) and (SmtpCli1.State = smtpReady) then
          begin
            IsTimeOut := false;
            break;
          end;
        Sleep(1);
        Dec(I);
      until I=0;
      if IsTimeOut then
        begin
          MessageBox(Handle,'连接服务器超时!','SMTP Test',MB_OK or MB_ICONERROR);
          Exit;
        end;
      SmtpCli1.Mail;//发送
    end;#define TimeOut 15/*秒*/*1000;
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      SmtpCli1->HdrFrom = "[email protected]";
      SmtpCli1->HdrTo = "[email protected]";//这个收件人,只是邮件显示的收件人,但是并不是真正的邮件接收者
      SmtpCli1->HdrSubject = "test";
      SmtpCli1->SignOn = "test";
      SmtpCli1->FromName = "xxx";
      SmtpCli1->RcptName->Add("[email protected]");//这个才是真正的邮件接收者(可是以多个)
      SmtpCli1->Host = "smtp.126.com";
      SmtpCli1->Port = "25";
      SmtpCli1->Username = "UserName";
      SmtpCli1->Password = "******";
      SmtpCli1->MailMessage->Add("Mailer Testing!");//邮件内容.
      SmtpCli1->AuthType = smtpAuthLogin;//126的需要进行验证,即ESMTP
      SmtpCli1->Open();
      int I = TimeOut;
      bool IsTimeOut  = true;
      do{
        Application->ProcessMessages();
        if ((SmtpCli1->RequestType == smtpOpen) && (SmtpCli1->State == smtpReady))
        {
          IsTimeOut = false;
          break;
        }
        Sleep(1);
        I--;
      }while(I > 0);
      if (IsTimeOut)
      {
        MessageBox(Handle,"连接服务器超时!", "SMTP Test", MB_OK | MB_ICONERROR);
        return;
      }
      SmtpCli1->Mail();//发送
    }