📄 pop3.cpp
字号:
catch( bad_alloc err)
{
pto->SetLastError("Memory Error!");
goto error_return;
}
memcpy(pto->m_szReceive , cTmp , pto->m_lReceive);
delete []cTmp;
memcpy(pto->m_szReceive+pto->m_lReceive , pto->m_szReceiveBuf , iRet);
}
else
{
pto->m_szReceive = new CHAR[iRet+1];
memcpy(pto->m_szReceive , pto->m_szReceiveBuf , iRet);
}
pto->m_lReceive += iRet;
pto->m_szReceive[pto->m_lReceive] = '\0';
if( iRet < pto->m_lReceiveBufSize )
break;
else
continue;
}
#endif
}
if( ( 0 == _memicmp( pto->m_szReceiveBuf + iRet - lstrlen(pto->m_strEnd) , pto->m_strEnd , lstrlen(pto->m_strEnd) ) )
&& ( lstrlen(pto->m_szReceiveBuf) >= lstrlen(pto->m_strEnd) ) )
{//read the end flag
SetEvent(pto->m_hEventWaitingRespond);
}
else if( 0 == _memicmp(pto->m_szReceiveBuf , "-ERR" , 4) )
{
SetEvent(pto->m_hEventWaitingRespond);
}
pto->CheckMessage();
}
else if( we.lNetworkEvents & FD_CLOSE )
{
pto->SetLastError("Connection Closed!");
goto error_return;
}
break;
case WSA_WAIT_EVENT_0 + 1:
pto->SetLastError("Exit Thread!");
goto exitthread_return;
break;
case WSAENETDOWN:// The network subsystem has failed.
pto->SetLastError("The network subsystem has failed!");
goto error_return;
break;
}//end switchs
}//end while
return 0;
error_return:
//::MessageBox(NULL , "close RETURN" , NULL , MB_OK);
pto->m_bSocketOK = false;
pto->m_bConnected = false;
SetEvent(pto->m_hEventWaitingRespond);
exitthread_return:
WSACloseEvent(pto->m_hEvent[0]);
pto->m_bReceiving = false;
_endthreadex( 0 );
return 0;
}
BOOL CPop3::GetSocketResult(CString *msgRet, CString EndFlag)
{
BOOL bRet = false;
BOOL bEnd = false;
m_strEnd = EndFlag;
HANDLE hWait[1];
hWait[0] = m_hEventWaitingRespond;
while (true)
{
MSG msg ;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
return true;
DispatchMessage(&msg);
} // End of PeekMessage while loop.
switch( MsgWaitForMultipleObjects(1, hWait, FALSE, m_dwTimeout, QS_ALLINPUT) )
{
case WAIT_OBJECT_0:
if( m_fpTmp != NULL )
{
SetLastError("Receive to file OK!");
bRet = true;
bEnd = true;
break;
}
#ifdef USE_CSTRING
else if( m_strReceive.IsEmpty() )
#else
else if( lstrlen(m_szReceive) <= 0 )
#endif
{
bRet = false;
SetLastError("Receive Buffer is empty!");
bEnd = true;
break;
}
#ifdef USE_CSTRING
*msgRet = m_strReceive;
#else
*msgRet = m_szReceive;
#endif
bRet = true;
bEnd = true;
break;
case WAIT_TIMEOUT:
if( m_bReceiving )
{
bEnd = false;
break;
}
SetLastError("Connection TimeOut!");
bRet = false;
bEnd = true;
break;
}
if( bEnd )
break;
}
#ifdef USE_CSTRING
m_strReceive = "";
#else
if( NULL != m_szReceive )
{
delete []m_szReceive;
m_szReceive = NULL;
m_lReceive = 0;
}
#endif
ResetEvent(m_hEventWaitingRespond);
return bRet;
}
BOOL CPop3::CheckMessage()
{
MSG msg;
while (PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if (msg.message==WM_QUIT)
return false;
else
{
GetMessage(&msg,NULL,0,0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return true;
}
BOOL CPop3::GetMailList(CStringList *strResultList)
{
CString strResult, strTemp;
char msg[255];
int ret,nStart,nEnd;
if( false == m_bSocketOK )
{
SetLastError("Socket not Create!");
return false;
}
if( false == m_bConnected )
{
SetLastError("Not Connected!");
return false;
}
strcpy(msg , "list\r\n");
ret = send(m_sPop3Socket , msg , strlen(msg) , NULL);
if(ret == SOCKET_ERROR)
{
SetLastError("Socket error!");
m_bSocketOK = false;
m_bConnected = false;
return false;
}
if( !GetSocketResult(&strResult , DATA_END_FLAG) )
return false;
if( 0 == strResult.Find('-' , 0) )
{
SetLastError("Get Mail List error!");
return false;
}
nStart = nEnd = 0;
strResultList->RemoveAll();
nEnd = strResult.Find(COMMAND_END_FLAG , nStart);
if( nEnd >= 0 )
nStart = nEnd + 2;
while( true )
{
nEnd = strResult.Find(COMMAND_END_FLAG , nStart);
if( -1 == nEnd )
{
break;
}
else
{
strTemp = strResult.Mid(nStart , nEnd-nStart);
nStart = nEnd + 2;
if( 0 == strTemp.Compare(".") )
continue;
strResultList->AddTail(strTemp);
}
}
return true;
}
BOOL CPop3::GetMailHeader(int nMailIndex, CString *strMailHeader)
{
CString strResult, strTemp;
char msg[255];
int ret;
if( false == m_bSocketOK )
{
SetLastError("Socket not Create!");
return false;
}
if( false == m_bConnected )
{
SetLastError("Not Connected!");
return false;
}
sprintf(msg , "top %d 1\r\n" , nMailIndex);
ret = send(m_sPop3Socket , msg , strlen(msg) , NULL);
if(ret == SOCKET_ERROR)
{
SetLastError("Socket error!");
m_bSocketOK = false;
m_bConnected = false;
return false;
}
if( !GetSocketResult(&strResult , DATA_END_FLAG) )
return false;
if( 0 == strResult.Find('-' , 0) )
{
SetLastError("Get Mail Header error!");
return false;
}
*strMailHeader = strResult;
return true;
}
BOOL CPop3::GetMail(int nMailIndex, CString *strMail)
{
CString strResult, strTemp;
char msg[255];
int ret;
if( false == m_bSocketOK )
{
SetLastError("Socket not Create!");
return false;
}
if( false == m_bConnected )
{
SetLastError("Not Connected!");
return false;
}
sprintf(msg , "retr %d\r\n" , nMailIndex);
ret = send(m_sPop3Socket , msg , strlen(msg) , NULL);
if(ret == SOCKET_ERROR)
{
SetLastError("Socket error!");
m_bSocketOK = false;
m_bConnected = false;
return false;
}
if( !GetSocketResult(&strResult , DATA_END_FLAG) )
return false;
if( 0 == strResult.Find('-' , 0) )
{
SetLastError("Get Mail error!");
return false;
}
*strMail = strResult;
return true;
}
BOOL CPop3::GetMail(int nMailIndex, LPCSTR tmpfilename)
{
CString strResult, strTemp;
char msg[255];
int ret;
BOOL bRet = false;
if( false == m_bSocketOK )
{
SetLastError("Socket not Create!");
return false;
}
if( false == m_bConnected )
{
SetLastError("Not Connected!");
return false;
}
m_fpTmp = fopen(tmpfilename , "wb");
if( m_fpTmp == NULL )
{
SetLastError("Open Tmp File Error!");
return false;
}
sprintf(msg , "retr %d\r\n" , nMailIndex);
ret = send(m_sPop3Socket , msg , strlen(msg) , NULL);
if(ret == SOCKET_ERROR)
{
SetLastError("Socket error!");
m_bSocketOK = false;
m_bConnected = false;
return false;
}
if( !GetSocketResult(&strResult , DATA_END_FLAG) )
bRet = false;
else
bRet = true;
if( 0 == strResult.Find('-' , 0) )
{
SetLastError("Get Mail error!");
bRet = false;
}
fclose(m_fpTmp);
m_fpTmp = NULL;
return bRet;
}
BOOL CPop3::GetStat(CString *strStat)
{
CString strResult;
char msg[255];
int ret , nStart , nEnd;
if( false == m_bSocketOK )
{
SetLastError("Socket not Create!");
return false;
}
if( false == m_bConnected )
{
SetLastError("Not Connected!");
return false;
}
strcpy(msg , "stat\r\n");
ret = send(m_sPop3Socket , msg , strlen(msg) , NULL);
if(ret == SOCKET_ERROR)
{
SetLastError("Socket error!");
m_bSocketOK = false;
m_bConnected = false;
return false;
}
if( !GetSocketResult(&strResult , COMMAND_END_FLAG) )
return false;
if( 0 == strResult.Find('-' , 0) )
{
SetLastError("Get Stat error!");
return false;
}
nStart = 4;
nEnd = strResult.GetLength() - 2;
*strStat = strResult.Mid(nStart , nEnd - nStart);
return true;
}
BOOL CPop3::GetMailSize(int nMailIndex, long *lSize)
{
CString strResult, strTemp;
char msg[255];
int ret , nStart , nEnd;
if( false == m_bSocketOK )
{
SetLastError("Socket not Create!");
return false;
}
if( false == m_bConnected )
{
SetLastError("Not Connected!");
return false;
}
sprintf(msg , "list %d\r\n" , nMailIndex);
ret = send(m_sPop3Socket , msg , strlen(msg) , NULL);
if(ret == SOCKET_ERROR)
{
SetLastError("Socket error!");
m_bSocketOK = false;
m_bConnected = false;
return false;
}
if( !GetSocketResult(&strResult , COMMAND_END_FLAG) )
return false;
if( 0 == strResult.Find('-' , 0) )
{
SetLastError("Get Size error!");
return false;
}
nStart = strResult.Find(' ' , 4)+1;
nEnd = strResult.GetLength()-2;
strTemp = strResult.Mid(nStart , nEnd-nStart);
*lSize = atol(strTemp.GetBuffer(strTemp.GetLength()));
return true;
}
BOOL CPop3::GetMailSubject(int nMailIndex, CString *strSubject)
{
CString strMailHeader;
int nSubStart , nSubEnd;
if( !GetMailHeader(nMailIndex , &strMailHeader) )
{
//SetLastError("Get Subject error!");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -