能给你的源码吗?
我想看一下SMTP扩展认证的那一部分

解决方案 »

  1.   

    ironsmith(三无人员):
        老大,总共程序才33K,等我发邮件,还不如你直接下载。
     wuzhibiao(竹子):
        "HELO"之后:"AUTH LOGIN"->"334 enter username"->"username"->"334 enter password"->"password"->"忘了,反正就是判断授权成功与否的信息"  引号内小写字母全为Base64编码。
      

  2.   

    真是太好了,
    我是vc++新手,正在学习编写用smtp发e-mail的程序,
    我实在搞不清怎么能通过身份认证,能把源代码发给我看看吗?
    [email protected] 多谢了!
      

  3.   

    各位大虾,请问:
    553:SMTP Server error 是怎么回事?
    为什么会发生这样的错误呢?
      

  4.   

    鉴于多人对SMTP的认证感兴趣,特将相关代码贴出,希望对各位有所帮助/*本函数用于在一个线程中发送邮件,线程调用各个特定函数完成特定功能,并针对不同功能完成情况决定下一步将完成什么功能*/
    DWORD WINAPI SendMailThread(LPVOID p)
    {
      int ret,ret0,isOK;
      isOK=1;
      CSMTPSocket * pSS=static_cast<CSMTPSocket *> (p);
      /*初始化Socket*/
      ret0=pSS->ReadySocket();
      /*此函数在界面上显示当前进度*/
      pSS->SetProcessStatusInfo(1,ret0);
      /*程序在各个功能中选择执行,似乎用简单的While之类语句不好实现,我又不想用Goto,所以用了权值判断,在各个功能完成时根据完成情况设定权值,据此进行下一步操作*/
      if (1==ret0)
        ret=3*5*7*11*13;
      else
        return -1;
      while (ret>0)    
      {
        switch(ret)
        {
        /*(正常情况下)*/
        /*第一步:连接服务器(包括发送“HELO”命令)*/
        case (3*5*7*11*13):
          ret0=pSS->ConnectServer();
          isOK=ret0<isOK?ret0:isOK;
          pSS->SetProcessStatusInfo(2,ret0);
          if (1==ret0)
            ret=5*7*11*13;
          else
            ret=13;
          break;
        case (5*7*11*13):
          if(pSS->m_bNeedAuth)
          {
          /*第二步:送完“HELO”,如果服务器需要授权,则发送之*/
            ret0=pSS->LoginServer();
            pSS->SetProcessStatusInfo(3,ret0);
          }
          else
            ret0=1;
          isOK=ret0<isOK?ret0:isOK;
          if (1==ret0)
            ret=7*11*13;
          else if (0==ret0)
            ret=11*13;
          else
            ret=13;
          break;
        case (7*11*13):
        /*第三步:发送数据(要分收件人发送,也在此函数中一起处理了)*/
          ret0=pSS->SendMailData();
          isOK=ret0<isOK?ret0:isOK;
          pSS->SetProcessStatusInfo(4,ret0);
          if ((1==ret0)||(0==ret0))
            ret=11*13;
          else
            ret=13;
          break;
        case (11*13):
        /*第四步:退出*/
          ret0=pSS->LogoutServer();
          isOK=ret0<isOK?ret0:isOK;
          pSS->SetProcessStatusInfo(5,ret0);
          ret=13;
          break;
        case 13:
        /*第五步:关闭*/
          ret0=pSS->CloseSocket();
          isOK=ret0<isOK?ret0:isOK;
          pSS->SetProcessStatusInfo(6,isOK);
          ret=0;
          break;
        default:
          ret=0;
          break;
        }
      }
      return 0;
    }/*本函数完成登陆功能*/
    int CSMTPSocket::LoginServer()
    {
      int ret;
      if (NULL==m_pSocket)
      {
        m_LastError="CSMTPSocket::LoginServer() Unhandle error on socket";
        WriteError(m_LastError);
        return 0;
      }
      if (!m_bNeedAuth)
        return 1;
       /*密码和用户名已经编码为Base64方式*/
    if ((m_strPasswordB=="")||(""==m_strUserNameB))
      {
        m_LastError="CSMTPSocket::LoginServer() Imperfect setting";
        WriteError(m_LastError);
        return 0;
      }
      m_strCommand="Say \"AUTH LOGIN\" to server";
      /*表示客户端将开始登陆*/
      if (SOCKET_ERROR==m_pSocket->Send("AUTH LOGIN\r\n",12))
      {
        m_LastError.Format("CSMTPSocket::LoginServer() Send \"AUTH\" Error %d",GetLastError());
        WriteError(m_LastError);
        return 0;
      }
    if ((ret=CheckAvailability())==0)
        return 0;
      else if (ret==-1)
        return -1;
      m_strCommand="Send Username to server";
      /*发送用户名*/
      if (SOCKET_ERROR==m_pSocket->Send(m_strUserNameB,m_strUserNameB.GetLength()))
      {
        m_LastError.Format("CSMTPSocket::LoginServer() Send username error %d",GetLastError());
        WriteError(m_LastError);
        return 0;
      }
      /*判断反馈信息是否正确*/
    if ((ret=CheckAvailability())==0)
        return 0;
      else if (ret==-1)
        return -1;
    m_strCommand="Send password to server";
      /*发送密码*/
      if (SOCKET_ERROR==m_pSocket->Send(m_strPasswordB,m_strPasswordB.GetLength()))
      {
        m_LastError.Format("CSMTPSocket::LoginServer() Send password error %d",GetLastError());
        WriteError(m_LastError);
        return 0;
      }
      /*判断反馈信息是否正确*/
      if ((ret=CheckAvailability())==0)
        return 0;
      else if (ret==-1)
        return -1;
      return 1;
    }