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

📄 pop3handler.cpp

📁 邮件相关
💻 CPP
字号:
// POP3Handler.cpp: Implementierung der Klasse CPOP3Handler.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"		
#include "POP3Handler.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Konstruktion/Destruktion
//////////////////////////////////////////////////////////////////////

CPOP3Handler::CPOP3Handler()
	{
	if (!m_POP3Server.Create ())
		AfxMessageBox ("Unable to create Socket", MB_ICONSTOP);

	// Initialising
	strcpy (m_ListPath,			"POPlist.txt");
	strcpy (m_OutputFilePath,	"POPOutputFile.txt");
	}

CPOP3Handler::~CPOP3Handler()
	{
	Disconnect ();
	}

bool CPOP3Handler::Connect(LPCTSTR p_User, LPCTSTR p_Password, LPCTSTR p_Host, int p_Port) 
	{ 
	char buffer [512]; 
	if (!m_POP3Server.Connect(p_Host,p_Port))
		{ 
		m_ErrorMessage = _T("Server cannot be connected"); 
		return false;
		} 
	else 
		{ 
		if(CheckResponse(CONNECTION_CHECK)==false) 
			return false; 

		wsprintf (buffer, "USER %s\r\n", p_User); 
		m_POP3Server.Send (buffer, strlen (buffer)); 
		if(CheckResponse (USER_CHECK) == false) 
			return false; 

		wsprintf (buffer, "PASS %s\r\n", p_Password); 
		m_POP3Server.Send (buffer, strlen (buffer)); 
		if (CheckResponse (PASSWORD_CHECK) == false) 
			return false; 

		return true; 
		} 
	} 

bool CPOP3Handler::Disconnect() 
	{
	char buffer [512];

	strcpy (buffer, "QUIT\r\n");
	m_POP3Server.Send (buffer, strlen (buffer)); 
	if (CheckResponse (QUIT_CHECK) == false) 
		return false; 

	m_POP3Server.ShutDown ();
	m_POP3Server.Close ();

	return true;
	} 

