该邮件发送程序使用SINA的可以发送,使用163的则不成功.
1\163的SMTP服务器是不是不用验证用户名跟密码啊?
2\163的SMTP服务器的端口是不是25?
3\源程序请见:
procedure TForm1.BtnSendClick(Sender: TObject);
begin
   smtp1.ClearParameters;
   smtp1.Host := edit4.text;
   smtp1.Port := strtoint(edit5.text);
   smtp1.PostMessage.ToAddress.Text := edit1.text;
   smtp1.PostMessage.Subject := edit2.Text;
   smtp1.PostMessage.Body.Text := edit3.text;
   smtp1.Connect;
   showmessage('connect Success!');
   try
   smtp1.SendMail;
   except
   showmessage('fail');
   exit;
   end;end;procedure TForm1.smtp1Connect(Sender: TObject);
var
  strUserName, strPassword: String;
begin
  strUserName := trim(edit6.text);
  strPassword := trim(edit7.text);
  showmessage(strUserName+',,,'+strPassword);
  strUserName := EncodeString(strUserName);
  strPassword := EncodeString(strPassword);
  smtp1.Transaction('EHLO') ;
  Smtp1.Transaction('AUTH LOGIN');
  Smtp1.Transaction(strUserName);
  Smtp1.Transaction(strPassword);
end;

解决方案 »

  1.   

    to(***aiirill)
    请问:在那里加啊?我在nmsmtp的onconnect 那里加了用户名跟密码啊!!!!
      

  2.   

    现在很多STMP服务器在发送邮件时均需重新认证一遍,而Delphi的TNMSMTP控件对它没有很“可视化”的支持,使很多人在开发过程中大打问号。实现:1、在NMSMTP的OnConnect事件中添加代码:var  strUserName, strPassword: String;
    begin
      strUserName := EncodeString('CoolSlob');//CoolSlob是服务器的帐号
      strPassword := EncodeString('Password');//Password是密码
      {进行认证,输入编码后的用户名、密码}
      nmsmtp1.Transaction('EHLO') ;
      nmsmtp1.Transaction('AUTH LOGIN');
      nmsmtp1.Transaction(strUserName);
      nmsmtp1.Transaction(strPassword);
      StatusBar1.SimpleText := '连接成功';
    end;2、EncodeString函数实现过程:{对参数Decoded字符串进行Base64编码,返回编码后的字符串}
    function EncodeString(Decoded:string):String;
    var
        mmTemp,mmDecoded:TMemoryStream;
        strTemp:TStrings;
    begin
        mmTemp := TMemoryStream.Create;
        mmDecoded:=TMemoryStream.Create;
        strTemp:=TStringList.Create;
        strTemp.Add(Decoded);
        strTemp.SaveToStream(mmTemp);
        mmTemp.Position := 0;
        {剔除mmTemp从strTemp中带来的字符#13#10}
        mmDecoded.CopyFrom(mmTemp,mmTemp.Size-2);
        {对mmDecoded进行Base64编码,由mmTemp返回编码后的结果}
        EncodeBASE64(mmTemp,mmDecoded);
        {获得Base64编码后的字符串}
        mmTemp.Position:=0;
        strTemp.LoadFromStream(mmTemp);
        {返回结果必须从strTemp[0]中获得,如果使用strTemp.Text会
        带来不必要的字符#13#10}
        Result:=strTemp[0];
    end;3、EncodeBASE64函数实现过程:function EncodeBASE64(Encoded: TMemoryStream ; Decoded: TMemoryStream): Integer;
    const
        _Code64: String[64] =
            ('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/');
    var
        I: LongInt;
        B: array[0..2279] of Byte;
        J, K, L, M, Quads: Integer;
        Stream: string[76];
        EncLine: String;
    begin
        Encoded.Clear;
        Stream := '';
        Quads := 0;
        {为提高效率,每2280字节流为一组进行编码}
        J := Decoded.Size div 2280;
        Decoded.Position := 0;
        {对前J*2280个字节流进行编码}
        for I := 1 to J do
        begin
            Decoded.Read(B, 2280);
            for M := 0 to 39 do
            begin
                for K := 0 to 18 do
                begin
                    L:= 57*M + 3*K;
                    Stream[Quads+1] := _Code64[(B[L] div 4)+1];
                    Stream[Quads+2] := _Code64[(B[L] mod 4)*16 + (B[L+1] div 16)+1];
                    Stream[Quads+3] := _Code64[(B[L+1] mod 16)*4 + (B[L+2] div 64)+1];
                    Stream[Quads+4] := _Code64[B[L+2] mod 64+1];
                    Inc(Quads, 4);
                    if Quads = 76 then
                    begin
                        Stream[0] := #76;
                        EncLine := Stream+#13#10;
                        Encoded.Write(EncLine[1], Length(EncLine));
                        Quads := 0;
                    end;
                end;
            end;
        end;    {对以2280为模的余数字节流进行编码}
        J := (Decoded.Size mod 2280) div 3;
        for I := 1 to J do
        begin
            Decoded.Read(B, 3);
            Stream[Quads+1] := _Code64[(B[0] div 4)+1];
            Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1];
            Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + (B[2] div 64)+1];
            Stream[Quads+4] := _Code64[B[2] mod 64+1];
            Inc(Quads, 4);
            {每行76个字符}
            if Quads = 76 then
            begin
                Stream[0] := #76;
                EncLine := Stream+#13#10;
                Encoded.Write(EncLine[1], Length(EncLine));
                Quads := 0;
            end;
        end;
        {“=”补位}
        if (Decoded.Size mod 3) = 2 then
        begin
            Decoded.Read(B, 2);
            Stream[Quads+1] := _Code64[(B[0] div 4)+1];
            Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1];
            Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + 1];
            Stream[Quads+4] := '=';
            Inc(Quads, 4);
        end;    if (Decoded.Size mod 3) = 1 then
        begin
            Decoded.Read(B, 1);
            Stream[Quads+1] := _Code64[(B[0] div 4)+1];
            Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + 1];
            Stream[Quads+3] := '=';
            Stream[Quads+4] := '=';
            Inc(Quads, 4);
        end;    Stream[0] := Chr(Quads);
        if Quads > 0 then
        begin
            EncLine := Stream+#13#10;
            Encoded.Write(EncLine[1], Length(EncLine));
        end;    Result := Encoded.Size;
    end; 
      

  3.   

    这个已经试过了还是没用啊!用新浪的SMTP服务器就发得出但用163的就不行了.
    哪个大哥请指点迷津...........
      

  4.   

    我记得好像要重新编译一下某个文件,好像要注释掉文件中的一行,就是163特殊,别的就没有问题的。你再搜索一下吧。好像在www.delphibbs.com上面有。记不太清了。
      

  5.   

    你去看看这个帖子。
    http://www.delphibbs.com/delphibbs/dispq.asp?lid=1423247注意以下的发言:indy,可以发的,只是要做点修改
    这里讨论的挺多的,搜索以下把
    就是把IDMessage.pas中带有Values['X-Library']的一行注释掉
      

  6.   

    可能问题各有症结所在, 我这里的是因为没有给userid属性赋值.解决了谢谢大家