📄 pop3handler.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 + -