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