bool CPOP3Handler::CheckResponse (int p_ResponseType) 
	{ 
	char	buffer [8192]; 
	int		ReceivedBytes,skip;
	bool	ready;

	memset (buffer, 0, sizeof (buffer));

	Sleep (2000);
	ReceivedBytes = m_POP3Server.Receive(buffer, sizeof(buffer)); 

	switch (p_ResponseType) 
		{ 
		case CONNECTION_CHECK:
			{
			if (strnicmp(buffer,"-ERR", 4) == 0) 
				{ 
				m_ErrorMessage = _T("Bad Connection"); 
				return false; 
				} 
			break;
			}

		case USER_CHECK:
			{
			if (strnicmp(buffer,"-ERR", 4) == 0) 
				{ 
				m_ErrorMessage = _T("Bad User Name"); 
				return false; 
				} 
			break;
			}

		case PASSWORD_CHECK: 
			{
			if (strnicmp(buffer,"-ERR", 4) == 0) 
				{ 
				m_ErrorMessage = _T("Bad Password Name"); 
				return false; 
				}

			break; 
			}

		case QUIT_CHECK: 
			{
			if (strnicmp(buffer,"-ERR", 4) == 0) 
				{ 
				m_ErrorMessage = _T("Error occured during QUIT"); 
				return false; 
				}

			break; 
			}

		case DELETE_CHECK: 
			{
			if (strnicmp(buffer,"-ERR", 4) == 0) 
				{ 
				m_ErrorMessage = _T("Error occured during DELE"); 
				return false; 
				}

			break; 
			}

		case RSET_CHECK: 
			{
			if (strnicmp(buffer,"-ERR", 4) == 0) 
				{ 
				m_ErrorMessage = _T("Error occured during RSET");
				return false; 
				}

			break; 
			}

		case STAT_CHECK: 
			{
			if (strnicmp(buffer,"-ERR", 4) == 0)
				{
				m_ErrorMessage = _T("Error occured during STAT");
				return false;
				}
			else
				{
				bool EmailNumber = true;
				for (char *p = buffer; *p != '\0'; p++)
					{
					if (*p == '\t' || *p == ' ')
						{
						if(EmailNumber == true) 
							{ 
							m_Number_NewMails = atoi(p); 
							EmailNumber = false; 
							}
						else
							{
							m_TotalMailSize = atoi(p); 
							return true; 
							}
						}
					}
				}

			break; 
			}

		case NOOP_CHECK: 
			{
			if (strnicmp(buffer,"-ERR", 4) == 0) 
				{ 
				m_ErrorMessage = _T("Error occured during NOOP"); 
				return false; 
				}

			break; 
			}

		case LIST_CHECK: 
			{
			if (strnicmp(buffer,"-ERR", 4) == 0) 
				{ 
				m_ErrorMessage = _T("Error occured during LIST"); 
				return false; 
				} 
			else 
				{
				if (m_ListFile.Open(m_ListPath, CFile::modeCreate | CFile::modeWrite))
					{
					ready=false;
					if (strnicmp (buffer, "+OK \r\n", 6) == 0) 
						skip=6;
					else  
						skip=4;			//skip +OK(SPACE)

					while (!ready)
						{
						if (ReceivedBytes == SOCKET_ERROR)
							{
							m_ListFile.Close();
							ready=true;
							m_ErrorMessage = _T("Error reading from socket!");
							return false;
							}
						else
							{
							m_ListFile.Write (buffer + skip, ReceivedBytes - skip);
							skip=0;
							if (((buffer [ReceivedBytes - 3] == '.') &&
								 (buffer [ReceivedBytes - 2] == '\r') && 
								 (buffer [ReceivedBytes - 1] == '\n')) ||

								 (ReceivedBytes==0) ||

								((buffer [0]				  = 'O') && 
								 (buffer [1]				 == 'K') && 
								 (buffer [ReceivedBytes - 3] == '.') && 
								 (buffer [ReceivedBytes - 2] == '\r') && 
								 (buffer [ReceivedBytes-1]	 == '\n'))
								)
								{
								ready=true;
								m_ListFile.Close();
								}
							else
								{
								ReceivedBytes = m_POP3Server.Receive (buffer, sizeof(buffer));
								}
							}
						}

					return TRUE;
					}
				else
					{
					//receive all rest data and return false;
					if ((ReceivedBytes != 0) && 
						(ReceivedBytes == sizeof (buffer)))
						{
						ReceivedBytes = m_POP3Server.Receive(buffer, sizeof(buffer));
						}

					m_ErrorMessage = _T("Error creating List File");
					return false;
					}
				}
					
			break;
			}

		case RETR_CHECK: 
			{
			if (strnicmp(buffer,"-ERR", 4) == 0) 
				{ 
				m_ErrorMessage = _T("Error occured during RETR"); 
				return false; 
				} 
			else 
				{ 
				skip=0;
				if (strnicmp(buffer,"+OK", 3) == 0)
					{
					int i = 0;
					while (buffer[i]!='R') 
						i++;

					skip= i;
					}

				if (m_OutputFile.Open (m_OutputFilePath, CFile::modeCreate | CFile::modeWrite))
					{
					ready=false;
					while (!ready)
						{
						if (ReceivedBytes == SOCKET_ERROR)
							{
							ready=true;
							m_ErrorMessage = _T("Error reading from socket!");
							return false;
							}
						else
							{
							m_OutputFile.Write (buffer, ReceivedBytes);

							skip=0;
							if (((buffer[ReceivedBytes - 3] == '.')   &&
								 (buffer[ReceivedBytes - 2] == '\r')  &&
								 (buffer[ReceivedBytes - 1] == '\n')) ||
								 (ReceivedBytes  == 0))
								{
								ready=true;
								}
							else
								{
								ReceivedBytes = m_POP3Server.Receive(buffer, sizeof(buffer)); 
								}
							}
						}

					m_OutputFile.Close ();
					}
				else
					{
					m_ErrorMessage = _T ("Error unable to open Outputfile");
					}
				}

			break;
			}

		case TOP_CHECK: 
			{
			if (strnicmp(buffer,"-ERR", 4) == 0) 
				{ 
				if (m_OutputFile.Open(m_OutputFilePath, CFile::modeCreate | CFile::modeWrite))
					{
					ready=false;
					if (strnicmp(buffer,"+OK \r\n", 6) == 0) 
						skip=6;
					else  
						skip=4;			//skip +OK(SPACE)

					while (!ready)
						{
						if (ReceivedBytes == SOCKET_ERROR)
							{
							//receive all rest data and return false;
							if ((ReceivedBytes != 0) && 
								(ReceivedBytes == sizeof(buffer))) 
								{
								ReceivedBytes = m_POP3Server.Receive(buffer, sizeof(buffer));
								}

							ready = true;
							m_OutputFile.Close();
							m_ErrorMessage = _T("Error reading from socket!");
							return false;
							}
						else
							{
							m_OutputFile.Write(buffer + skip, ReceivedBytes - skip);
							skip=0;
							if (((buffer [ReceivedBytes - 3] == '.')  &&
								 (buffer [ReceivedBytes - 2] == '\r') &&
								 (buffer [ReceivedBytes - 1] == '\n')) ||
								 (ReceivedBytes == 0))
								{
								ready = true;
								m_OutputFile.Close();
								}
							else
								{
								ReceivedBytes = m_POP3Server.Receive(buffer, sizeof(buffer));
								}
							}
						}
					}
				else
					{
					//receive all rest data and return false;
					if ((ReceivedBytes != 0) && 
						(ReceivedBytes == sizeof(buffer))) 
						{
						ReceivedBytes = m_POP3Server.Receive(buffer, sizeof(buffer));
						}

					m_ErrorMessage = _T("Error creating temp input file!");
					return false;
					}
				}

			break; 
			}

		default:
			{
			AfxMessageBox ("Unhandled Type");
			}
		} 

	return true; 
	} 

