用户邮箱SMTP和POP3都要求SSL验证。现有的POP3接收程序都没有对SSL进行相关处理,现在能够连接pop3服务的110端口,但USER等指令都会失败,提示ERR Command is not valid in this state。
很少做邮件程序,代码也是下载来的,从163信箱和我自己公司信箱接收邮件没有问题。想问问各位高手,这个错误提示是由于SSL验证造成的吗?如果不是,那么问题会在哪里?如果是,那么怎么解决SSL验证的问题呢?
非常着急,现场解决问题中,请高手们务需解惑啊。
很少做邮件程序,代码也是下载来的,从163信箱和我自己公司信箱接收邮件没有问题。想问问各位高手,这个错误提示是由于SSL验证造成的吗?如果不是,那么问题会在哪里?如果是,那么怎么解决SSL验证的问题呢?
非常着急,现场解决问题中,请高手们务需解惑啊。
手动开启方法-进入邮箱-设置-账户-POP3/IMAP/SMTP服务-勾选开启保存
不知道是不是这个问题
ssl只是保证通道是加密的,用户验证应该还是用原来的pop3协议吧
下面是个POP3源码,看行不,发现qq的pop3服务器ping都ping不通 sina没测试 qq的是不行
http://www.hackchina.com/dlpre.php?id=181060
如下逻辑代码展示连接过程(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 --
}
foxmail连接hotmail的pop3服务器下载邮件的时候,没有看到pop的数据包
所以我怀疑能否用pop方式登陆需要ssl登陆的邮件系统。楼主或许可以用web方式做,这个是一定可以的.wininet winhttp都可以