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; 
	} 
}