bool CPOP3Handler::Statistics() 
	{ 
	char buffer [512]; 

	wsprintf (buffer, "STAT \r\n");

	m_POP3Server.Send (buffer, strlen (buffer)); 

	if (CheckResponse (STAT_CHECK) == false) 
		return false; 
	else 
		return true; 
	}


bool CPOP3Handler::Delete(int MsgNumber) 
	{ 
	char buffer [512]; 

	wsprintf (buffer, "DELE %d\r\n",MsgNumber); 
	m_POP3Server.Send(buffer, strlen (buffer)); 
	if (CheckResponse(DELETE_CHECK)==false) 
		return false; 
	else 
		return true; 
	} 

bool CPOP3Handler::Noop() 
	{ 
	char buffer [512]; 

	wsprintf (buffer, "NOOP\r\n");
	m_POP3Server.Send(buffer, strlen (buffer)); 
	if (CheckResponse(NOOP_CHECK)==false) 
		return false; 
	else 
		return true; 
	}


bool CPOP3Handler::Reset() 
	{ 
	char buffer [512]; 

	wsprintf (buffer, "RSET \r\n"); 
	m_POP3Server.Send(buffer, strlen (buffer)); 
	if (CheckResponse(RSET_CHECK)==false) 
		return false; 
	else 
		return true; 
	}

bool CPOP3Handler::Retrieve(int p_MsgNumber) 
	{
	char buffer [512];

	wsprintf (buffer, "RETR %d\r\n", p_MsgNumber);
	m_POP3Server.Send(buffer, strlen (buffer));
	if (CheckResponse(RETR_CHECK)==false) 
		return false; 
	else 
		return true;
	}

bool CPOP3Handler::Retrieve (int p_MsgNumber, LPCTSTR p_pTargetFileName) 
	{
	if (SetOutputFile (p_pTargetFileName))
		{
		Retrieve (p_MsgNumber);
		return true;
		}
	else
		{
		return false;
		}
	}

bool CPOP3Handler::List() 
	{ 
	char buffer [512]; 

	wsprintf (buffer, "LIST\r\n"); 
	m_POP3Server.Send(buffer, strlen (buffer)); 
	if (CheckResponse(LIST_CHECK)==false) 
		return false; 
	else 
		return true; 
	}

bool CPOP3Handler::GetTop(int p_MsgNumber, int p_Length) 
	{ 
	char buffer [512]; 

	wsprintf (buffer, "TOP %d %d\r\n",p_MsgNumber, p_Length);
	m_POP3Server.Send(buffer, strlen (buffer)); 
	if (CheckResponse(TOP_CHECK)==false) 
		return false; 
	else 
		return true; 
	}

bool CPOP3Handler::SetOutputFile(LPCTSTR p_pOutputFileName)
	{
	strcpy (m_OutputFilePath, p_pOutputFileName);

	CFile File;
	if (File.Open (m_OutputFilePath, CFile::modeRead))
		{
		return true;
		}
	else
		{
		m_ErrorMessage = "Error unable to set Output File";
		return false;
		}
	}

CString CPOP3Handler::Get (int p_DataType, int p_MessageNumber)
	{
	// Switch back to standard Output file
	SetOutputFile (m_OutputFilePath);

	CString	Data = "";			
	CString OutputFilePath = "";

	switch (p_DataType)
		{
		case MAIL_AS_STRING:
			{
			if (Retrieve (p_MessageNumber))
				OutputFilePath = m_OutputFilePath;

			break;
			}

		case TOP_AS_STRING:
			{
			if (GetTop (p_MessageNumber, 0))
				OutputFilePath = m_OutputFilePath;

			break;
			}

		case LIST_AS_STRING:
			{
			if (List ())
				OutputFilePath = m_ListPath;

			break;
			}

		default:
			{
			AfxMessageBox ("Error in Get: Invalid Data Type", MB_ICONSTOP);
			break;
			}
		}


	if (OutputFilePath != "")
		{
		CString		Buffer;
		CStdioFile	StdioFile;

		if (StdioFile.Open ((LPCTSTR) OutputFilePath, CFile::modeRead))
			{
			while (StdioFile.ReadString (Buffer))
				{
				Data += Buffer;
				}
			}
		else
			{
			}
		}

	return Data;
	}

int	CPOP3Handler::GetNumberNewMails ()
	{
	return m_Number_NewMails;
	}

int	CPOP3Handler::GetTotalMailSize  ()
	{
	return m_TotalMailSize;
	}

CString CPOP3Handler::GetErrorMessage ()
	{
	return m_ErrorMessage;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -