你pass指令格式是否正确,有无\r\n?

解决方案 »

  1.   

    enum eResponse

    CONNECT = 0,
    USER,
    PASS,
    STAT,
    UIDL,
    LIST,
    RETR,
    DELE,
    RSET,
    TOP,
    NOOP,
    QUIT
    };bool CPOP3::_SendMsg(int eRespense,int nNumb)
    {
    CString sSendText;
    sSendText = _AssembleMsg(eRespense,nNumb); //组合发送的信息包
    memset( m_pcSendBuf, '\0', SEND_BUFFER_SIZE );
    memcpy( m_pcSendBuf, sSendText, sSendText.GetLength() );
    m_wsPOP3.Send( m_pcSendBuf, SEND_BUFFER_SIZE ); //发送信息报 if ( !_Check(eRespense) ) //验证该指令是否成功
    {
    return false;
    }
    return true;
    }/*  根据eResponse,对从服务器收到的包进行分析,判断所做操作是否正确返回 */
    bool CPOP3::_Check(int eResponse)
    {
    memset( m_pcRecvBuf, '\0', RECV_BUFFER_SIZE );
    m_wsPOP3.Receive( m_pcRecvBuf, RECV_BUFFER_SIZE );//收取主机发来得包
    if( m_pcRecvBuf[0] == '\0' )
    {
    m_sError = _T("收取信息包为空!");
    return false;
    } char cTemp[5];
    memset( cTemp, '\0', sizeof(cTemp) );
    memcpy( cTemp, m_pcRecvBuf, 4 ); //截取前四位 if ( strcmp(cTemp, "-ERR") == 0 ) //如果错误则返回false及错误信息
    {
    m_sError = _T( m_pcRecvBuf );
    m_sError = m_sError.Right( m_sError.GetLength()-4 ); //获取错误信息
    return false;
    } /*  在Pop3通讯正确情况下所走分支 */
    switch( eResponse )
    {
    case CONNECT:
    break; case USER:
    break; case PASS:
    break; case STAT:
    m_wsPOP3.Receive( m_pcRecvBuf, RECV_BUFFER_SIZE );//再次接收主机发来得包
    break; case UIDL:
    m_wsPOP3.Receive( m_pcRecvBuf, RECV_BUFFER_SIZE );//再次接收主机发来得包
    break; case LIST:
    m_wsPOP3.Receive( m_pcRecvBuf, RECV_BUFFER_SIZE );//再次接收主机发来得包
    break; case RETR:
    // memset( m_pcRecvBuf, '\0', RECV_BUFFER_SIZE );
    m_wsPOP3.Receive( m_pcRecvBuf, RECV_BUFFER_SIZE );//再次接收主机发来得包
    break; case DELE:
    break; case RSET:
    break; case TOP:
    break; case NOOP:
    break; case QUIT:
    break; default:
    break;
    } return true;
    }/*  根据nCommd来组合要发送的报文 */
    CString CPOP3::_AssembleMsg( int nCommd, int nNumb)
    {
    CString sSendText = _T("");
    //每个pop3指令均用空格补足五位
    switch( nCommd )
    {
    case CONNECT:
    break; case USER:
    sSendText = _T("USER ") + GetUser();
    break; case PASS:
    sSendText = _T("PASS ") + GetPassword();
    break; case STAT:
    sSendText = _T("STAT ");
    break; case UIDL:
    sSendText.Format( _T("UIDL %d"), nNumb );
    if ( nNumb == 0 ) //说明pop3指令不带参数
    sSendText = sSendText.Left( 5 ); //取前五位,将数字去掉。使其不带参!
    break; case LIST:
    sSendText.Format( _T("LIST %d"), nNumb );
    if ( nNumb == 0 ) //说明pop3指令不带参数
    sSendText = sSendText.Left( 5 ); //取前五位,将数字去掉。使其不带参!
    break; case RETR:
    sSendText.Format( _T("RETR %d"), nNumb );
    if ( nNumb == 0 ) //说明pop3指令不带参数
    sSendText = sSendText.Left( 5 ); //取前五位,将数字去掉。使其不带参!
    break; case DELE:
    sSendText.Format( _T("DELE %d"), nNumb );
    if ( nNumb == 0 ) //说明pop3指令不带参数
    sSendText = sSendText.Left( 5 ); //取前五位,将数字去掉。使其不带参!
    break; case RSET:
    sSendText =  _T("RSET ");
    break; case TOP:
    sSendText.Format( _T("TOP  %d"), nNumb );
    if ( nNumb == 0 ) //说明pop3指令不带参数
    sSendText = sSendText.Left( 5 ); //取前五位,将数字去掉。使其不带参!
    break; case NOOP:
    sSendText = _T("NOOP ");
    break; case QUIT:
    sSendText = _T("QUIT ");
    break; default:
    break;
    }//End of switch

    sSendText += _T("\r\n"); //增加<CRLF>
    return sSendText;
    }
    .....
    if( _SendMsg(USER) )
    {
       ....
    }
    if ( _SendMsg(PASS) )
    {
      ....
    }