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

📄 epop3.cpp

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

	TCHAR* filename = m_MailList[MsgNumber].m_Filename;
	m_hFile = m_FileManager.CreateMailFile(filename);
	if(m_hFile == NULL)
		return FALSE;
	
	
	m_CurrentMsg = MsgNumber;

	char buf[64];
	sprintf(buf, "RETR %d\r\n",index);

	if(send(m_socketid,buf,strlen(buf),0)==SOCKET_ERROR)
	{
		strcpy(m_message,"Socket Error");
		return FALSE;
	}
	if(get_response(RETR_CHECK) == FALSE)
		return FALSE;
	
	CloseHandle(m_hFile);
	m_MailList[MsgNumber].m_actualreceivedbytes = m_actualreceivedbytes;

	memset(m_MsgContent,0,MAX_MESSAGE_CONTENT_LENGTH);
	return TRUE;
}

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

	if(send(m_socketid,buf,strlen(buf),0)==SOCKET_ERROR)
	{
		strcpy(m_message,"Socket Error");
		return FALSE;
	}
	if(get_response(STAT_CHECK) == FALSE)
		return FALSE;
	m_SizeOfMsg = new int[m_NumberMail/4*4 + 4];
	m_UidlsOfMsg = new char*[m_NumberMail/4*4 + 4];
	m_IndexOfMsg = new int[m_NumberMail/4*4 + 4];
	for(int i = 0;i<m_NumberMail;i++)
	{
		m_UidlsOfMsg[i] = new char[80];
	}
	return TRUE;
}

BOOL CePop3::List()
{
	for(int i = 1; i<= m_NumberMail;i++)
	{
		if(!ListByNum(i))
			return FALSE;
	}
	return TRUE;
}

BOOL CePop3::ListByNum(int MsgNumber)
{
	m_CurrentMsg = MsgNumber;
	char buf[64];
	sprintf(buf, "LIST %d\r\n",MsgNumber);

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

	return TRUE;
}



BOOL CePop3::CreateMailList()
{
	TCHAR root[60],recdirect[40],full[160];
	LoadString(g_hInst,IDS_STRING_APPDATAPATH,root,60);
	LoadString(g_hInst,IDS_STRING_RMAILDIRECTORY,recdirect,40);
	m_MailList = new CMail[m_NumberMail];
	for(int i = 0;i<m_NumberMail;i++)
	{
		int index = m_IndexOfMsg[i];
		m_MailList[i].m_index = index + 1;
		m_MailList[i].m_size = m_SizeOfMsg[index];
		strcpy(m_MailList[i].m_Uidl,m_UidlsOfMsg[index]);
		
		wsprintf(full,L"%s\\%s\\%s\\mail_%d",root,recdirect,m_DBName,i+1);
		lstrcpy(m_MailList[i].m_Filename,full);
	}

	return TRUE;
}

BOOL CePop3::ParseMailHead()
{
	//PBYTE process_buff = (PBYTE)LocalAlloc (LMEM_FIXED, BUFFSIZE);
	PBYTE process_buff = new BYTE[BUFFSIZE];
	if (!process_buff) {
		MessageBox (NULL, TEXT ("Not enough memory"),
			TEXT ("Error111112356"), MB_OK);
	} 
	
	CEOID id= m_InMail.FindDatebase(m_DBName,DATABASE_TYPE);
	if(id == NULL)
	{}
	m_InMail.OpenMailInfoDB(NULL,m_DBName,NULL);
	
	for(int i = 0;i<m_NumberMail ;i++)
	{
		memset(process_buff,0,BUFFSIZE);
		CMail* mail = &m_MailList[i];
		HANDLE hFile = m_FileManager.CreateMailFile(mail->m_Filename);
		if(hFile == NULL)
		{
			MessageBox (NULL, TEXT ("Create File Failed"),
				TEXT ("Error"), MB_OK|MB_ICONERROR);
		}
		int nNumberOfByteToRead  = (int)GetFileSize(hFile,NULL);
		DWORD lpNumberOfBytesRead;
		m_FileManager.ReadMailFile(hFile,process_buff,nNumberOfByteToRead,&lpNumberOfBytesRead);
		CloseHandle(hFile);
		
		mail->m_Body = (char*)process_buff;
		
		mail->ParseMailHead();
		
		CharTransform transform;
		TCHAR* m_From = transform.CharToTChar(mail->m_From);
		TCHAR* m_To = transform.CharToTChar(mail->m_To);
		TCHAR* m_Subject = transform.CharToTChar(mail->m_Subject);
		
		MailInfoDB record;
		lstrcpy(record.m_From , m_From);
		lstrcpy(record.m_To , m_To);
		lstrcpy(record.m_Subject , m_Subject);
		record.m_IsDeleted = 0;
		record.m_IsReaded = 0;
		record.m_Size = mail->m_actualreceivedbytes;
		record.m_Date = mail->m_date;

		TCHAR filename[100],root[50],recdirect[40];
		LoadString(g_hInst,IDS_STRING_APPDATAPATH,root,60);
		LoadString(g_hInst,IDS_STRING_RMAILDIRECTORY,recdirect,40);


		wsprintf(filename,L"%s\\%s\\%s\\%i%i%i%i",root,recdirect,m_DBName,record.m_Date.wDay ,record.m_Date.wHour,record.m_Date.wMinute,record.m_Date.wSecond);
		lstrcpy(record.m_Filename,filename);
		if(!MoveFile(mail->m_Filename,record.m_Filename))
		{
			//int Error = GetLastError();
			//MessageBox(NULL,L"Error",L"Error",0);
		}

		m_InMail.WriteMailInfoDB(record);
		
		delete[] m_From;
		delete[] m_To;
		delete[] m_Subject;
		
	}
	//LocalFree(process_buff);
	delete []process_buff;
	m_InMail.CloseDBHandle();
	return TRUE;
}

