www.pudn.com > pop3.rar > AcceptSocket.cpp
// AcceptSocket.cpp : implementation file
//
#include "stdafx.h"
#include "config.h"
#include "AcceptSocket.h"
#include "log.h"
//md5 include start
#include "md5.h"
//md5 include stop
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAcceptSocket
extern LoggerPtr PopSvrLogger;
CAcceptSocket::CAcceptSocket()
{
m_dwThreadId= 0;
m_iState = AUTHORIZATION_STATE;
m_strUser = _T("");
m_strtempUser = _T("");
m_strComm =_T("");
m_Key = _T("");
m_iChkTimes = 0;
m_imailCount = 0;
time_consuming = 0;
m_bIsError = TRUE;
m_bIsRetr = FALSE;
}
CAcceptSocket::~CAcceptSocket()
{/*
//删除socket maillist
if(!m_pMailList.IsEmpty())
{
DeleteMailList(m_pMailList);
m_pMailList.RemoveAll();
}*/
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CAcceptSocket, CSocket)
//{{AFX_MSG_MAP(CAcceptSocket)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
/////////////////////////////////////////////////////////////////////////////
// CAcceptSocket member functions
void CAcceptSocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
//超时记录数
m_iChkTimes = 0;
//接收客户信息
char chr[256];
memset(chr,0,256);
CString str = _T("");
int iRc = this->Receive(chr,255);// MSG_PEEK MSG_OOB
if (iRc <= 0 || chr == (char*)NULL )
{
str = _T("on receive data failed");
PopSvrLogger->error((LPCTSTR)str);
return;
}
//分析客户端信息,返回客户端信息
str.Format("%s",chr);
AnalyseReceiveStr(str);
int iCountComm = m_strCommArr.GetSize();
for(; iCountComm >= 1 ;)
{
DisposeComm();
m_strCommArr.RemoveAt(0);
iCountComm = m_strCommArr.GetSize();
}
CSocket::OnReceive(nErrorCode);
}
void CAcceptSocket::OnClose(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
//quit命令退出,什么都不干
if ((QUIT_STATE == m_iState)||(UPDATE_STATE == m_iState))
{
}
else //非quit命令退出
{
/* if(!strDeleteMailList.IsEmpty())
{
strDeleteMailList.RemoveAll();
}*/
PostThreadMessage(m_dwThreadId, WM_SOCKETCLOSE, 0, 0);
CString strLog;
strLog.FormatMessage("user from %1 and port %2!d! quit itself",m_sSocket,m_nPort);
PopSvrLogger->info((LPCTSTR)strLog);
}
CSocket::OnClose(nErrorCode);
}
//功能: 解析客户命令
//参数: in strClientCommand 客户命令
CString CAcceptSocket::AnalyseComm(CString strClientCommand)
{
CString strSend;
strClientCommand.TrimLeft();
CString strComm, strPara;
if(!IsTrueComm(strClientCommand, strComm, strPara))
{
strSend.FormatMessage(COMMAND_ERR,strClientCommand);
m_bIsError = FALSE;
}
else
{
switch (ParseCommand(strComm))
{
case 0: strSend = DisposeAPOP(strPara);
break;
case 1: strSend = DisposeQUIT(strPara);
break;
case 2: strSend = DisposeUSER(strPara);
break;
case 3: strSend = DisposePASS(strPara);
break;
case 4: strSend = DisposeSTAT(strPara);
break;
case 5: strSend = DisposeLIST(strPara);
break;
case 6: strSend = DisposeRETR(strPara);
break;
case 7: strSend = DisposeDELE(strPara);
break;
case 8: strSend = DisposeRSET(strPara);
break;
case 9: strSend = DisposeNOOP(strPara);
break;
case 10: strSend = DisposeUIDL(strPara);
break;
case 11: strSend = DisposeTOP(strPara);
break;
case -1:
default:
{
strSend = OnUnknown(strPara);
strSend.FormatMessage("%1 [%2]",strSend,strComm);
break;
}
}
}
return strSend;
}
//功能: 对user命令处理
//参数: in strPara user命令后缀参数
CString CAcceptSocket::DisposeUSER(CString strPara)
{
if(!m_strUser.IsEmpty())
{
strPara.FormatMessage(USER_EXIST,"user");
m_bIsError = FALSE;
return strPara;
}
if(m_iState != AUTHORIZATION_STATE)
{
strPara.FormatMessage(STATE_ERR,"user");
m_bIsError = FALSE;
return strPara;
}
strPara.TrimLeft();
strPara.TrimRight();
if(strPara.IsEmpty())
{
strPara.FormatMessage(PARAMETER_ERR,"user");
m_bIsError = FALSE;
return strPara;
}
m_strtempUser = strPara;
m_bIsError = TRUE;
strPara.FormatMessage("%1",NAME_OK);
return strPara;
}
//功能: 对pass命令处理
//参数: in strPara pass命令后缀参数
CString CAcceptSocket::DisposePASS(CString strPara)
{
if(m_strtempUser.IsEmpty())
{
strPara.FormatMessage(NOT_USER,"pass");
m_bIsError = FALSE;
return strPara;
}
if(m_iState != AUTHORIZATION_STATE)
{
strPara.FormatMessage(STATE_ERR,"pass");
m_bIsError = FALSE;
return strPara;
}
if(strPara.IsEmpty())
{
strPara.FormatMessage(PARAMETER_ERR,"pass");
m_bIsError = FALSE;
return strPara;
}
strPara.TrimLeft();
strPara.TrimRight();
//通过用户名密码得到mail列表,存在m_pMailList中
CString strErr;
CString strComm = _T("pass");
BOOL bRst = GetMail(strComm, m_strtempUser, strPara, strErr);
if(!bRst)
{
strPara.FormatMessage("%1", strErr);
return strPara;
}
m_strUser = m_strtempUser;
strPara.FormatMessage(PASS_OK, m_imailCount);
m_bIsError = TRUE;
m_iState = TRANSACTION_STATE;
return strPara;
}
//功能: 通过用户名密码得到mail列表
//参数: in strComm 调用此函数的命令字符串
// in strUser 用户名
// in strPass 密码
// out strErr 错误
BOOL CAcceptSocket::GetMail(CString strComm, CString strUser, CString strPass, CString &strErr)
{
//得到用户ID
CMailAdapter mailAdapter;
int iUserID;
CString strError;
BOOL iRst = mailAdapter.GetUserID(strUser,strPass,iUserID);
if(!iRst)
{
strError.FormatMessage(ERR_FORMAT,mailAdapter.GetLastError());
strErr.FormatMessage("%1 [%2]",strError,strComm);
m_bIsError = FALSE;
return FALSE;
}
//得到邮件ID列表
CStringList slMailID;
iRst = mailAdapter.GetMailIDList(iUserID,slMailID);
if(!iRst)
{
strError.FormatMessage(ERR_FORMAT,mailAdapter.GetLastError());
strErr.FormatMessage("%1 [%2]",strError,strComm);
m_bIsError = FALSE;
return FALSE;
}
//没有新邮件
if(slMailID.GetCount() == 0)
{
m_strUser = m_strtempUser;
strErr.FormatMessage(PASS_OK,0);
m_bIsError = TRUE;
m_iState = TRANSACTION_STATE;
return FALSE;
}
//分配邮件空间
if ( !NewMailList( m_pMailList, slMailID.GetCount(), strError ) )
{
strErr.FormatMessage(strError,strComm);
m_bIsError = FALSE;
return FALSE;
}
//得到邮件列表 无内容无附件
m_imailCount = mailAdapter.GetMailList(slMailID, FALSE, FALSE, m_pMailList);
if(m_imailCount == -1)
{
DeleteMailList(m_pMailList);
m_pMailList.RemoveAll();
strError.FormatMessage(ERR_FORMAT,mailAdapter.GetLastError());
strErr.FormatMessage("%1 [%2]",strError,strComm);
m_bIsError = FALSE;
return FALSE;
}
return TRUE;
}
//--------------------------------------------------------------
// 功能:释放邮件列表空间
// 参数:
// IN CPtrList &plMails 邮件链表引用
// 返回值:空
//--------------------------------------------------------------
void CAcceptSocket::DeleteMailList(CPtrList &plMails)
{
POSITION pos = plMails.GetHeadPosition();
MailDetail * pmail;
for ( pos; NULL != pos; )
{
pmail = (MailDetail *)plMails.GetNext(pos);
delete pmail;
}
}
//--------------------------------------------------------------
// 功能:为邮件列表申请空间
// 参数:
// IN&OUT CPtrList &plMails 邮件链表引用
// IN int imailCount 邮件个数
// 返回值:TRUE 成功,FALSE 失败
//--------------------------------------------------------------
BOOL CAcceptSocket::NewMailList(CPtrList &plMails, int imailCount, CString &strErr)
{
MailDetail * pmail;
for( int i=0; i> 4];
ASC[i * 2 + 1] = "0123456789abcdef"[digest[i] & 0x0F];
}
ASC[i * 2] = '\0';
CString key;
key.Format("%s", ASC);
if( key != strParaKey )
{
strPara.FormatMessage(ERR_FORMAT,"Find 0 record");
strPara.FormatMessage("%1 [%2]",strPara,"apop");
m_bIsError = FALSE;
return strPara;
}
//通过用户名密码得到mail列表
CString strErr;
CString strComm = _T("apop");
bRst = GetMail(strComm, strParaUser, strPassWord, strErr);
if(!bRst)
{
strPara.FormatMessage("%1", strErr);
return strPara;
}
m_strUser = strParaUser;
strPara.FormatMessage(PASS_OK, m_imailCount);
m_bIsError = TRUE;
m_iState = TRANSACTION_STATE;
return strPara;
}
//功能: 对stat命令处理
//参数: in strPara stat命令后缀参数
CString CAcceptSocket::DisposeSTAT(CString strPara)
{
if(m_iState != TRANSACTION_STATE)
{
strPara.FormatMessage(STATE_ERR,"stat");
m_bIsError = FALSE;
return strPara;
}
strPara.TrimRight();
if(!strPara.IsEmpty())
{
strPara.FormatMessage(PARAMETER_ERR,"stat");
m_bIsError = FALSE;
return strPara;
}
int len = 0;
int num = 0;
POSITION pos;
MailDetail *pMail;
for (pos = m_pMailList.GetHeadPosition(); pos != NULL;)
{
pMail = (MailDetail *)m_pMailList.GetNext(pos);
if (!pMail->bMailDeleteTag)
{
len += pMail->iMailSize;
num++;
}
}
// pMail = NULL;
m_bIsError = TRUE;
strPara.FormatMessage(FORMAT_NUM, num, len);
strPara.FormatMessage(OK_FORMAT,strPara);
return strPara;
}
//功能: 对list命令处理
//参数: in strPara list命令后缀参数
CString CAcceptSocket::DisposeLIST(CString strPara)
{
if(m_iState != TRANSACTION_STATE)
{
strPara.FormatMessage(STATE_ERR,"list");
m_bIsError = FALSE;
return strPara;
}
strPara.TrimRight();
//有参数时处理
MailDetail *pMail;
if (!strPara.IsEmpty())
{
int i = atoi(strPara);
if ((i <= 0)||(i > m_imailCount))
{
strPara.FormatMessage(NOT_MESSAGE,"list",strPara);
m_bIsError = FALSE;
return strPara;
}
pMail = (MailDetail*)m_pMailList.GetAt(m_pMailList.FindIndex(i-1));
if(pMail->bMailDeleteTag)
{
strPara.FormatMessage(MESSAGE_DEL,"list",strPara);
m_bIsError = FALSE;
return strPara;
}
m_bIsError = TRUE;
strPara.FormatMessage(FORMAT_NUM, i, pMail->iMailSize);
strPara.FormatMessage(OK_FORMAT,strPara);
return strPara;
}
//无参数时处理
long len = 0;
int num = 0, numVerity = 0;
CString tempstr("");
POSITION pos;
strPara = "";
for (pos = m_pMailList.GetHeadPosition(); pos != NULL;)
{
pMail = (MailDetail *)m_pMailList.GetNext(pos);
if(!pMail->bMailDeleteTag)
{
len += pMail->iMailSize;
num++;
numVerity++;
tempstr.FormatMessage(FORMAT_NUM, num, pMail->iMailSize);
tempstr += "\r\n";
strPara += tempstr;
}
else
num++;
}
// pMail = NULL;
m_bIsError = TRUE;
tempstr.FormatMessage(LIST_OK, numVerity, len);
strPara = tempstr + strPara;
strPara += ".";
strPara.FormatMessage(OK_FORMAT, strPara);
return strPara;
}
//功能: 对retr命令处理
//参数: in strPara retr命令后缀参数
CString CAcceptSocket::DisposeRETR(CString strPara)
{
m_bIsRetr = TRUE;//retr命令调用标示
if(m_iState != TRANSACTION_STATE)
{
strPara.FormatMessage(STATE_ERR,"retr");
m_bIsError = FALSE;
return strPara;
}
strPara.TrimRight();
if(strPara.IsEmpty())
{
strPara.FormatMessage(PARAMETER_ERR,"retr");
m_bIsError = FALSE;
return strPara;
}
int i = atoi(strPara);
if ((i <= 0)||(i > m_imailCount))
{
strPara.FormatMessage(NOT_MESSAGE,"retr",strPara);
m_bIsError = FALSE;
return strPara;
}
//计算耗时开始
time_consuming = GetTickCount();
MailDetail *p;
p = (MailDetail *)m_pMailList.GetAt(m_pMailList.FindIndex(i-1));
if (p->bMailDeleteTag)
{
strPara.FormatMessage(MESSAGE_DEL,"retr",strPara);
m_bIsError = FALSE;
return strPara;
}
else
{
CStringList mailidlist;
CString strmailid;
CString strError;
CPtrList pmaillist;
CMailAdapter mailadapter;
strmailid.Format("%d",p->iMailID);
mailidlist.AddTail(strmailid);
if ( !NewMailList( pmaillist, 1, strError ))
{
strPara.FormatMessage(strError,"retr");
m_bIsError = FALSE;
return strPara;
}
int iCount = mailadapter.GetMailList(mailidlist,TRUE,TRUE,pmaillist);
if(iCount == -1)
{
DeleteMailList(pmaillist);
strPara.FormatMessage(ERR_FORMAT,mailadapter.GetLastError());
strPara.FormatMessage("%1 [%2]",strPara,"retr");
m_bIsError = FALSE;
return strPara;
}
p = (MailDetail *)pmaillist.GetAt(pmaillist.FindIndex(0));
//数据库日志
maillog.mail_id = p->iMailID;
maillog.log_oprate = _T("邮件传送");
maillog.log_mail_size = p->iMailSize;
//已读标示
CString strMailID;
strMailID.Format("%d",p->iMailID);
strReadMailList.AddTail(strMailID);
CString mimeMailStr;
BOOL bRet;
bRet = GetMimeStr(p, mimeMailStr,strError);
if ( !bRet )
{
strPara.FormatMessage(ERR_FORMAT,strError);
strPara.FormatMessage("%1 [%2]",strPara,"retr");
m_bIsError = FALSE;
return strPara;
}
/*
int j = 0;
FILE *fp;
CString filename;
filename.Format("mimemail_%d.txt", j);
fp = fopen(filename, "wb");
fprintf(fp, "%s", (LPSTR)(LPCTSTR)mimeMailStr);
fclose(fp);
*/
// p = NULL;
DeleteMailList(pmaillist);
pmaillist.RemoveAll();
// pmaillist.RemoveAll();
mailidlist.RemoveAll();
m_bIsError = TRUE;//出错标示
// strPara.FormatMessage("+OK \r\n%1",mimeMailStr);
strPara = "+OK\r\n" + mimeMailStr + "\r\n.";
return strPara;
}
}
//功能: 对dele命令处理
//参数: in strPara dele命令后缀参数
CString CAcceptSocket::DisposeDELE(CString strPara)
{
if(m_iState != TRANSACTION_STATE)
{
strPara.FormatMessage(STATE_ERR,"dele");
m_bIsError = FALSE;
return strPara;
}
strPara.TrimRight();
if(strPara.IsEmpty())
{
strPara.FormatMessage(PARAMETER_ERR,"dele");
m_bIsError = FALSE;
return strPara;
}
int i = atoi(strPara);
if ((i <= 0)||(i > m_imailCount))
{
strPara.FormatMessage(NOT_MESSAGE,"dele",strPara);
m_bIsError = FALSE;
return strPara;
}
MailDetail *pMail;
pMail = (MailDetail *)m_pMailList.GetAt(m_pMailList.FindIndex(i-1));
if (pMail->bMailDeleteTag)
{
strPara.FormatMessage(MESSAGE_DEL,"dele",strPara);
m_bIsError = FALSE;
return strPara;
}
else
{
pMail->bMailDeleteTag = TRUE;
CString strMailID;
strMailID.Format("%d",pMail->iMailID);
strDeleteMailList.AddTail(strMailID);
m_bIsError = TRUE;
strPara.FormatMessage(DELETE_OK, i);
return strPara;
}
}
//功能: 对rset命令处理
//参数: in strPara rset命令后缀参数
CString CAcceptSocket::DisposeRSET(CString strPara)
{
if(m_iState != TRANSACTION_STATE)
{
strPara.FormatMessage(STATE_ERR,"rset");
m_bIsError = FALSE;
return strPara;
}
strPara.TrimRight();
if(!strPara.IsEmpty())
{
strPara.FormatMessage(PARAMETER_ERR,"rset");
m_bIsError = FALSE;
return strPara;
}
POSITION pos;
int num = 0;
int len = 0;
MailDetail *pMail;
for(pos = m_pMailList.GetHeadPosition(); pos != NULL; )
{
pMail = (MailDetail *)m_pMailList.GetNext(pos);
if (pMail->bMailDeleteTag)
{
num ++;
len += pMail->iMailSize;
pMail->bMailDeleteTag = FALSE;
}
}
strDeleteMailList.RemoveAll();
m_bIsError = TRUE;
strPara.FormatMessage(RSET_OK, num, len);
return strPara;
}
//功能: 对top命令处理
//参数: in strPara top命令后缀参数
CString CAcceptSocket::DisposeTOP(CString strPara)
{
if(m_iState != TRANSACTION_STATE)
{
strPara.FormatMessage(STATE_ERR,"top");
m_bIsError = FALSE;
return strPara;
}
strPara.TrimRight();
int iSpace = strPara.Find(' ');
if ((strPara.IsEmpty())||(iSpace < 0))
{
strPara.FormatMessage(PARAMETER_ERR,"top");
m_bIsError = FALSE;
return strPara;
}
CString strParaLeft = strPara.Left(iSpace);
int i = atoi(strParaLeft);
if ((i <= 0)||(i > m_imailCount))
{
strPara.FormatMessage(NOT_MESSAGE,"top",strParaLeft);
m_bIsError = FALSE;
return strPara;
}
MailDetail *p;
p = (MailDetail *)m_pMailList.GetAt(m_pMailList.FindIndex(i-1));
if (p->bMailDeleteTag)
{
strPara.FormatMessage(MESSAGE_DEL,"top",strParaLeft);
m_bIsError = FALSE;
return strPara;
}
else
{//get mail include mailcontent
CStringList mailidlist;
CString strmailid;
CString strError;
CPtrList pmaillist;
CMailAdapter mailadapter;
strmailid.Format("%d",p->iMailID);
mailidlist.AddTail(strmailid);
if ( !NewMailList( pmaillist, 1, strError ))
{
strPara.FormatMessage(strError,"top");
m_bIsError = FALSE;
return strPara;
}
int iCount = mailadapter.GetMailList(mailidlist, TRUE, FALSE, pmaillist);
if(iCount != 1)
{
DeleteMailList(pmaillist);
strPara.FormatMessage(ERR_FORMAT,mailadapter.GetLastError());
strPara.FormatMessage("%1 [%2]",strPara,"top");
m_bIsError = FALSE;
return strPara;
}
p = (MailDetail *)pmaillist.GetAt(pmaillist.FindIndex(0));
//get mailcontent
i = atoi(strPara.Right(strPara.GetLength()-iSpace));
CString strSendMailcon = p->strMailContent;
if(i <= 0)
p->strMailContent = "";
else
{
int ileng = 0;
int num = 0;
while(ileng != -1)
{
num++;
ileng += strSendMailcon.Find("\n",ileng);
if(i == num)
{
p->strMailContent = strSendMailcon.Left(ileng);
break;
}
if(ileng >= strSendMailcon.GetLength())
{
break;
}
}
}
CString mimeMailStr;
BOOL bRet;
bRet = GetMimeStr(p, mimeMailStr, strError);
if ( !bRet )
{
strPara.FormatMessage(ERR_FORMAT,strError);
strPara.FormatMessage("%1 [%2]",strPara,"top");
m_bIsError = FALSE;
return strPara;
}
// p = NULL;
DeleteMailList(pmaillist);
pmaillist.RemoveAll();
mailidlist.RemoveAll();
m_bIsError = TRUE;
// strPara.FormatMessage("+OK \r\n%1",mimeMailStr);
strPara = "+OK\r\n" + mimeMailStr + "\r\n.";
return strPara;
}
}
//功能: 对uidl命令处理
//参数: in strPara uidl命令后缀参数
CString CAcceptSocket::DisposeUIDL(CString strPara)
{
if(m_iState != TRANSACTION_STATE)
{
strPara.FormatMessage(STATE_ERR,"uidl");
m_bIsError = FALSE;
return strPara;
}
strPara.TrimRight();
MailDetail *pMail;
if (!strPara.IsEmpty())
{
int i = atoi(strPara);
if ((i <= 0)||(i > m_imailCount))
{
strPara.FormatMessage(NOT_MESSAGE,"uidl",strPara);
m_bIsError = FALSE;
return strPara;
}
pMail = (MailDetail *)m_pMailList.GetAt(m_pMailList.FindIndex(i-1));
if (pMail->bMailDeleteTag)
{
strPara.FormatMessage(MESSAGE_DEL,"uidl",strPara);
m_bIsError = FALSE;
return strPara;
}
else
{
//strPara.Format("+OK %d %d",i,pMail->iMailID);
m_bIsError = TRUE;
strPara.FormatMessage(FORMAT_NUM_STR,i,pMail->strMailNoteID);
return strPara;
}
}
//multi-line answer
int len = 0;
int num = 0;
CString tempstr("");
POSITION pos, temp;
strPara = "";
temp = m_pMailList.GetHeadPosition();
for (pos = m_pMailList.GetHeadPosition(); pos != NULL;)
{
pMail = (MailDetail *)m_pMailList.GetNext(pos);
if (!pMail->bMailDeleteTag)
{
num++;
//tempstr.Format("%d %d", num, pMail->iMailID);
tempstr.Format("%d %d", num, pMail->iMailID);
tempstr += CRLF;
strPara += tempstr;
}
else
num++;
}
m_bIsError = TRUE;
strPara.FormatMessage("+OK \r\n%1",strPara);
strPara += ".";
return strPara;
}
//功能: 判断客户端命令正确性
//参数: in strClientCommand 客户端命令
// out strCommand 命令行
// out strPara 命令行参数
BOOL CAcceptSocket::IsTrueComm(CString strClientCommand, CString &strCommand, CString &strPara)
{
strClientCommand.TrimLeft();
int iFindCRLF = strClientCommand.Find(CRLF);
if(iFindCRLF > 0)
{
strClientCommand = strClientCommand.Left(iFindCRLF);
int iFindBlank = strClientCommand.Find(' ');
if(iFindBlank > 0)
{
strCommand = strClientCommand.Left(iFindBlank);
strPara = strClientCommand.Mid(iFindBlank + 1);
return TRUE;
}
else
{
strCommand = strClientCommand;
strPara = _T("");
return TRUE;
}
}
return FALSE;
}
//功能: 解析客户端命令
//参数: in strCmd 客户端命令
//返回值:命令编号
int CAcceptSocket::ParseCommand(CString strCmd)
{
strCmd.TrimRight();
strCmd.MakeUpper();
if("QUIT" == strCmd) return 1;
if("USER" == strCmd) return 2;
if("PASS" == strCmd) return 3;
if("STAT" == strCmd) return 4;
if("LIST" == strCmd) return 5;
if("RETR" == strCmd) return 6;
if("DELE" == strCmd) return 7;
if("RSET" == strCmd) return 8;
if("NOOP" == strCmd) return 9;
//Extend commands
if("UIDL" == strCmd) return 10;
if("TOP" == strCmd) return 11;
if("APOP" == strCmd) return 0;
return -1;
}
//功能: 得到mime编码
//参数: in pMail maildetail结构指针
// out mimeMailStr mime编码
// out strError 错误输出
BOOL CAcceptSocket::GetMimeStr(LPVOID pMail, CString &mimeMailStr, CString &strError)
{
CMailAdapter mailAdapter;
CMap cvrMap;
cvrMap.SetAt(FILE_TYPE_DOC, FILE_TYPE_TXT);
cvrMap.SetAt(FILE_TYPE_HTM, FILE_TYPE_TXT);
cvrMap.SetAt(FILE_TYPE_PPT, FILE_TYPE_JPG);
cvrMap.SetAt(FILE_TYPE_XLS, FILE_TYPE_TXT);
BOOL bRet;
bRet = mailAdapter.ConvertMailAttachment(cvrMap, pMail);
bRet = mailAdapter.GetMailString(pMail, mimeMailStr);
if(!bRet)
{
strError = mailAdapter.GetLastError();
return FALSE;
}
return TRUE;
}
void CAcceptSocket::AnalyseReceiveStr(CString strReceive)
{
m_strComm += strReceive;
CString strRec = m_strComm;
int m = strReceive.Find("\r\n");
if(m >= 0)
{
m_strComm.Empty();
strRec.TrimLeft("\r\n");
if(strRec == "")
{
m_strCommArr.Add(" ");
}
else
{
CString strTemp = _T("");
int i = 1;
for(;i > 0;)
{
strRec.TrimLeft("\r\n");
int k = strRec.GetLength();
i = strRec.Find("\r\n");
if(i > 0)
{
strTemp = strRec.Left(i+2);
m_strCommArr.Add(strTemp);
strRec = strRec.Right(k-i-2);
}
}
}
}
}
void CAcceptSocket::DisposeComm()
{
m_bIsRetr = FALSE;//retr命令调用标示
CMailAdapter ma;
CString strComm = m_strCommArr.GetAt(0);
CString str = _T("");
CString strSendOut;
strSendOut = AnalyseComm(strComm);
if(!m_bIsError)
{
if(m_bIsRetr)
{
maillog.log_result = 2;
maillog.log_show = strSendOut;
maillog.log_time_con = GetTickCount() - time_consuming;
BOOL bR = ma.InsertMailTransLog(maillog);
if(!bR)
{
CString sl;
sl.FormatMessage("send data succeed\\insert log fail %1",ma.GetLastError());
PopSvrLogger->error((LPCTSTR)sl);
}
}
PopSvrLogger->error((LPCTSTR)strSendOut);
}
strSendOut += "\r\n";
int iRs = this->Send(strSendOut,strSendOut.GetLength());
if( iRs <= 0 )
{
str = _T("send data failed [command return]");
if(m_bIsRetr)
{
maillog.log_result = 2;
maillog.log_show = str;
maillog.log_time_con = GetTickCount() - time_consuming;
// CMailAdapter ma;
BOOL bR = ma.InsertMailTransLog(maillog);
if(!bR)
{
CString sl;
sl.FormatMessage("send data fail\\insert log fail %1",ma.GetLastError());
PopSvrLogger->error((LPCTSTR)sl);
}
}
PopSvrLogger->error((LPCTSTR)str);
return;
}
else
{
if(m_bIsRetr)
{
maillog.log_result = 1;
maillog.log_time_con = GetTickCount() - time_consuming;
// CMailAdapter maila;
BOOL bR = ma.InsertMailTransLog(maillog);
if(!bR)
{
CString sl;
sl.FormatMessage("send data succeed\\insert log fail %1",ma.GetLastError());
PopSvrLogger->error((LPCTSTR)sl);
}
}
}
//客户端发送quit命令
if ((QUIT_STATE == m_iState)||(UPDATE_STATE == m_iState))
{
CString strLog;
strLog.FormatMessage("user from %1 and port %2!d! send [quit] request",m_sSocket,m_nPort);
PopSvrLogger->info((LPCTSTR)strLog);
//有删除邮件,更新数据
if(UPDATE_STATE == m_iState)
{
BOOL bRst;
if(!strDeleteMailList.IsEmpty())
{
// CMailAdapter mailAdapter;
bRst = ma.SetDeleteMailTags(strDeleteMailList);
if(!bRst)
{
// CString strLog;
strLog.FormatMessage("%1",ma.GetLastError());
PopSvrLogger->error((LPCTSTR)strLog);
}
strDeleteMailList.RemoveAll();
}
//设置已读标示
if(!strReadMailList.IsEmpty())
{
bRst = ma.SetReadMailTags(strReadMailList);
if(!bRst)
{
strLog.FormatMessage("%1",ma.GetLastError());
PopSvrLogger->error((LPCTSTR)strLog);
}
strReadMailList.RemoveAll();
}
}
PostThreadMessage(m_dwThreadId, WM_SOCKETCLOSE, 0, 0);
return;
}
}