www.pudn.com > MailAgent.rar > POP3.cpp
#include "stdafx.h"
#include "POP3.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
TCHAR* CPOP3::error_table[] =
{
"没有连接服务器",
"用户名错误",
"非法用户名/密码组合",
"不能获得信息",
"信息获取失败",
"不能删除信息",
"退出错误"
};
//////////////////////////////////////////////////////////////////////
// Konstruktion/Destruktion
//////////////////////////////////////////////////////////////////////
CPOP3::CPOP3( LPCTSTR szPOP3ServerName, UINT nPort, LPCTSTR sUsername, LPCTSTR sPassword)
{
ASSERT( szPOP3ServerName != NULL );
AfxSocketInit();
m_sPOP3ServerHostName = szPOP3ServerName;
m_nPort = nPort;
m_sUsername = sUsername;
m_sPassword = sPassword;
m_bConnected = FALSE;
m_sError = _T( "OK" );
}
CPOP3::~CPOP3()
{
if( m_bConnected )
Disconnect();
}
BOOL CPOP3::Connect()
{
CString sUser;
CString sPass;
if( m_bConnected )
return TRUE;
if( !m_wsPOP3Server.Create() )
{
m_sError = _T( "不能创建套接字!" );
return FALSE;
}
if( !m_wsPOP3Server.Connect( GetServerHostName(), GetPort() ) )
{
m_sError = _T( "不能建立与服务器的连接!" );
m_wsPOP3Server.Close();
return FALSE;
}
if( !get_response( CONNECTION ) )
{
m_wsPOP3Server.Close();
return FALSE;
}
sUser.Format( "USER %s\r\n", GetUsername());
m_wsPOP3Server.Send( (LPCTSTR)sUser, sUser.GetLength() );
if( !get_response( IDENTIFICATION ) )
{
m_wsPOP3Server.Close();
return FALSE;
}
sPass.Format( "PASS %s\r\n", GetPassword());
m_wsPOP3Server.Send( (LPCTSTR)sPass, sPass.GetLength() );
if( !get_response( AUTHENTIFICATION ) )
{
m_wsPOP3Server.Close();
return FALSE;
}
m_bConnected = TRUE;
return TRUE;
}
BOOL CPOP3::get_response( UINT executed_action )
{
int nChars = m_wsPOP3Server.Receive( response_buf, RESPONSE_BUFFER_SIZE );
if( nChars == SOCKET_ERROR )
{
m_sError = _T( "套接字错误!" );
return FALSE;
}
m_sResponse = response_buf;
m_sResponse = m_sResponse.Left(nChars);
if (m_sResponse.Left(4)=="-ERR")
{
m_sError=error_table[executed_action];
return FALSE;
}
return TRUE;
}
UINT CPOP3::GetPort()
{
return m_nPort;
}
CString CPOP3::GetUsername()
{
return m_sUsername;
}
CString CPOP3::GetPassword()
{
return m_sPassword;
}
CString CPOP3::GetLastError()
{
return m_sError;
}
CString CPOP3::GetServerHostName()
{
return m_sPOP3ServerHostName;
}
void CPOP3::SetServerProperties( LPCTSTR sServerHostName, UINT nPort)
{
ASSERT( sServerHostName != NULL );
if( sServerHostName == NULL )
return;
m_sPOP3ServerHostName = sServerHostName;
m_nPort = nPort;
}
void CPOP3::SetUserProperties( LPCTSTR sUsername, LPCTSTR sPassword )
{
ASSERT( sUsername != NULL );
ASSERT( sPassword != NULL );
if( sUsername == NULL )
return;
if( sPassword == NULL )
return;
m_sUsername = sUsername;
m_sPassword = sPassword;
}
BOOL CPOP3::Disconnect()
{
BOOL ret;
if( !m_bConnected )
return TRUE;
CString sQuit = _T( "QUIT\r\n" );
m_wsPOP3Server.Send( (LPCTSTR)sQuit, sQuit.GetLength() );
ret = get_response( QUIT );
m_wsPOP3Server.Close();
m_bConnected = FALSE;
return ret;
}
int CPOP3::GetNumMessages()
{
CString sStat = _T( "STAT\r\n" );
m_wsPOP3Server.Send( (LPCTSTR)sStat, sStat.GetLength() );
if( !get_response( STATUS ) ) return -1;
int pos=m_sResponse.FindOneOf("0123456789");
if (pos<0) return -1;
return atoi(m_sResponse.Mid(pos));
}
BOOL CPOP3::GetMessage( UINT nMsg, CMailMessage* msg)
{
CString sMsg;
CString sRetr;
sRetr.Format("RETR %d\r\n",nMsg);
m_wsPOP3Server.Send( (LPCTSTR)sRetr, sRetr.GetLength() );
// if( !get_response( RETRIEVE ) ) return FALSE;
sMsg=m_sResponse;
while ( sMsg.Find("\r\n.\r\n")<0 )
{
int nChars = m_wsPOP3Server.Receive( response_buf, RESPONSE_BUFFER_SIZE );
if ( nChars == SOCKET_ERROR ) return FALSE;
m_sResponse=response_buf;
sMsg+=m_sResponse.Left( nChars );
}
sMsg=sMsg.Mid(sMsg.Find("\r\n")+2);
sMsg=sMsg.Left(sMsg.GetLength()-3);
int br=sMsg.Find("\r\n\r\n");
msg->m_sHeader=sMsg.Left(br);
msg->m_sBody=sMsg.Mid(br+4);
msg->DecodeHeader();
msg->DecodeBody();
return TRUE;
}
BOOL CPOP3::DeleteMessage( UINT nMsg )
{
CString sDele = _T( "STAT\r\n" );
sDele.Format("DELE %d\r\n",nMsg);
m_wsPOP3Server.Send( (LPCTSTR)sDele, sDele.GetLength() );
return get_response( DELE );
}