⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pop3.cpp

📁 一个简单的pop3接收邮件程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
								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 + -