敢问如何用winsock api在delphi中实现发送smtp验证邮件??我找了好多资料都没搞到!请各位高手指教,如有哪位"传奇人物"给完整无错的api代码(不用任何控件),100分奉送,另有重谢!!请大家不吝赐教哦!如果你有代码请把它发到,再跟帖说一声啊!当然你可以把它帖出来让大家分享啊,先谢各位!!!!!!!!!!

解决方案 »

  1.   

    smtp协议是文本协议。网上有资料。
    过程大概是,
    用socket发一个 "helo 主机名"
    :返回  "OK ***"
    ...
    ...
    发 “auth login” 等等验证时用base64编码,比如说你的密码是123,就需要做base64编码,把8bit换为6bit几年前写过,现在基本都亡了
      

  2.   

    用delphi标准控件TNMSMTP的不行吗?
      

  3.   

    是不可以的,因为没有验证;
    你可以用D6下的INDY组件中的IDSMTP来实现,里面有严正;如果一定要用NMSMTP的话,下面代码也许合适;linzi(林子) (2001-4-19 10:46:00)  得0分 
    //这是我写的一个演示程序,
    //窗体上有一个BUTTON控件,一个LABEL控件,一个NMSMTP控件
    //带密码险证的邮件发送程序需要BASE64编码,DecodeBase64和 EncodeBase64
    //为解码和编码函数
    //在263、163和SOHU上都能发送成功
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Psock, NMsmtp, ComCtrls;type
      TForm1 = class(TForm)
        NMSMTP1: TNMSMTP;
        Button1: TButton;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure NMSMTP1Connect(Sender: TObject);
        procedure NMSMTP1InvalidHost(var Handled: Boolean);
        procedure NMSMTP1ConnectionFailed(Sender: TObject);
        procedure NMSMTP1Status(Sender: TComponent; Status: String);
        procedure NMSMTP1SendStart(Sender: TObject);
        procedure NMSMTP1Success(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    //BaseTable为BASE64码表
    const BaseTable:string='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';var
      Form1: TForm1;
      AuthSucc:boolean;// 是否需要密码验证
      function DecodeBase64(Source:string):string; //解码函数
      function FindInTable(CSource:char):integer;  //
      function EncodeBase64(Source:string):string; //编码函数
    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;
    begin
    Nmsmtp1.Host :='smtp.sohu.com';
    nmsmtp1.Port :=25;
    nmsmtp1.UserID :='linbch';//发信人的用户名,必须是真实的
    nmsmtp1.ReportLevel :=1;
    Nmsmtp1.TimeOut :=10000;
    nmsmtp1.Connect ;    ///连接
    if AuthSucc=true then ////验证成功
    begin
      MailTo:=TStringList.Create;
      MailTo.Add('[email protected]');
      MailBody.Add('Hello it is a test');
      nmsmtp1.PostMessage.FromAddress:='[email protected]'; //发信人的电子邮件地址
      nmsmtp1.PostMessage.ToAddress :=MailTo;
      nmsmtp1.PostMessage.Body:=MailBody;
      nmsmtp1.PostMessage.Subject :='My test';
      Mailto.Clear ;
      //Mailto.Add('c:\a.txt');
      //Mailto.Add('c:\b.txt');
      //nmsmtp1.PostMessage.Attachments:=MailTo; 附件
      MailTo.Free ;
      MailBody.Free;
      nmsmtp1.SendMail;
    end;
    end;
    procedure TForm1.NMSMTP1Connect(Sender: TObject);
    begin
    //////连接成功,下面用户认证过程
      label1.caption:=nmsmtp1.Status;
      if nmsmtp1.ReplyNumber = 250 then
        label1.caption:=nmsmtp1.Transaction('auth login'); //开始认证
      if nmsmtp1.ReplyNumber =334 then //返回值为334,让你输入用BASE64编码后的用户名
        label1.caption:=nmsmtp1.Transaction('YWFhYWE=');// 用户名aaaaa
      if nmsmtp1.ReplyNumber =334 then  // 返回值为334,让你输入用BASE64编码后的用户密码
        label1.caption:=nmsmtp1.Transaction('MTIzNDU2'); //密码为123456
      if nmsmtp1.ReplyNumber =235 then
      begin
        label1.caption:='successful';
        AuthSucc:=true;
      end;
      //showmessage(label1.caption);
    end;procedure TForm1.NMSMTP1InvalidHost(var Handled: Boolean);
    begin
      label1.caption :='Invalid Host';
    end;procedure TForm1.NMSMTP1ConnectionFailed(Sender: TObject);
    begin
    label1.caption :='connect failed';
    end;procedure TForm1.NMSMTP1Status(Sender: TComponent; Status: String);
    begin
      label1.caption :=nmsmtp1.Status ;
    end;procedure TForm1.NMSMTP1SendStart(Sender: TObject);
    begin
      label1.Caption :='start send';
    end;procedure TForm1.NMSMTP1Success(Sender: TObject);
    begin
      label1.Caption:='send success!';
    end;end.
      

  4.   

    我要的是api啊,就是pkg253(as)朋友说的那样,不过没代码.不用控件啊,用控件的方法我早就会了,
      

  5.   

    看看这些东西里面的SOURCE你就明白了;
      

  6.   

    是不是二百分?我已将我写的控件发达到你的邮箱中,请查找,
    其中TLMailCS单元就是Smtp的代码,已包含验证的功能。
      

  7.   

    骗人东西,根本没收到!我再说一遍,我要的是api代码,不是什么控件,300分现在!
      

  8.   

    用MAPI
    在interface里加
    uses
     MAPI;
    function SendMailMAPI(const Subject, Body, FileName, SenderName, SenderEMail,
                      RecepientName, RecepientEMail: String) : Integer;
    var
      message: TMapiMessage;
      lpSender,
      lpRecepient: TMapiRecipDesc;
      FileAttach: TMapiFileDesc;
      SM: TFNMapiSendMail;
      MAPIModule: HModule;
    begin
      FillChar(message, SizeOf(message), 0);
      with message do
      begin
        if (Subject<>'') then
        begin
          lpszSubject := PChar(Subject)
        end;
        if (Body<>'') then
        begin
          lpszNoteText := PChar(Body)
        end;
        if (SenderEMail<>'') then
        begin
          lpSender.ulRecipClass := MAPI_ORIG;
          if (SenderName='') then
          begin
            lpSender.lpszName := PChar(SenderEMail)
          end
          else
          begin
            lpSender.lpszName := PChar(SenderName)
          end;
          lpSender.lpszAddress := PChar('SMTP:'+SenderEMail);
          lpSender.ulReserved := 0;
          lpSender.ulEIDSize := 0;
          lpSender.lpEntryID := nil;
          lpOriginator := @lpSender;
        end;
        if (RecepientEMail<>'') then
        begin
          lpRecepient.ulRecipClass := MAPI_TO;
          if (RecepientName='') then
          begin
            lpRecepient.lpszName := PChar(RecepientEMail)
          end
          else
          begin
            lpRecepient.lpszName := PChar(RecepientName)
          end;
          lpRecepient.lpszAddress := PChar('SMTP:'+RecepientEMail);
          lpRecepient.ulReserved := 0;
          lpRecepient.ulEIDSize := 0;
          lpRecepient.lpEntryID := nil;
          nRecipCount := 1;
          lpRecips := @lpRecepient;
        end
        else
        begin
          lpRecips := nil
        end;
        if (FileName='') then
        begin
          nFileCount := 0;
          lpFiles := nil;
        end
        else
        begin
          FillChar(FileAttach, SizeOf(FileAttach), 0);
          FileAttach.nPosition := Cardinal($FFFFFFFF);
          FileAttach.lpszPathName := PChar(FileName);
          nFileCount := 1;
          lpFiles := @FileAttach;
        end;
      end;
      MAPIModule := LoadLibrary(PChar(MAPIDLL));
      if MAPIModule=0 then
      begin
        Result := -1
      end
      else
      begin
        try
          @SM := GetProcAddress(MAPIModule, 'MAPISendMail');
          if @SM<>nil then
          begin
    {        Result := SM(0, Application.Handle, message, MAPI_DIALOG or
                         MAPI_LOGON_UI, 0);}
            Result := SM(0, Application.Handle, message, MAPI_LOGON_UI, 0);      end
          else
          begin
            Result := 1
          end;    finally
          FreeLibrary(MAPIModule);
        end;
      end;
      if Result<>0 then
      begin
        MessageDlg('Error sending mail ('+IntToStr(Result)+').', mtError, [mbOk],
                   0)
      end;
    end;