www.pudn.com > pop.rar > pop3.cpp


// pop3.cpp: implementation of the pop3 class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "pop.h" 
#include "pop3.h" 
#include "fstream.h" 
 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
 
pop3::pop3() 
{ 
	m_PopServer.Create(); 
} 
 
pop3::~pop3() 
{ 
	m_PopServer.Close(); 
} 
 
BOOL pop3::Connect(CString & Host, CString & User, CString & Password) 
{ 
	char	buf [512]; 
 
	if (!m_PopServer.Connect(Host,110)) // 110 Pop3 Port 
	{ 
		m_ErrorMessage = _T("Server cannot be connected"); 
		AfxMessageBox("Server cannot be connected!"); 
		return FALSE; 
	} 
	else 
	{ 
		if(CheckResponse(CONNECTION_CHECK)==FALSE) 
		{ 
			AfxMessageBox("CAN NOT CONNECT TO SERVER!"); 
			return FALSE; 
		} 
		wsprintf (buf, "USER %s\r\n", (LPCSTR) User); 
		m_PopServer.Send(buf, strlen (buf)); 
		if(CheckResponse(USER_CHECK)==FALSE) 
		{ 
			AfxMessageBox("WRONG USER!"); 
			return FALSE; 
		} 
 
		wsprintf (buf, "PASS %s\r\n", (LPCSTR) Password); 
		m_PopServer.Send(buf, strlen (buf));  
		if (CheckResponse(PASSWORD_CHECK)==FALSE) 
		{ 
			AfxMessageBox("WRONG PASSWORD!"); 
			return FALSE; 
		} 
 
		return TRUE; 
	} 
 
} 
 
BOOL pop3::Delete(int & MsgNumber) 
{ 
	char	buf [512]; 
 
	wsprintf (buf, "DELE %d\r\n",MsgNumber ); 
	m_PopServer.Send(buf, strlen (buf));  
	if (CheckResponse(DELETE_CHECK)==FALSE) 
		return FALSE; 
	else 
		return TRUE; 
} 
 
BOOL pop3::Disconnect() 
{ 
	char	buf [512]; 
 
	wsprintf (buf, "QUIT \r\n"); 
	m_PopServer.Send(buf, strlen (buf));  
	if (CheckResponse(QUIT_CHECK)==FALSE) 
		return FALSE; 
	else 
		return TRUE; 
} 
 
BOOL pop3::Noop() 
{ 
	char	buf [512]; 
 
	wsprintf (buf, "NOOP  \r\n"); 
	m_PopServer.Send(buf, strlen (buf));  
	if (CheckResponse(NOOP_CHECK)==FALSE) 
		return FALSE; 
	else 
		return TRUE; 
} 
 
int pop3::GetMessageSize(int MsgNumber) 
{ 
	if(m_SizeOfMsg.GetSize() < MsgNumber+1) 
		return 0; 
	else 
		return m_SizeOfMsg[MsgNumber+1]; 
	 
} 
 
BOOL pop3::Reset() 
{ 
	char	buf [512]; 
 
	wsprintf (buf, "RSET \r\n"); 
	m_PopServer.Send(buf, strlen (buf));  
	if (CheckResponse(RSET_CHECK)==FALSE) 
		return FALSE; 
	else 
		return TRUE; 
} 
 
// MsgContents will hold the msg body 
BOOL pop3::Retrieve(int  MsgNumber) 
{ 
	char	buf [512]; 
	ZeroMemory(buf, 512); 
 
	wsprintf (buf, "RETR %d\r\n",MsgNumber ); 
	m_PopServer.Send(buf, strlen (buf));  
	if (CheckResponse(RETR_CHECK)==FALSE) 
		return FALSE; 
	else 
		return TRUE; 
} 
 
BOOL pop3::Statistics() 
{ 
	char	buf [512]; 
 
	wsprintf (buf, "STAT \r\n"); 
	m_PopServer.Send(buf, strlen (buf));  
	if (CheckResponse(STAT_CHECK)==FALSE) 
		return FALSE; 
	else			 
		return TRUE;	 
} 
 
CString pop3::GetMsgContents() 
{ 
	return m_MsgContents; 
} 
 
int pop3::GetNumberOfMails() 
{ 
	return m_NumberMail; 
} 
 
int pop3::GetTotalMailSize() 
{ 
	return m_TotalSize; 
} 
 
BOOL pop3::Connect() 
{ 
	Connect(m_Host, m_User, m_Password); 
	return TRUE; 
} 
 
void pop3::SetHost(CString & Host) 
{ 
	m_Host = Host; 
} 
 
CString pop3::GetHost() 
{ 
	return m_Host; 
} 
 
void pop3::SetUser(CString & User) 
{ 
	m_User = User; 
} 
 
CString pop3::GetUser() 
{ 
	return m_User; 
} 
 
void pop3::SetPassword(CString & Password) 
{ 
	m_Password = Password; 
} 
 
