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

📄 epop3.cpp

📁 这个基于嵌入式平台SMART PHONE电子邮件收发管理系统(MAIL MAN是一个电子邮件客户端软件。它以很小的体积
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ePop3.cpp: implementation of the CePop3 class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ePop3.h"
#include "MailInfoDB.h"
#include "harTransform.h"
#include "Mail.h"
#include "CeUidlDB.h"
#include "resource.h"
extern HINSTANCE g_hInst;
char* CePop3::response_table[]=
{
	{"Bad Connection"},
	{"Bad User Name"},
	{"Bad Password Name"},
	{"Error occured during QUIT"},
	{"Error occured during DELE"},
	{"Error occured during RSET"},
	{"Error occured during STAT"},
	{"Error occured during NOOP"},
	{"Error occured during LIST"},
	{"Error occured during RETR"}
};



//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CePop3::CePop3()
{
	m_MailList = NULL;
}

CePop3::~CePop3()
{

}

void CePop3::set_user(char* user)
{
	strcpy(m_user,user);
}
void CePop3::set_password(char *password)
{
	strcpy(m_password,password);
}
void CePop3::set_servername(char *servername)
{
	strcpy(m_pop3server,servername);
}

BOOL CePop3::POP3Connect(int portnumber)
{
	WSADATA		wsadata;
	WORD	wversion = MAKEWORD(2,2);
	hostent *hp;
	struct sockaddr_in daddr;

	if(WSAStartup(wversion,&wsadata) != 0)
	{
		strcpy(m_message,"Socket Version Error");
		return FALSE;
	}

	m_socketid = socket(AF_INET, SOCK_STREAM, 0);	
	if(m_socketid ==  INVALID_SOCKET)
	{
		strcpy(m_message,"Socket Creation Error");
		return FALSE;
	}

	hp = gethostbyname(m_pop3server);
	if(hp == NULL)
	{
		strcpy(m_message,"Unknow servername");
		return FALSE;
	}

	memset((void *)&daddr,0,sizeof(daddr));
	daddr.sin_family = AF_INET;
	daddr.sin_port = htons(POP3_PORT_NUMBER); 
	memcpy(&daddr.sin_addr,hp->h_addr_list[0],sizeof(daddr.sin_addr));
	if(connect(m_socketid,(struct sockaddr *)&daddr,sizeof(daddr)) == SOCKET_ERROR)
	{
		strcpy(m_message,"Socket Error");
		return FALSE;
	}
	if(get_response(CONNECTION_CHECK) == false)
	{
		strcpy(m_message,"The Server do not response.");
		return FALSE;
	}
	return TRUE;

}

BOOL CePop3::get_response(int ResponseType)
{
	
	memset(m_rebuffer,0,sizeof(m_rebuffer));
	switch(ResponseType)
	{
			case CONNECTION_CHECK:
			case USER_CHECK:
			case PASSWORD_CHECK:
			case QUIT_CHECK:
				Sleep(1000);
				break;
			case RETR_CHECK:
				Sleep(5000);
				break;
			default :
				Sleep(2500);
				break;

	}
	int actlen = recv(m_socketid,m_rebuffer,RESPONSEBUFFER_LENGTH,0);
//	if(RETR_CHECK == ResponseType)
//		MessageBox(NULL,L"aa",L"aa",MB_OK);
	switch (ResponseType)
	{
		case CONNECTION_CHECK:
			if (strncmp(m_rebuffer,"-ERR", 4) == 0)
			{
				strncpy(m_ErrorMessage,m_ErrorMessage,MAX_ERROR_MESSAGE_LENGTH);
				return FALSE;
			} 
			break;

		case USER_CHECK:
			if (strncmp(m_rebuffer,"-ERR", 4) == 0)
			{
				strncpy(m_ErrorMessage,m_ErrorMessage,MAX_ERROR_MESSAGE_LENGTH);
				return FALSE;
			} 
			break;
		case PASSWORD_CHECK:
			if (strncmp(m_rebuffer,"-ERR", 4) == 0)
			{
				strncpy(m_ErrorMessage,m_ErrorMessage,MAX_ERROR_MESSAGE_LENGTH);
				return FALSE;
			}
			break;
		case QUIT_CHECK:
			if (strncmp(m_rebuffer,"-ERR", 4) == 0)
			{
				strncpy(m_ErrorMessage,m_ErrorMessage,MAX_ERROR_MESSAGE_LENGTH);
				return FALSE;
			}
			break;
		case DELETE_CHECK:
			if (strncmp(m_rebuffer,"-ERR", 4) == 0)
			{
				strncpy(m_ErrorMessage,m_ErrorMessage,MAX_ERROR_MESSAGE_LENGTH);
				return FALSE;
			}
			break;
		case RSET_CHECK:
			if (strncmp(m_rebuffer,"-ERR", 4) == 0)
			{
				strncpy(m_ErrorMessage,m_ErrorMessage,MAX_ERROR_MESSAGE_LENGTH);
				return FALSE;
			}
			break;
		case STAT_CHECK:
			if (strncmp(m_rebuffer,"-ERR", 4) == 0||strlen(m_rebuffer) == 0)
			{
				strncpy(m_ErrorMessage,m_ErrorMessage,MAX_ERROR_MESSAGE_LENGTH);
				return FALSE;
			}
			else
			{
				BOOL EmailNumber = TRUE;
				for (char *p = m_rebuffer; *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 (strncmp(m_rebuffer,"-ERR", 4) == 0)
			{
				strncpy(m_ErrorMessage,m_ErrorMessage,MAX_ERROR_MESSAGE_LENGTH);
				return FALSE;
			}
			break;

		case LIST_CHECK:
			if (strncmp(m_rebuffer,"-ERR", 4) == 0)
			{
				strncpy(m_ErrorMessage,m_ErrorMessage,MAX_ERROR_MESSAGE_LENGTH);
				return FALSE;
			}
			else
			{
				BOOL SIZE = FALSE;
				for (char *p = m_rebuffer; *p != '\0'; p++)
				{
					if (*p == '\t' || *p == ' ')
					{						
						if(SIZE == FALSE)
						{
							SIZE = TRUE;
						}
						else
						{
							m_SizeOfMsg[m_CurrentMsg-1] = atoi(p);
							return TRUE;
						}
								
					}
				}
			}
			break;
			
		case UIDL_CHECK:
			if (strncmp(m_rebuffer,"-ERR", 4) == 0)
			{
				strncpy(m_ErrorMessage,m_ErrorMessage,MAX_ERROR_MESSAGE_LENGTH);
				return FALSE;
			}
			else
			{
				BOOL UIDL_flag = FALSE;
				for (char *p = m_rebuffer; *p != '\0'; p++)
				{
					if (*p == '\t' || *p == ' ')
					{						
						if(UIDL_flag == FALSE)
						{
							UIDL_flag = TRUE;
						}
						else
						{
							char* end = strstr(p,"\r\n");
							if(end != NULL)
								*end = '\0';
							strcpy(m_UidlsOfMsg[m_CurrentMsg-1],p+1);
							return TRUE;
						}
								
					}
				}
			}
			break;	

		case RETR_CHECK:
			if (strncmp(m_rebuffer,"-ERR", 4) == 0)
			{
				strncpy(m_ErrorMessage,m_ErrorMessage,MAX_ERROR_MESSAGE_LENGTH);
				return FALSE;
			}
			else
			{	
				int n_totalbytes = m_MailList[m_CurrentMsg].m_size;  /////总字节数
				int n_receivedbytes = 0;
				bool flag_over = FALSE;
				if(actlen > 0)
				{
					n_receivedbytes = actlen ;   /////目前已经收到的总字节数
					DWORD lpNumberOfBytesWritten;
					m_FileManager.WriteMailFile(m_hFile,m_rebuffer,n_receivedbytes,&lpNumberOfBytesWritten,TRUE);
					if(n_receivedbytes > n_totalbytes && strstr(m_rebuffer,"\r\n.\r\n") != (char*)NULL)
					flag_over = TRUE;
				}

				while(!flag_over)
				{
					char temp[4* 1024];
					memset(temp,0,sizeof(temp));
					int n_bytes;   ////////////这次收到的字节数
					n_bytes = recv(m_socketid,temp,sizeof(temp),0);
					DWORD lpNumberOfBytesWritten;
					m_FileManager.WriteMailFile(m_hFile,temp,n_bytes,&lpNumberOfBytesWritten,TRUE);
					n_receivedbytes += n_bytes ;
					if(n_receivedbytes > n_totalbytes && strstr(temp,"\r\n.\r\n") != (char*)NULL)
						flag_over = TRUE;
				}
				this->m_actualreceivedbytes = n_receivedbytes;		
			}
			break;	
	}
	memset(m_rebuffer,0,RESPONSEBUFFER_LENGTH);
	return TRUE;
}

BOOL CePop3::DisConnect()
{
	delete []m_MailList;
	char quitimf[] = "QUIT \r\n";
	if(send(m_socketid,quitimf,strlen(quitimf),0) == SOCKET_ERROR)
	{
		strcpy(m_message,"The disconnect failed");
		return FALSE;
	}

	if(get_response(DISCONNECTION_CHECK)==false)
	{
		strcpy(m_message,"The disconnect failed");
		return FALSE;
	}

	if(closesocket(m_socketid) == SOCKET_ERROR)
	{
		strcpy(m_message,"The disconnect failed");
		return FALSE;
	}
	if(WSACleanup() == SOCKET_ERROR)
	{
		strcpy(m_message,"The disconnect failed");
		return FALSE;
	}
	return TRUE;
}

BOOL CePop3::Login()
{

	//connect(m_socketid,(struct sockaddr *)&daddr,sizeof(daddr)) == SOCKET_ERROR
	char user[64];
	char pass[64];
	
	strcpy(user,"user ");
	strcpy(pass,"pass ");

	strcat(user,m_user);
	strcat(pass,m_password);

	strcat(user,"\r\n");
	strcat(pass,"\r\n");
	
	if(send(m_socketid,user,strlen(user),0)==SOCKET_ERROR)
	{
		strcpy(m_message,"Socket Error");
		return FALSE;
	}
	if(get_response(USER_CHECK) == false)
	{
		strcpy(m_message,"The Server do not response.");
		return FALSE;
	}

	if(send(m_socketid,pass,strlen(pass),0)==SOCKET_ERROR)
	{
		strcpy(m_message,"Socket Error");
		return FALSE;
	}
	if(get_response(PASSWORD_CHECK) == false)
	{
		strcpy(m_message,"The Server do not response.");
		return FALSE;
	}

	this->PrepareDB();

	return true;
}

BOOL CePop3::Delete(int MsgNumber)
{
	char buf[64];
	int index = m_MailList[MsgNumber].m_index;

	sprintf(buf, "DELE %d\r\n",index);

	if(send(m_socketid,buf,strlen(buf),0)==SOCKET_ERROR)
	{
		strcpy(m_message,"Socket Error");
		return FALSE;
	}
	if(get_response(DELETE_CHECK) == FALSE)
		return FALSE;
	return TRUE;
}

BOOL CePop3::Noop()
{
	char buf[64];
	sprintf(buf, "NOOP \r\n");

	if(send(m_socketid,buf,strlen(buf),0)==SOCKET_ERROR)
	{
		strcpy(m_message,"Socket Error");
		return FALSE;
	}
	if(get_response(NOOP_CHECK) == FALSE)
		return FALSE;
	return TRUE;
}

BOOL CePop3::Reset()
{
	char buf[64];
	sprintf(buf, "RESET \r\n");

	if(send(m_socketid,buf,strlen(buf),0)==SOCKET_ERROR)
	{
		strcpy(m_message,"Socket Error");
		return FALSE;
	}
	if(get_response(RSET_CHECK) == FALSE)
		return FALSE;
	return TRUE;
}

BOOL CePop3::Retrieve(int MsgNumber)
{	
	int index = m_MailList[MsgNumber].m_index;

⌨️ 快捷键说明

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