BOOL CePop3::Retrieve()
{
	for(int i = 0;i < m_NumberMail ;i++)
	{
		this->Retrieve(i);
	}
	return TRUE;
}

BOOL CePop3::PrepareDB()
{
	CharTransform transform;
	TCHAR* username = transform.CharToTChar(this->m_username);
	TCHAR rootdirect[60],recdirect[40],fullpath[120],
		  inbox[20],trashbox[20],uidbox[20];

	LoadString(g_hInst,IDS_STRING_APPDATAPATH,rootdirect,60);
	LoadString(g_hInst,IDS_STRING_RMAILDIRECTORY,recdirect,40);
	LoadString(g_hInst,IDS_STRING_INBOX,inbox,20);
	LoadString(g_hInst,IDS_STRING_TRASHBOX,trashbox,20);
	LoadString(g_hInst,IDS_STRING_UID,uidbox,20);
	lstrcpy(m_DBName , username);
	delete[] username;

//create or chech directory
	CreateDirectory(rootdirect,NULL);
	wsprintf(fullpath,L"%s\\%s",rootdirect,recdirect);
	CreateDirectory(fullpath,NULL);
	wsprintf(fullpath,L"%s\\%s\\%s",rootdirect,recdirect,m_DBName);
	CreateDirectory(fullpath,NULL);


	
	wsprintf(fullpath,L"%s\\%s",rootdirect,inbox);
	if(!m_InMail.MountVolume(fullpath))
	{
		int error = GetLastError();
		MessageBox(NULL,L"DBVol Mount Failed",L"Error",MB_OK|MB_ICONERROR);
	}
	if(m_InMail.FindDatebase(m_DBName,DATABASE_TYPE)== NULL)
		if(!m_InMail.CreateMailInfoDB(m_DBName))
		{
			int error = GetLastError();
			MessageBox(NULL,L"DB Create Failed",L"Error",MB_OK|MB_ICONERROR);
		}
	

	wsprintf(fullpath,L"%s\\%s",rootdirect,trashbox);
	if(!m_TrashMail.MountVolume(fullpath))
	{
		int error = GetLastError();
		MessageBox(NULL,L"DBVol Mount Failed",L"Error",MB_OK|MB_ICONERROR);
	}
	if(m_TrashMail.FindDatebase(m_DBName,DATABASE_TYPE)== NULL)
		if(!m_TrashMail.CreateMailInfoDB(m_DBName))
		{
			int error = GetLastError();
			MessageBox(NULL,L"DB Create Failed",L"Error",MB_OK|MB_ICONERROR);
		}
	

	wsprintf(fullpath,L"%s\\%s",rootdirect,uidbox);
	if(!m_UidlDB.MountVolume(fullpath))
	{
		int error = GetLastError();
		MessageBox(NULL,L"DBVol Mount Failed",L"Error",MB_OK|MB_ICONERROR);
	}
	
	if(m_UidlDB.FindDatabase(m_DBName,UIDL_DATABASE_TYPE)== NULL)
		if(!m_UidlDB.CreateUidlDB(m_DBName))
		{
			int error = GetLastError();
			MessageBox(NULL,L"DB Create Failed",L"Error",MB_OK|MB_ICONERROR);
		}

	return TRUE;
}

void CePop3::set_username(char *username)
{
	strcpy(m_username,username);
}

BOOL CePop3::UIDL()
{
	for(int i = 1; i<= m_NumberMail;i++)
	{
		if(!UIDLByNum(i))
			return FALSE;
	}
	return TRUE;
}

