SMTP组件访问邮件服务器,如果服务器需要用户身份验证这个问题我作的也不好,hezchuan168可以给我一个么,让我开开眼阿!?

解决方案 »

  1.   

    Indy的可能支持的,你去看看,现在是9.0.10版
      

  2.   

    我的程序,用nmsmtp,身份验证成功var
      Form1: TForm1;
      AuthSucc:boolean;// 是否需要密码验证
    const BaseTable:string='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';implementation{$R *.dfm}function FindInTable(CSource:char):integer;
    begin
      result:=Pos(string(CSource),BaseTable)-1;
    end;function DecodeBase64(Source:string):string;
    var
      SrcLen,Times,i:integer;
      x1,x2,x3,x4,xt:byte;
    begin
      result:='';
      SrcLen:=Length(Source);
      Times:=SrcLen div 4;
      for i:=0 to Times-1 do
      begin
        x1:=FindInTable(Source[1+i*4]);
        x2:=FindInTable(Source[2+i*4]);
        x3:=FindInTable(Source[3+i*4]);
        x4:=FindInTable(Source[4+i*4]);
        x1:=x1 shl 2;
        xt:=x2 shr 4;
        x1:=x1 or xt;
        x2:=x2 shl 4;
        result:=result+chr(x1);
        if x3= 64 then break;
        xt:=x3 shr 2;
        x2:=x2 or xt;
        x3:=x3 shl 6;
        result:=result+chr(x2);
        if x4=64 then break;
        x3:=x3 or x4;
        result:=result+chr(x3);
      end;
    end;
    /////
    function EncodeBase64(Source:string):string;
    var
      Times,LenSrc,i:integer;
      x1,x2,x3,x4:char;
      xt:byte;
    begin
      result:='';
      LenSrc:=length(Source);
      if LenSrc mod 3 =0 then Times:=LenSrc div 3
      else Times:=LenSrc div 3 + 1;
      for i:=0 to times-1 do
      begin
        if LenSrc >= (3+i*3) then
        begin
          x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
          xt:=(ord(Source[1+i*3]) shl 4) and 48;
          xt:=xt or (ord(Source[2+i*3]) shr 4);
          x2:=BaseTable[xt+1];
          xt:=(Ord(Source[2+i*3]) shl 2) and 60;
          xt:=xt or (ord(Source[3+i*3]) shr 6);
          x3:=BaseTable[xt+1];
          xt:=(ord(Source[3+i*3]) and 63);
          x4:=BaseTable[xt+1];
        end
        else if LenSrc>=(2+i*3) then
        begin
          x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
          xt:=(ord(Source[1+i*3]) shl 4) and 48;
          xt:=xt or (ord(Source[2+i*3]) shr 4);
          x2:=BaseTable[xt+1];
          xt:=(ord(Source[2+i*3]) shl 2) and 60;
          x3:=BaseTable[xt+1];
          x4:='=';
        end else
        begin
          x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
          xt:=(ord(Source[1+i*3]) shl 4) and 48;
          x2:=BaseTable[xt+1];
          x3:='=';
          x4:='=';
        end;
        result:=result+x1+x2+x3+x4;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
       MailTo,MailBody:TStringList;
       i:integer;
    begin
    Nmsmtp1.Host :=Editsmtpadd.Text ;
    nmsmtp1.Port :=StrToInt(Editsmtpport.Text);
    nmsmtp1.UserID :=Editsmtpusername.Text ;
    ////////////'liubojj';//发信人的用户名,必须是真实的
    nmsmtp1.ReportLevel :=1;
    Nmsmtp1.TimeOut :=10000;
    try
      nmsmtp1.Connect ;    ///连接
    except
      Memo2.Lines.Add('无法连接服务器!');
    end;if AuthSucc=true then ////验证成功
    begin
      MailTo:=TStringList.Create;
      MailBody:=TStringList.Create;
      MailTo.Add('[email protected]');
      if EditTo2.Text <>'' then
         MailTo.add(EditTo2.Text );
    //  for  i:=0  to Memo1.Lines.Count-1  do
     // begin
         MailBody.AddStrings(Memo1.lines);
     // end;
    //  MailBody.Add('Hello it is a test');
      nmsmtp1.PostMessage.FromAddress:=Edit_From.text;
      //////'[email protected]'; //发信人的电子邮件地址
      nmsmtp1.PostMessage.ToAddress :=MailTo;
      nmsmtp1.PostMessage.Body:=MailBody;
      nmsmtp1.PostMessage.Subject :=Edit_subject.Text;//////////'My test';
      Mailto.Clear ;
      //Mailto.Add('c:\a.txt');
      //Mailto.Add('c:\b.txt');
      //nmsmtp1.PostMessage.Attachments:=MailTo; 附件
      MailTo.Free ;
      MailBody.Free;
      nmsmtp1.TimeOut :=10000;
      nmsmtp1.SendMail;
      nmsmtp1.Disconnect;end;end;procedure TForm1.appevException(Sender: TObject; E: Exception);
    begin
      //showmessage('appevexception');
    end;procedure TForm1.appevMessage(var Msg: tagMSG; var Handled: Boolean);
    begin
      //listbox1.Items.Add('message');
      //form1.caption:=inttostr(listbox1.Count);
       // s := SysErrorMessage(ErrCode);
    end;
    procedure TForm1.CheckBox1Click(Sender: TObject);
    begin
      if CheckBox1.Checked  then
      begin
         Lblsmtpusername.Enabled :=true;
         Lblsmtppassword.Enabled :=true;
         Editsmtpusername.Enabled :=true;
         Editsmtppassword.Enabled :=true;
      end
      else
         begin
             Lblsmtpusername.Enabled :=false;
             Lblsmtppassword.Enabled :=false;
             Editsmtpusername.Enabled :=false;
             Editsmtppassword.Enabled :=false;
         end;end;procedure TForm1.FormCreate(Sender: TObject);
    begin
       Lblsmtpusername.Enabled :=false;
       Lblsmtppassword.Enabled :=false;
       Editsmtpusername.Enabled :=false;
       Editsmtppassword.Enabled :=false;
    end;procedure TForm1.NMSMTP1Connect(Sender: TObject);
    begin
       //////连接成功,下面用户认证过程
      StatusBar1.Panels[0].Text :=nmsmtp1.Status;
      Memo2.Lines.Add('nmsmtp1connect');
    //  label1.caption:=nmsmtp1.Status;
      if nmsmtp1.ReplyNumber = 250 then
        StatusBar1.Panels[0].Text :=nmsmtp1.Transaction('auth login'); //开始认证
      if nmsmtp1.ReplyNumber =334 then //返回值为334,让你输入用BASE64编码后的用户名
        StatusBar1.Panels[0].Text :=nmsmtp1.Transaction(EncodeBase64(Editsmtpusername.Text));// 用户名
      if nmsmtp1.ReplyNumber =334 then  // 返回值为334,让你输入用BASE64编码后的用户密码
        StatusBar1.Panels[0].Text :=nmsmtp1.Transaction(EncodeBase64(Editsmtppassword.Text)); //密码
      if nmsmtp1.ReplyNumber =235 then
      begin
        StatusBar1.Panels[0].Text :='successful';
        Memo2.Lines.Add('验证成功!');
        AuthSucc:=true;
      end;end;procedure TForm1.NMSMTP1Status(Sender: TComponent; Status: String);
    begin
      Memo2.Lines.Add(Status);
    end;procedure TForm1.NMSMTP1Success(Sender: TObject);
    begin
       Memo2.Lines.Add('邮件已经成功发送!');
    end;procedure TForm1.NMSMTP1Failure(Sender: TObject);
    begin
       Memo2.Lines.Add('邮件发送失败!');
    end;procedure TForm1.NMSMTP1HostResolved(Sender: TComponent);
    begin
       Memo2.Lines.Add('Resolved');
    end;procedure TForm1.NMSMTP1SendStart(Sender: TObject);
    begin
       Memo2.Lines.Add('nmstp1SendStart');
    end;procedure TForm1.NMSMTP1RecipientNotFound(Recipient: String);
    begin
       Memo2.Lines.Add('nmstpRecipientNotFound,Recipient: '+Recipient);
    end;procedure TForm1.NMSMTP1PacketSent(Sender: TObject);
    begin
      Memo2.Lines.Add('nmstp1PacketSent');
    end;procedure TForm1.NMSMTP1MailListReturn(MailAddress: String);
    begin
       Memo2.Lines.Add('nmstpMailListReturn,MailAddress:'+MailAddress);
    end;procedure TForm1.NMSMTP1InvalidHost(var Handled: Boolean);
    begin
       Memo2.Lines.Add('nmstpInvalidHost');
    end;procedure TForm1.NMSMTP1HeaderIncomplete(var handled: Boolean;
      hiType: Integer);
    begin
       Memo2.Lines.Add('nmstpHeaderIncomplete,hiType:'+IntToStr(hiType));
    end;procedure TForm1.NMSMTP1EncodeStart(Filename: String);
    begin
      Memo2.Lines.Add('nmstpEncodeStart,filename:'+Filename);
    end;procedure TForm1.NMSMTP1EncodeEnd(Filename: String);
    begin
       Memo2.Lines.Add('nmstpEncodeEnd,filename:'+Filename);
    end;procedure TForm1.NMSMTP1Disconnect(Sender: TObject);
    begin
       Memo2.Lines.Add('nmstpDisconnect');
    end;procedure TForm1.NMSMTP1ConnectionRequired(var Handled: Boolean);
    begin
         Memo2.Lines.Add('nmstpConnectionRequired');
    end;procedure TForm1.NMSMTP1ConnectionFailed(Sender: TObject);
    begin
       Memo2.Lines.Add('nmstpConnectionFailed');
    end;procedure TForm1.NMSMTP1AuthenticationFailed(var Handled: Boolean);
    begin
       Memo2.Lines.Add('nmstpAuthenticationFailed');
    end;procedure TForm1.NMSMTP1AttachmentNotFound(Filename: String);
    begin
       Memo2.Lines.Add('nmstpAttachmentNotFound(附近没找到),filename:'+Filename);
    end;end.
      

  3.   

    <<delphi6.0开发实务>>里面有,很不错,建议看看。