📄 epop3.cpp
字号:
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 + -