BOOL CePop3::UIDLByNum(int MsgNumber)
{
	m_CurrentMsg = MsgNumber;
	char buf[64];
	sprintf(buf, "UIDL %d\r\n",MsgNumber);

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

BOOL CePop3::CheckUIDL(char *uidl)
{
	CharTransform transform;
	TCHAR* uid= transform.CharToTChar(uidl);
	if(m_UidlDB.UidlExist(uid))
	{
		delete[] uid;
		return TRUE;
	}else
	{
		delete[] uid;
		return FALSE;
	}
}

BOOL CePop3::HaveNewMails()
{
	CEOID id= m_UidlDB.FindDatabase(m_DBName,UIDL_DATABASE_TYPE);
	if(id == NULL)
	{
		return FALSE;
	}
	m_UidlDB.OpenUidlDB(m_DBName,NULL);
	int mailnum = 0;
	int index = 0;
	for(int i = 0;i < this->m_NumberMail;i++)
	{
		char* uidl = m_UidlsOfMsg[i];
		if(!CheckUIDL(uidl))
		{
			m_IndexOfMsg[index] = i ;
			mailnum++;
			index++;
		}
	}
	this->m_NumberMail = mailnum;
	if(m_NumberMail == 0)
		return FALSE;
	else return TRUE;
}


BOOL CePop3::AddUidlDB(int index)
{
	CharTransform transform;
	TCHAR* uidl= transform.CharToTChar(m_MailList[index].m_Uidl);
	m_UidlDB.WriteDBRecord(uidl);
	delete[] uidl;
	return TRUE;
}

BOOL CePop3::ParseMailHead(int index)
{
		PBYTE process_buff = (PBYTE)LocalAlloc (LPTR, BUFFSIZE);
	if (!process_buff) {
		MessageBox (NULL, TEXT ("Not enough memory"),
			TEXT ("Error"), MB_OK|MB_ICONERROR);
		return FALSE;
	} 
	
	CEOID id= m_InMail.FindDatebase(m_DBName,DATABASE_TYPE);
	if(id == NULL)
	{}
	m_InMail.OpenMailInfoDB(NULL,m_DBName,NULL);
	
	
	memset(process_buff,0,BUFFSIZE);
	CMail* mail = &m_MailList[index];
	HANDLE hFile = m_FileManager.CreateMailFile(mail->m_Filename);
	if(hFile == NULL)
	{
	//MessageBox (NULL, TEXT ("Create File Failed"),
		//	TEXT ("Error"), MB_OK);
	}
	int nNumberOfByteToRead  = (int)GetFileSize(hFile,NULL);
	DWORD lpNumberOfBytesRead;
	m_FileManager.ReadMailFile(hFile,process_buff,nNumberOfByteToRead,&lpNumberOfBytesRead);
	CloseHandle(hFile);
	
	mail->m_Body = (char*)process_buff;
	
	mail->ParseMailHead();
	
	CharTransform transform;
	TCHAR* m_From = transform.CharToTChar(mail->m_From);
	TCHAR* m_To = transform.CharToTChar(mail->m_To);
	TCHAR* m_Subject = transform.CharToTChar(mail->m_Subject);
	TCHAR* m_Uidl = transform.CharToTChar(mail->m_Uidl);
	
	MailInfoDB record;
	lstrcpy(record.m_From , m_From);
	lstrcpy(record.m_To , m_To);
	lstrcpy(record.m_Subject , m_Subject);
	lstrcpy(record.m_uidl , m_Uidl);
	record.m_IsDeleted = 0;
	record.m_IsReaded = 0;
	record.m_Size = mail->m_actualreceivedbytes;
	record.m_Date = mail->m_date;

	int ran[3];
	for(int i = 0 ;i<3;i++)
	{
		ran[i] = (abs(Random()))%10;
	}

	TCHAR filename[120],root[50],recdirect[40];
	LoadString(g_hInst,IDS_STRING_APPDATAPATH,root,60);
	LoadString(g_hInst,IDS_STRING_RMAILDIRECTORY,recdirect,40);
	wsprintf(filename,L"%s\\%s\\%s\\%i%i%i%i%i%i%i",root,recdirect,m_DBName,record.m_Date.wDay ,record.m_Date.wHour,record.m_Date.wMinute,record.m_Date.wSecond,ran[0],ran[1],ran[2]);

	lstrcpy(record.m_Filename,filename);
	if(!MoveFile(mail->m_Filename,record.m_Filename))
	{
		int Error = GetLastError();
	}
	
	m_InMail.WriteMailInfoDB(record);
	
	delete[] m_From;
	delete[] m_To;
	delete[] m_Subject;
	
	LocalFree(process_buff);
	m_InMail.CloseDBHandle();
	
	return TRUE;
}

BOOL CePop3::ReleaseSrc()
{
	if(m_SizeOfMsg != NULL)
		delete[] m_SizeOfMsg;
	if(m_UidlsOfMsg != NULL)
	{	
		for(int i = 0;i<m_NumberMail;i++)
		{
			if(m_UidlsOfMsg[i] != NULL)
				delete[] m_UidlsOfMsg[i];
		}
		delete[] m_UidlsOfMsg;
	}
	if(m_IndexOfMsg != NULL)
		delete[] m_IndexOfMsg;
	return TRUE;
}

⌨️ 快捷键说明

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