急需,谁能帮帮新手。谁能把现成的程序发给小弟。感激万分啊。我的油箱是[email protected]

解决方案 »

  1.   

    好象NMSMTP没有密码验证这一项,TidSMTP倒是有,呵呵
      

  2.   

    转贴:SMTP协议的其它知识,密码认证如上所说1.SMTP是工作在两种情况下:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个
      服务器
    2.SMTP是个请求/响应协议,命令和响应都是基于ASCII文本,并以CR和LF符结束。响应包括一个表示返 
      回状态的三位数字代码
    3.SMTP在TCP协议25号端口监听连接请求
    4.连接和发送过程:a.建立TCP连接
    b.客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令
      服务器端正希望以OK作为响应,表明准备接收
    c.客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行 
      服务器端则表示是否愿意为收件人接受邮件
    d.协商结束,发送邮件,用命令DATA发送
    e. 以.表示结束输入内容一起发送出去
    f.结束此次发送,用QUIT命令退出。
    5.另外两个命令:
    VRFY---用于验证给定的用户邮箱是否存在,以及接收关于该用户的详细信息。
    EXPN---用于扩充邮件列表。6.邮件路由过程:
      SMTP服务器基于‘域名服务DNS中计划收件人的域名来路由电子邮件。SMTP服务器基于DNS中的MX记录
    来路由电子邮件,MX记录注册了域名和相关的SMTP中继主机,属于该域的电子邮件都应向该主机发送。若SMTP服务器mail.abc.com收到一封信要发到[email protected]:a.Sendmail请求DNS给出主机sh.abc.com的CNAME记录,如有,假若CNAME到shmail.abc.com,则再次
    请求shmail.abc.com的CNAME记录,直到没有为止
    b.假定被CNAME到shmail.abc.com,然后sendmail请求@abc.com域的DNS给出shmail.abc.com的MX记录,
      shmail    MX  5  shmail.abc.com
                      10  shmail2.abc.com
    c. Sendmail最后请求DNS给出shmail.abc.com的A记录,即IP地址,若返回值为1.2.3.4
    d. Sendmail与1.2.3.4连接,传送这封给[email protected]的信到1.2.3.4这台服务器的SMTP后台程序7.SMTP基本命令集:命令      描述
    ------------------------------
    HELO      向服务器标识用户身份
              发送者能欺骗,说谎,但一般情况下服务器都能检测到。MAIL      初始化邮件传输
              mail from:
    RCPT      标识单个的邮件接收人;常在MAIL命令后面
              可有多个rcpt to:
    DATA      在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输,以.结束。
    VRFY      用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
    EXPN      验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
    HELP      查询服务器支持什么命令
    NOOP      无操作,服务器应响应OK
    QUIT      结束会话
    RSET      重置会话,当前传输被取消
    --------------------------------8. MAIL FROM命令中指定的地址是称作 envelope from地址,不需要和发送者自己的地址是一致的。
      RCPT TO 与之等同,指明的接收者地址称为envelope to地址,而与实际的to:行是什么无关。
    9.为什么没有RCPT CC和RCPT BCC:?
      所有的接收者协商都通过RCPT TO命令来实现,如果是BCC,则协商发送后在对方接收时被删掉信封接收者
    10.邮件被分为信封部分,信头部分和信体部分
      envelope from, envelope to 与message from:, message to:完全不相干。
      evnelope是由服务器主机间SMTP后台提供的,而message from/to是由用户提供的。有无冒号也是区别。11. 怎样由信封部分检查是否一封信是否是伪造的?
    a. received行的关联性。
      现在的SMTP邮件传输系统,在信封部分除了两端的内部主机处理的之个,考虑两个公司防火墙之间
      的部分,若两台防火墙机器分别为A和B,但接收者检查信封received:行时发现经过了C.则是伪造的。
    b. received:行中的主机和IP地址对是否对应如:
      Receibed: from galangal.org (turmeric.com [104.128.23.115] by mail .bieberdorf.edu....
    c. 被人手动添加在最后面的received行:
        Received: from galangal.org ([104.128.23.115]) by mail .bieberdorf.edu (8.8.5)
        Received: from lemongrass.org by galangal.org (8.7.3)
        Received: from graprao.com by lemongrass.org (8.6.4)
    转贴:NMSMTP的密码认证解决方案
    const
      BaseTable = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';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;在SMTP.OnConnect事件中写身份验证.
    procedure TSendFile.NMSMTPConnect(Sender: TObject);
    begin  {身份验证}
      if FSMTP.ReplyNumber = 250 then
        FSMTP.Transaction('auth login');
      if FSMTP.ReplyNumber = 334 then
      begin
        FSMTP.Transaction(EncodeBase64(FUserID));
        FSMTP.Transaction(EncodeBase64(FPassword));
      end;
    end; 
      

  3.   

    楼主为何不用TidSMTP来做呢?简单多了