用户邮箱SMTP和POP3都要求SSL验证。现有的POP3接收程序都没有对SSL进行相关处理,现在能够连接pop3服务的110端口,但USER等指令都会失败,提示ERR Command is not valid in this state。
很少做邮件程序,代码也是下载来的,从163信箱和我自己公司信箱接收邮件没有问题。想问问各位高手,这个错误提示是由于SSL验证造成的吗?如果不是,那么问题会在哪里?如果是,那么怎么解决SSL验证的问题呢?
非常着急,现场解决问题中,请高手们务需解惑啊。

解决方案 »

  1.   

    说明,163和我公司信箱是不需要SSL验证的。
      

  2.   

    SSL验证是可选、可设置的,有些企业邮箱是设置了必须用SSL验证的。
      

  3.   

    是啊,必须SSL验证的,POP3程序怎么写啊?
      

  4.   

    163邮箱SMTP/POP3服务默认开启 QQ、新浪邮箱测试都需要手动开启 其他没试
    手动开启方法-进入邮箱-设置-账户-POP3/IMAP/SMTP服务-勾选开启保存
    不知道是不是这个问题
      

  5.   

    楼上的兄弟,我是在问怎么写程序......不是问OUTLOOK客户端怎么去配置......
      

  6.   

    SSL加密以前项目接触过,貌似只有一个Linux的开源库,需要自己移植到Windows平台上,不过也不麻烦就是了。就是使用起来还是有点麻烦的。另外就算有SSL加密库,你要在邮件处理中运用的话,还得看一下POP3、SMTP的相关协议,看在哪个命令、哪个地方使用。总之自己去实现协议是相当相当的麻烦了,最好有现成的代码直接拿来用,不行就重新找个库来改,给你个地址http://www.naughter.com/smtp.html
      

  7.   

    一般ssl的不都是连接另外的端口?
    ssl只是保证通道是加密的,用户验证应该还是用原来的pop3协议吧
      

  8.   

    不是配置客户端 是发送邮箱需要配置
    下面是个POP3源码,看行不,发现qq的pop3服务器ping都ping不通 sina没测试 qq的是不行
    http://www.hackchina.com/dlpre.php?id=181060
      

  9.   

    楼主问的不是怎么写程序,楼主问的是哪里能抄一份代码吧?可以去弄个类似于firefox源码的程序,我小学期的时候就做过一个类似的邮件接收系统,里面还用RSA和DES加密了。自己写程序很简单啊,先熟悉SMTP和POP3规则,然后选一个语言就写呗。SSL协议也不复杂,去网上搜一个规则,然后找到相应加密模块,程序导入操作就行了。
      

  10.   

    可以考虑使用openSSL开源库
    如下逻辑代码展示连接过程(connect),供参考
    在SSL下,所有的数据传输均须通过SSL_xx完成,
    理解SSL不过是socket连接建立以后,对于数据传输进行加-解码的一个嵌套层 if(m_bSSL)
    {
    int err=-1;
    SSLeay_add_ssl_algorithms();
    m_meth = SSLv23_client_method();
    SSL_load_error_strings();
    m_ctx = SSL_CTX_new (m_meth);
    if(m_ctx == NULL) 
    {
    SetLastError(ME_SSL);
    return FALSE;
    }

    m_sock = socket (AF_INET, SOCK_STREAM, 0);
    if (m_sock == INVALID_SOCKET) 
    {
    SSL_CTX_free (m_ctx);
    SetLastError(ME_SOCK_CREATE);
    return FALSE;
    }
    sin.sin_family = AF_INET;
    sin.sin_port = htons( (unsigned short)m_iPort); struct hostent * host_addr = gethostbyname(m_szHost);
    if(host_addr==NULL) 
    {
    SSL_CTX_free (m_ctx);
    SetLastError(ME_SOCK_HOST);
    return FALSE;
    }
    sin.sin_addr.s_addr = *((int*)*host_addr->h_addr_list) ; int TimeOut=300000;
    if(::setsockopt(m_sock,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
    {
    closesocket(m_sock);
    SSL_CTX_free (m_ctx);
    SetLastError(ME_SOCK_OPT);
    return FALSE;
    }
    TimeOut=900000;
    if(::setsockopt(m_sock,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
    {
    closesocket(m_sock);
    SSL_CTX_free (m_ctx);
    SetLastError(ME_SOCK_OPT);
    return FALSE;
    } unsigned long ul = 1;
    int ret = ioctlsocket(m_sock, FIONBIO, (unsigned long*)&ul);
    if(ret==SOCKET_ERROR)
    {
    closesocket(m_sock);
    SSL_CTX_free (m_ctx);
    SetLastError(ME_SOCK_OPT);
    return FALSE;
    } connect(m_sock,(const struct sockaddr *)&sin, sizeof(sockaddr_in) ); struct timeval timeout ;
    fd_set r; FD_ZERO(&r);
    FD_SET(m_sock, &r);
    timeout.tv_sec = SSL_CNT_TIMEOUT;
    timeout.tv_usec =0;
    ret = select(0, 0, &r, 0, &timeout);
    if ( ret <= 0 )
    {
    ::closesocket(m_sock);
    SSL_CTX_free (m_ctx);
    SetLastError(ME_SOCK_OPT);
    return FALSE;
    }
    unsigned long ul1= 0 ;
    ret = ioctlsocket(m_sock, FIONBIO, (unsigned long*)&ul1);
    if(ret == SOCKET_ERROR)
    {
    ::closesocket (m_sock);
    SSL_CTX_free (m_ctx);
    SetLastError(ME_SOCK_OPT);
    return FALSE;
    }

    m_ssl = SSL_new (m_ctx);
    if(m_ssl == NULL)
    {
    SetLastError(ME_SSL);
    ::closesocket (m_sock);
    SSL_CTX_free (m_ctx);
    return FALSE;
    }
    SSL_set_fd (m_ssl, m_sock);
    err = SSL_connect (m_ssl);
    if(err == -1) 
    {
    SetLastError(ME_SSL);
    SSL_shutdown (m_ssl); 
    closesocket(m_sock);
    SSL_free (m_ssl);
    SSL_CTX_free (m_ctx);
    return FALSE;
    }

    //-- connect mess--
    p = m_sz;
    b = p;
    iLen = 0;
    memset(p,'\0',MAX_POP3_GET_LEN);
    while(SSL_read (m_ssl, p,1) > 0)
    {
    if((iLen++) >= MAX_POP3_GET_LEN) break;
    if(*p == 10) 
    {
    if(b[3] == ' ' || b[0] == '-' || b[3] == '\r') break;
    b = p+1;
    }
    p++;
    } if(iLen < 1)
    {
    SetLastError(ME_SOCK_CONNECT);
    SSL_shutdown (m_ssl); 
    closesocket(m_sock);
    SSL_free (m_ssl);
    SSL_CTX_free (m_ctx);
    return FALSE;
    } if(m_sz[0] != '+')
    {
    SetLastError(ME_SOCK_CONNECT);
    SSL_shutdown (m_ssl); 
    closesocket(m_sock);
    SSL_free (m_ssl);
    SSL_CTX_free (m_ctx);
    return FALSE;
    } //--USER
    sprintf(sz,
    "USER %s\r\n",
    m_szAc); err = SSL_write (m_ssl, sz,strlen(sz)); 
    if(err == -1)
    {
    SetLastError(ME_AUTH);
    SSL_shutdown (m_ssl); 
    closesocket(m_sock);
    SSL_free (m_ssl);
    SSL_CTX_free (m_ctx);
    return FALSE;
    } p = m_sz;
    b = p;
    iLen = 0;
    memset(p,'\0',MAX_POP3_GET_LEN);
    while(SSL_read(m_ssl, p,1) > 0)
    {
    if((iLen++) >= MAX_POP3_GET_LEN) break;
    if(*p == 10) 
    {
    if(b[3] == ' ' || b[0] == '-' || b[3] == '\r') break;
    b = p+1;
    } p++;
    } if(iLen < 1)
    {
    SetLastError(ME_AUTH);
    SSL_shutdown (m_ssl); 
    closesocket(m_sock);
    SSL_free (m_ssl);
    SSL_CTX_free (m_ctx);
    return FALSE;
    } if(m_sz[0] != '+')
    {
    SetLastError(ME_SOCK_CONNECT);
    SSL_shutdown (m_ssl); 
    closesocket(m_sock);
    SSL_free (m_ssl);
    SSL_CTX_free (m_ctx);
    return FALSE;
    } //--PASS
    sprintf(sz,
    "PASS %s\r\n",
    m_szPwd);
    err = SSL_write (m_ssl, sz,strlen(sz)); 
    if(err == -1)
    {
    SetLastError(ME_AUTH);
    SSL_shutdown (m_ssl); 
    closesocket(m_sock);
    SSL_free (m_ssl);
    SSL_CTX_free (m_ctx);
    return FALSE;
    } p = m_sz;
    b = p;
    iLen = 0;
    memset(p,'\0',MAX_POP3_GET_LEN);
    while(SSL_read (m_ssl, p,1) > 0)
    {
    if((iLen++) >= MAX_POP3_GET_LEN) break;
    if(*p == 10) 
    {
    if(b[3] == ' ' || b[0] == '-' || b[3] == '\r') break;
    b = p+1;
    }
    p++;
    } if(iLen < 1)
    {
    SetLastError(ME_AUTH);
    SSL_shutdown (m_ssl); 
    closesocket(m_sock);
    SSL_free (m_ssl);
    SSL_CTX_free (m_ctx);
    return FALSE;
    } if(m_sz[0] != '+')
    {
    SetLastError(ME_SOCK_CONNECT);
    SSL_shutdown (m_ssl); 
    closesocket(m_sock);
    SSL_free (m_ssl);
    SSL_CTX_free (m_ctx);
    return FALSE;
    }
    //-- OK --
    }
      

  11.   

    ssl不支持telnet
    foxmail连接hotmail的pop3服务器下载邮件的时候,没有看到pop的数据包
    所以我怀疑能否用pop方式登陆需要ssl登陆的邮件系统。楼主或许可以用web方式做,这个是一定可以的.wininet  winhttp都可以
      

  12.   

    使用openssl即可支持ssl的连接。