www.pudn.com > MailAgent.rar > POP3.cpp


#include "stdafx.h" 
#include "POP3.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
TCHAR* CPOP3::error_table[] = 
{ 
	"没有连接服务器", 
	"用户名错误",						 
	"非法用户名/密码组合",	          
	"不能获得信息",				 
	"信息获取失败",						 
	"不能删除信息",				 
	"退出错误"						 
}; 
////////////////////////////////////////////////////////////////////// 
// Konstruktion/Destruktion 
////////////////////////////////////////////////////////////////////// 
 
CPOP3::CPOP3( LPCTSTR szPOP3ServerName, UINT nPort, LPCTSTR sUsername, LPCTSTR sPassword) 
{ 
	ASSERT( szPOP3ServerName != NULL ); 
	AfxSocketInit(); 
	m_sPOP3ServerHostName = szPOP3ServerName; 
	m_nPort = nPort; 
	m_sUsername = sUsername; 
	m_sPassword = sPassword; 
	m_bConnected = FALSE; 
	m_sError = _T( "OK" ); 
 
} 
 
CPOP3::~CPOP3() 
{ 
	if( m_bConnected ) 
		Disconnect(); 
} 
 
 
BOOL CPOP3::Connect() 
{ 
	CString sUser; 
	CString sPass; 
 
	if( m_bConnected ) 
		return TRUE; 
 
	if( !m_wsPOP3Server.Create() ) 
	{ 
		m_sError = _T( "不能创建套接字!" ); 
		return FALSE; 
	} 
	if( !m_wsPOP3Server.Connect( GetServerHostName(), GetPort() ) ) 
	{ 
		m_sError = _T( "不能建立与服务器的连接!" ); 
		m_wsPOP3Server.Close(); 
		return FALSE; 
	} 
	if( !get_response( CONNECTION ) ) 
	{ 
		m_wsPOP3Server.Close(); 
		return FALSE; 
	} 
	sUser.Format( "USER %s\r\n", GetUsername()); 
	m_wsPOP3Server.Send( (LPCTSTR)sUser, sUser.GetLength() ); 
	if( !get_response( IDENTIFICATION ) ) 
	{ 
		m_wsPOP3Server.Close(); 
		return FALSE; 
	} 
	sPass.Format( "PASS %s\r\n", GetPassword()); 
	m_wsPOP3Server.Send( (LPCTSTR)sPass, sPass.GetLength() ); 
	if( !get_response( AUTHENTIFICATION ) ) 
	{ 
		m_wsPOP3Server.Close(); 
		return FALSE; 
	} 
 
	m_bConnected = TRUE; 
	return TRUE; 
} 
 
 
BOOL CPOP3::get_response( UINT executed_action ) 
{ 
	int nChars = m_wsPOP3Server.Receive( response_buf, RESPONSE_BUFFER_SIZE ); 
	if( nChars == SOCKET_ERROR ) 
	{ 
		m_sError = _T( "套接字错误!" ); 
		return FALSE; 
	} 
 
	m_sResponse = response_buf; 
	m_sResponse = m_sResponse.Left(nChars); 
 
	if (m_sResponse.Left(4)=="-ERR") 
	{ 
		m_sError=error_table[executed_action]; 
		return FALSE;  
	} 
	return TRUE; 
} 
 
 
UINT CPOP3::GetPort() 
{ 
	return m_nPort; 
} 
 
 
CString CPOP3::GetUsername() 
{ 
	return m_sUsername; 
} 
 
 
CString CPOP3::GetPassword() 
{ 
	return m_sPassword; 
} 
 
 
CString CPOP3::GetLastError() 
{ 
	return m_sError; 
} 
 
 
CString CPOP3::GetServerHostName() 
{ 
	return m_sPOP3ServerHostName; 
} 
 
 
void CPOP3::SetServerProperties( LPCTSTR sServerHostName, UINT nPort) 
{ 
	ASSERT( sServerHostName != NULL ); 
	if( sServerHostName == NULL ) 
		return; 
	m_sPOP3ServerHostName = sServerHostName; 
	m_nPort = nPort; 
} 
 
 
void CPOP3::SetUserProperties( LPCTSTR sUsername, LPCTSTR sPassword ) 
{ 
	ASSERT( sUsername != NULL ); 
	ASSERT( sPassword != NULL ); 
	 
	if( sUsername == NULL ) 
		return; 
	if( sPassword == NULL ) 
		return; 
	 
	m_sUsername = sUsername; 
	m_sPassword = sPassword; 
} 
 
 
BOOL CPOP3::Disconnect() 
{ 
	BOOL ret; 
	if( !m_bConnected ) 
		return TRUE; 
	CString sQuit = _T( "QUIT\r\n" ); 
	m_wsPOP3Server.Send( (LPCTSTR)sQuit, sQuit.GetLength() ); 
 
	ret = get_response( QUIT ); 
	m_wsPOP3Server.Close(); 
 
	m_bConnected = FALSE; 
	return ret; 
} 
 
 
int CPOP3::GetNumMessages() 
{ 
	CString sStat = _T( "STAT\r\n" ); 
	m_wsPOP3Server.Send( (LPCTSTR)sStat, sStat.GetLength() ); 
 
	if( !get_response( STATUS ) ) return -1; 
 
	int pos=m_sResponse.FindOneOf("0123456789"); 
	if (pos<0) return -1; 
	return atoi(m_sResponse.Mid(pos)); 
 
} 
 
 
BOOL CPOP3::GetMessage( UINT nMsg, CMailMessage* msg) 
{ 
	CString sMsg; 
	CString sRetr; 
	sRetr.Format("RETR %d\r\n",nMsg); 
	m_wsPOP3Server.Send( (LPCTSTR)sRetr, sRetr.GetLength() ); 
 
//	if( !get_response( RETRIEVE ) ) return FALSE; 
 
	sMsg=m_sResponse; 
	while ( sMsg.Find("\r\n.\r\n")<0 )  
	{ 
		int nChars = m_wsPOP3Server.Receive( response_buf, RESPONSE_BUFFER_SIZE ); 
		if ( nChars == SOCKET_ERROR ) return FALSE; 
		m_sResponse=response_buf; 
		sMsg+=m_sResponse.Left( nChars ); 
	} 
 
	sMsg=sMsg.Mid(sMsg.Find("\r\n")+2);  
	sMsg=sMsg.Left(sMsg.GetLength()-3);  
 
	int br=sMsg.Find("\r\n\r\n");  
	msg->m_sHeader=sMsg.Left(br); 
	msg->m_sBody=sMsg.Mid(br+4); 
	msg->DecodeHeader(); 
	msg->DecodeBody(); 
	return TRUE; 
} 
 
BOOL CPOP3::DeleteMessage( UINT nMsg ) 
{ 
	CString sDele = _T( "STAT\r\n" ); 
	sDele.Format("DELE %d\r\n",nMsg); 
	m_wsPOP3Server.Send( (LPCTSTR)sDele, sDele.GetLength() ); 
 
	return get_response( DELE ); 
}