如何才能绕过SMTP邮件服务器的UserID认证进行邮件发送?(在线)
  我写了个自动发送邮件的软件,他妈的!想不到光有对方的邮箱地址还不行!
还要知道对方的SMTP邮件服务器地址和用户登陆密码!!!!那还有什么用呀!
  不知Outlook是怎么处理的??????????
那位大侠能告知一二呀?????????不胜感激!!!!!!!!!!!!!

解决方案 »

  1.   

    to:tsforever(人在江湖飘,谁能不挨刀.
    自己的密码和用户名写在那?????
    我是发送到别人的邮箱里!不是自己的邮箱啊。
      

  2.   

    你不需要知道对方SMTP邮件服务器地址和用户登陆密码啊,随便找一个SMTP邮件服务器,是你有用户名和密码的,不就行了。
      

  3.   

    现在的邮件服务器如果是中国电信或大的门户网站的就必须通过验证才能发送,否则是不能实现发送的,我也在网上找了好多天,也没找到最终的解决方案,不过如果是如果是企业邮局就可以解决,如mail.newlysoft.com,则无需验证,和你一样关注!
      

  4.   

    续:
        outlook中的帐号属性中有服务器这个属性,将其中的外发邮件服务器中我的服务器要求身份验证选中,设置登录方式:在帐号名和密码中输入邮箱的用户名和密码即可。
      

  5.   

    to:jiaai(逍遥)
    还是不懂,你用过TNMSMTP组件没有?我就是用这个控件写的程序! 
    要求填入:对方的SMTP邮件服务器地址和用户登陆密码!!!!
    那位大侠知道:TNMsMTP怎么使用?我用了,但只能发到自己的邮箱里!!!
      

  6.   

    www.yesky.com有一篇文章,不过不全。
      

  7.   

    你使用TNMSMTP组件时报的什么错?
      

  8.   

    其实只要你发送方的服务器验证就可以了(验证你自己的用户和id号)具体方法在TNMSMTP的onconect事件中添加如下代码即可
    procedure TfrmMain.NMSMTP1Connect(Sender: TObject);
    var
        strUserName, strPassword: String;
    begin
        strUserName := EncodeString('邮件服务器用户名称');
        strPassword := EncodeString('邮件服务器用户密码');    {进行认证,输入编码后的用户名、密码}    nmsmtp1.Transaction('EHLO') ;
        nmsmtp1.Transaction('AUTH LOGIN');
        nmsmtp1.Transaction(strUserName);
        nmsmtp1.Transaction(strPassword);end;{对参数TMemoryStrema中的字节流进行Base64编码,编码后的结果
    保存在Encoded中,函数返回编码长度}
    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;{对参数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;
      

  9.   

    顺便给你发送EMail的部分代码,其中填充邮件内容时需要注意
                        //当SendMessage之后删除PostMessage中的内容
                        //NMSMTP1.ClearParams := true;
                        //主题类型
                        //NMSMTP1.SubType := mtPlain;
                        //编码格式
                        //NMSMTP1.EncodeType := uuMime;
                        //NMSMTP1.EncodeType := uuCode;                    //发件人地址
                        NMSMTP1.PostMessage.FromAddress := GetEmailOption('管理员邮件地址');
                        //发件人
                        NMSMTP1.PostMessage.FromName := GetEmailOption('邮件服务器用户名称');
                        //发送地址
                        NMSMTP1.PostMessage.ToAddress.Text := sMobile;
                        {
                        //抄送和暗送
                        NMSMTP1.PostMessage.ToCarbonCopy.Text := Memo3.Text;
                        NMSMTP1.PostMessage.ToBlindCarbonCopy.Text := Memo2.Text;
                        }
                        //邮件内容
                        lstContent := TStringList.Create;
                        lstContent.Add('--------------Email by xiatian');
                        lstContent.Add('Content-Type: text/plain; charset=gb2312');
                        lstContent.Add('Content-Transfer-Encoding: 8bit');
                        {注意:空行是邮件格式所必需的!}
                        lstContent.Add('');                    lstBody := TStringList.Create;
                        MySplitString(sContent, #$D + #$A, lstBody);
                        for i := 0 to lstBody.Count - 1 do
                            lstContent.Add(lstBody.Strings[i]);                    lstContent.Add('');                    NMSMTP1.PostMessage.Body.Text := lstContent.Text;
                        lstBody.Free;
                        lstContent.Free;
                        //附件
                        //NMSMTP1.PostMessage.Attachments.Text := ListBox1.Items.Text;
                        //主题
                        NMSMTP1.PostMessage.Subject := GetEmailOption('邮件标题');
                        //
                        //NMSMTP1.PostMessage.LocalProgram := Edit6.Text;
                        //日期
                        NMSMTP1.PostMessage.Date := DateToStr(Date);
                        //回复人
                        NMSMTP1.PostMessage.ReplyTo := GetEmailOption('管理员邮件地址');
                      try
                        NMSMTP1.SendMail;
                      except
                        on e: Exception do
                        begin
                            memLog.Lines.Add('交易代码:【' + sTradeCode + '】,预约流水号:【' + sID + '】,' + e.Message);
                        end;
                      end;
      

  10.   

    to:daniel007(添)比如:我的[email protected] ;  userID=123456;   userName:=aaa
          我的smtp:smtp.sina.com.cn
         对方的:[email protected] 
    这样能否发送出去!
    ????????
    太感谢你了!
      

  11.   

    userID不需要,只要你登陆时的用户名和密码,在onconnect事件中填写,然后使用base64编码就可以通过验证了,
    忘了说一句,在onSendStart事件中还要加一段代码才可以的procedure TfrmMain.NMSMTP1SendStart(Sender: TObject);
    begin
        {在邮件发送开始时修改邮件的消息头,标明邮件为多部分组成}
        NMSMTP1.FinalHeader.Values['Content-Type'] := ''
            + 'multipart/related; boundary="------------Email by xiatian"';而这段代码中的字符串需要与填写邮件内容头部内容对应(邮件编码格式需要)                    lstContent.Add('--------------Email by xiatian');
                        lstContent.Add('Content-Type: text/plain; charset=gb2312');
                        lstContent.Add('Content-Transfer-Encoding: 8bit');
                        {注意:空行是邮件格式所必需的!}
                        lstContent.Add('');
    接下来在在lstContent中添加邮件主题内容,这个头部格式只能发送普通文本文件,而不是html文件end;
      

  12.   

    对不起,注释写地方了,函数应该是:
    procedure TfrmMain.NMSMTP1SendStart(Sender: TObject);
    begin
        {在邮件发送开始时修改邮件的消息头,标明邮件为多部分组成}
        NMSMTP1.FinalHeader.Values['Content-Type'] := ''
            + 'multipart/related; boundary="------------Email by xiatian"';
    end;
      

  13.   

    //发送地址
       NMSMTP1.PostMessage.ToAddress.Text := [email protected];
    不可以吗?
      

  14.   

    谢谢daniel007(添)及各位的帮助!
      我再试试!一定会成功的!
      

  15.   

    下面这个连接中的内容很好的解决了你的问题,做到了无须任何密码、用户ID就可以发送邮件,方法是利用了邮件协议的一个漏洞;邮件直接送往目的地,无须中转;
    http://www.china-pub.com/computers/emook/wzq/056/info.htm