CString pop3::GetPassword() 
{ 
	return m_Password; 
} 
 
BOOL pop3::CheckResponse(int ResponseType) 
{ 
	char	buf [1000]; 
 
	for (int i=0;i<512;i++) 
		buf[i]='\0'; 
 
	m_PopServer.Receive(buf, sizeof(buf)); 
 
	switch (ResponseType) 
	{ 
		case CONNECTION_CHECK: 
			if (strnicmp(buf,"-ERR", 4) == 0) 
			{ 
				m_ErrorMessage = _T("Bad Connection"); 
				return FALSE; 
			}  
			break; 
 
		case USER_CHECK: 
			if (strnicmp(buf,"-ERR", 4) == 0) 
			{ 
				m_ErrorMessage = _T("Bad User Name"); 
				return FALSE; 
			}  
			break; 
		case PASSWORD_CHECK: 
			if (strnicmp(buf,"-ERR", 4) == 0) 
			{ 
				m_ErrorMessage = _T("Bad Password Name"); 
				return FALSE; 
			} 
			break; 
		case QUIT_CHECK: 
			if (strnicmp(buf,"-ERR", 4) == 0) 
			{ 
				m_ErrorMessage = _T("Error occured during QUIT"); 
				return FALSE; 
			} 
			break; 
		case DELETE_CHECK: 
			if (strnicmp(buf,"-ERR", 4) == 0) 
			{ 
				m_ErrorMessage = _T("Error occured during DELE"); 
				return FALSE; 
			} 
			break; 
		case RSET_CHECK: 
			if (strnicmp(buf,"-ERR", 4) == 0) 
			{ 
				m_ErrorMessage = _T("Error occured during RSET"); 
				return FALSE; 
			} 
			break; 
		case STAT_CHECK: 
			if (strnicmp(buf,"-ERR", 4) == 0) 
			{ 
				m_ErrorMessage = _T("Error occured during STAT"); 
				return FALSE; 
			} 
			else 
			{ 
				BOOL EmailNumber = TRUE; 
				for (char *p = buf; *p != '\0'; p++) 
				{ 
					if (*p == '\t' || *p == ' ') 
					{						 
						if(EmailNumber == TRUE) 
						{ 
							m_NumberMail = atoi(p); 
							EmailNumber = FALSE; 
						} 
						else 
						{ 
							m_TotalSize = atoi(p); 
							return TRUE; 
						} 
						 
						 
					} 
				} 
 
			} 
			break; 
		case NOOP_CHECK: 
			if (strnicmp(buf,"-ERR", 4) == 0) 
			{ 
				m_ErrorMessage = _T("Error occured during NOOP"); 
				AfxMessageBox("NOOP ERR!"); 
				return FALSE; 
			} 
			break; 
 
		case LIST_CHECK: 
			if (strnicmp(buf,"-ERR", 4) == 0) 
			{ 
				m_ErrorMessage = _T("Error occured during LIST"); 
				return FALSE; 
			} 
			else 
			{ 
				m_PopServer.Receive(buf, sizeof(buf)); 
 
				for (char *p = buf; *p != '.'; p++) 
					if (*p == '\t' || *p == ' ') 
						m_SizeOfMsg.Add(atoi(p)); 
			} 
			break;	 
		case RETR_CHECK: 
			if (strnicmp(buf,"-ERR", 4) == 0) 
			{ 
				m_ErrorMessage = _T("Error occured during RETR"); 
				return FALSE; 
			} 
			else 
			{ 
				char temp[9000]; 
				 
                char	buf1 [512]; 
            	wsprintf (buf1, "NOOP \r\n"); 
				m_MsgContents = ""; 
 
				do 
				{ 
					for(int k = 0; k <1000; k++) 
					    for(int l = 0; l <10000; l++) 
						{}//sleep(1111); 
					int i = m_PopServer.Receive(temp, sizeof(temp)); 
					m_MsgContents += temp; 
					int t = m_MsgContents.Find("\n.\r\n\0"); 
					if(t>0) 
						m_MsgContents = m_MsgContents.Left(t); 
					t = m_MsgContents.Find("+OK "); 
					if(t>0) 
					{ 
						m_MsgContents = m_MsgContents.Left(t); 
						break; 
					} 
					m_PopServer.Send(buf1, strlen (buf1)); 
					if(i <= 30  && strnicmp(temp,"+OK ",4) == 0) 
						break; 
				}while(1); 
			} 
			break; 
	} 
	return TRUE; 
} 
 
CString pop3::GetErrorMessage() 
{ 
	return m_ErrorMessage; 
} 
 
BOOL pop3::List() 
{ 
	char	buf [512]; 
 
	wsprintf (buf, "LIST  \r\n"); 
	m_PopServer.Send(buf, strlen (buf));  
	if (CheckResponse(LIST_CHECK)==FALSE) 
		return FALSE; 
	else 
		return TRUE; 
 
}