337 lines
8.8 KiB
C++
337 lines
8.8 KiB
C++
![]() |
// EmailThread.cpp : implementation file
|
|||
|
//
|
|||
|
|
|||
|
#include "stdafx.h"
|
|||
|
#include "SmsCenter.h"
|
|||
|
#include "EmailThread.h"
|
|||
|
|
|||
|
#ifdef _DEBUG
|
|||
|
#define new DEBUG_NEW
|
|||
|
#undef THIS_FILE
|
|||
|
static char THIS_FILE[] = __FILE__;
|
|||
|
#endif
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////////
|
|||
|
// CEmailThread
|
|||
|
|
|||
|
#include "SmsCenterDlg.h"
|
|||
|
#include "..\public\pop3\pop3.h"
|
|||
|
|
|||
|
|
|||
|
typedef struct _EmailFilt
|
|||
|
{
|
|||
|
TCHAR szFilt[64];
|
|||
|
}EmailFilt;
|
|||
|
|
|||
|
IMPLEMENT_DYNCREATE(CEmailThread, CWinThread)
|
|||
|
|
|||
|
CEmailThread::CEmailThread()
|
|||
|
{
|
|||
|
m_bStart = false;
|
|||
|
m_pSMSDlg = NULL;
|
|||
|
}
|
|||
|
|
|||
|
CEmailThread::~CEmailThread()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
BOOL CEmailThread::InitInstance()
|
|||
|
{
|
|||
|
CoInitializeEx( NULL , COINIT_MULTITHREADED );
|
|||
|
// TODO: perform and per-thread initialization here
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
int CEmailThread::ExitInstance()
|
|||
|
{
|
|||
|
CoUninitialize();
|
|||
|
|
|||
|
// TODO: perform any per-thread cleanup here
|
|||
|
return CWinThread::ExitInstance();
|
|||
|
}
|
|||
|
|
|||
|
BEGIN_MESSAGE_MAP(CEmailThread, CWinThread)
|
|||
|
//{{AFX_MSG_MAP(CEmailThread)
|
|||
|
// NOTE - the ClassWizard will add and remove mapping macros here.
|
|||
|
//}}AFX_MSG_MAP
|
|||
|
ON_THREAD_MESSAGE(TH_EMAIL,On_Email)
|
|||
|
END_MESSAGE_MAP()
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////////
|
|||
|
// CEmailThread message handlers
|
|||
|
|
|||
|
void CEmailThread::On_Email(WPARAM wParam, LPARAM lParam)
|
|||
|
{
|
|||
|
USES_CONVERSION;
|
|||
|
|
|||
|
if ( m_bStart ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
return ;
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
m_bStart = true;
|
|||
|
CString strSelect;
|
|||
|
strSelect = _T("select email.*,users.mobile from email,users where email.Status=1 and email.userid = users.userid");
|
|||
|
BOOL b = m_AdoRS.Open( strSelect );
|
|||
|
if ( b && !m_AdoRS.IsEOF() )
|
|||
|
{
|
|||
|
long lID;
|
|||
|
long lCorpID;
|
|||
|
long lUserID;
|
|||
|
long lRSCount2=0;
|
|||
|
CString strIP;
|
|||
|
CString strUserName;
|
|||
|
CString strPasswd;
|
|||
|
CString strMobile;
|
|||
|
CString strTemp;
|
|||
|
|
|||
|
while ( !m_AdoRS.IsEOF() && lRSCount2<10000 )
|
|||
|
{
|
|||
|
char szUserName[64]={0};
|
|||
|
char szPasswd[64]={0};
|
|||
|
char szPasswd2[64]={0};
|
|||
|
long lCheckTime=0;
|
|||
|
COleDateTime tCheckLast;
|
|||
|
m_AdoRS.GetCollect( _T("EmailID") , lID );
|
|||
|
m_AdoRS.GetCollect( _T("CorpID") , lCorpID );
|
|||
|
m_AdoRS.GetCollect( _T("UserID") , lUserID );
|
|||
|
m_AdoRS.GetCollect( _T("IP") , strIP );
|
|||
|
m_AdoRS.GetCollect( _T("UserName"), strUserName );
|
|||
|
m_AdoRS.GetCollect( _T("Passwd") , strPasswd );
|
|||
|
m_AdoRS.GetCollect( _T("Mobile") , strMobile);
|
|||
|
m_AdoRS.GetCollect( _T("CheckTime") , lCheckTime);
|
|||
|
m_AdoRS.GetCollect( _T("CheckLast") , tCheckLast);
|
|||
|
//<2F>жϼ<D0B6><CFBC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
try
|
|||
|
{
|
|||
|
//if ( lCheckTime <=0 )
|
|||
|
// lCheckTime=30;
|
|||
|
SYSTEMTIME stNow,stLast;
|
|||
|
COleDateTime tNow=COleDateTime::GetCurrentTime();
|
|||
|
tNow.GetAsSystemTime(stNow);
|
|||
|
tCheckLast.GetAsSystemTime(stLast);
|
|||
|
|
|||
|
COleDateTimeSpan ts(0,0,0,lCheckTime);
|
|||
|
if (COleDateTime::GetCurrentTime()-tCheckLast<ts) //δ<><CEB4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
lRSCount2 ++;
|
|||
|
m_AdoRS.MoveNext();
|
|||
|
continue;
|
|||
|
}
|
|||
|
}catch(...)
|
|||
|
{
|
|||
|
LOG_APPERROR(_T("T"));
|
|||
|
;
|
|||
|
}
|
|||
|
//<2F>滻<EFBFBD><E6BBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
strSelect.Format( _T("update email set CheckLast=GETDATE() where EmailID=%d"),lID);
|
|||
|
m_AdoRS1.Open(strSelect);
|
|||
|
m_AdoRS1.Close();
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
CDes des;
|
|||
|
#ifdef UNICODE
|
|||
|
strcpy(szPasswd , W2A(strPasswd));
|
|||
|
strcpy(szUserName , W2A(strUserName));
|
|||
|
long lOut = sizeof(szPasswd2);
|
|||
|
des.Decrypt(szPasswd ,strlen(szPasswd),szPasswd2,lOut,szUserName,8);
|
|||
|
strPasswd =A2W(szPasswd2);
|
|||
|
#else
|
|||
|
strcpy(szPasswd , strPasswd);
|
|||
|
strcpy(szUserName , strUserName);
|
|||
|
long lOut = sizeof(szPasswd2);
|
|||
|
des.Decrypt(szPasswd ,strlen(szPasswd),szPasswd2,lOut,szUserName,8);
|
|||
|
strPasswd =szPasswd2;
|
|||
|
#endif
|
|||
|
//<2F><>ѯ<EFBFBD><D1AF><EFBFBD>˱<EFBFBD>,<2C><>ȡ<EFBFBD>ô<EFBFBD><C3B4>û<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>˵<EFBFBD><CBB5><EFBFBD>Ϣ
|
|||
|
long lFiltCount=0;
|
|||
|
EmailFilt * pFilt = NULL;
|
|||
|
strSelect.Format( _T("select * from emailfilt where UserID=%d and Status=1 and (EmailID=0 or EmailID is NULL or EmailID=%d)"),lUserID,lID);
|
|||
|
if (m_AdoRS1.Open( strSelect ) && !m_AdoRS1.IsEOF())
|
|||
|
{
|
|||
|
lFiltCount = m_AdoRS1.GetRecordCount();
|
|||
|
if ( lFiltCount<0 )
|
|||
|
lFiltCount = 0;
|
|||
|
pFilt = new EmailFilt[lFiltCount];
|
|||
|
memset(pFilt , 0 , sizeof(EmailFilt)*lFiltCount);
|
|||
|
m_AdoRS1.MoveFirst();
|
|||
|
int i = 0;
|
|||
|
while ( !m_AdoRS1.IsEOF() )
|
|||
|
{
|
|||
|
m_AdoRS1.GetCollect( _T("Name") , strTemp );
|
|||
|
strTemp.MakeUpper();
|
|||
|
_tcscpy(pFilt[i].szFilt,strTemp);
|
|||
|
m_AdoRS1.MoveNext();
|
|||
|
i ++;
|
|||
|
}
|
|||
|
m_AdoRS1.Close();
|
|||
|
}
|
|||
|
//<2F><>ʼȡEmail
|
|||
|
CPop3Connection pop;
|
|||
|
CPop3Message popmsg;
|
|||
|
int iMailCount=0;
|
|||
|
int iMailSize=0;
|
|||
|
if ( pop.Connect(strIP,strUserName,strPasswd) )
|
|||
|
{
|
|||
|
if ( !pop.Statistics(iMailCount, iMailSize) )
|
|||
|
{
|
|||
|
iMailCount = 0;
|
|||
|
iMailSize = 0;
|
|||
|
}
|
|||
|
int iNoDayCount=0;
|
|||
|
int iNoInDB=0;
|
|||
|
//ȡEmail From ,subject ,id <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
for ( int i=iMailCount;i>0;i-- )
|
|||
|
{
|
|||
|
if ( !pop.GetMessageHeader(i,popmsg) )
|
|||
|
break;
|
|||
|
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
CString strDate = popmsg.GetDate();
|
|||
|
strDate.Replace( _T("GMT") , _T("") );
|
|||
|
int iStart = strDate.Find(',');
|
|||
|
if ( iStart <=0 || iStart>strDate.GetLength()/2)
|
|||
|
iStart = 0;
|
|||
|
else
|
|||
|
iStart += 1;
|
|||
|
int iEnd = strDate.FindOneOf(_T("+-"));
|
|||
|
if ( iEnd <=0 || iEnd > strDate.GetLength() )
|
|||
|
iEnd = strDate.GetLength();
|
|||
|
CString strTime = strDate.Mid(iStart , iEnd-iStart );
|
|||
|
strTime.TrimLeft();
|
|||
|
strTime.TrimRight();
|
|||
|
COleDateTime abc;
|
|||
|
abc.ParseDateTime(strTime,VAR_DATEVALUEONLY);
|
|||
|
if ( abc.GetStatus() == COleDateTime::valid )
|
|||
|
{
|
|||
|
SYSTEMTIME t;
|
|||
|
::GetSystemTime(&t);
|
|||
|
if ( abc.GetYear() != t.wYear ||
|
|||
|
abc.GetMonth() != t.wMonth ||
|
|||
|
abc.GetDay() != t.wDay )
|
|||
|
{
|
|||
|
iNoDayCount ++ ;
|
|||
|
if ( iNoDayCount >= 3 ) //<2F><><EFBFBD>ڲ<EFBFBD><DAB2>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ͨ<CDA8><D6AA>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
continue; //<2F><><EFBFBD>ڲ<EFBFBD><DAB2>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
}
|
|||
|
abc.GetAsSystemTime(t);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
iNoDayCount ++ ;
|
|||
|
if ( iNoDayCount >= 3 ) //<2F><><EFBFBD>ڲ<EFBFBD><DAB2>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ͨ<CDA8><D6AA>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
continue; //<2F><><EFBFBD>ڲ<EFBFBD><DAB2>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
}
|
|||
|
//<2F>ж<EFBFBD>MsgID<49>Ƿ<EFBFBD><C7B7>Ѵ<EFBFBD><D1B4><EFBFBD>
|
|||
|
CString strMsgID = popmsg.GetMsgID();
|
|||
|
strMsgID.TrimLeft();
|
|||
|
strMsgID.TrimRight();
|
|||
|
if ( strMsgID.GetLength() <= 0 || strMsgID.GetLength() > 60 )
|
|||
|
continue;
|
|||
|
strMsgID.Replace(_T("'"),_T("''")); //<2F><>ֹ'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
strSelect.Format( _T("select * from emailid where UserID=%d and MsgID='%s'"),lUserID,strMsgID);
|
|||
|
if ( m_AdoRS1.Open(strSelect) && m_AdoRS1.GetRecordCount()> 0 ) //<2F>Ѵ<EFBFBD><D1B4>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
m_AdoRS1.Close();
|
|||
|
iNoInDB ++;
|
|||
|
if ( iNoInDB >= 2 ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>д<EFBFBD><D0B4>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD>˳<EFBFBD>
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
continue; //<2F><><EFBFBD>ڲ<EFBFBD><DAB2>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
}
|
|||
|
//û<>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>EmailID<49><44>
|
|||
|
strSelect.Format( _T("insert into emailid (CorpID,UserID,MsgID,AddTime) values (%d,%d,'%s',GETDATE())") , lCorpID,lUserID,strMsgID );
|
|||
|
m_AdoRS1.Open(strSelect);
|
|||
|
m_AdoRS1.Close();
|
|||
|
|
|||
|
CString strFrom = popmsg.GetFrom();
|
|||
|
CString strFromMin = popmsg.GetFrom_Min();
|
|||
|
CString strSubject = popmsg.GetSubject();
|
|||
|
|
|||
|
|
|||
|
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>˵<EFBFBD>Email
|
|||
|
BOOL bSend = false;
|
|||
|
strFrom.MakeUpper();
|
|||
|
for ( int j=0;j<lFiltCount;j++)
|
|||
|
{
|
|||
|
if ( !_tcscmp(pFilt[j].szFilt,_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>") ) )
|
|||
|
{
|
|||
|
bSend = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
if ( strFrom.Find(pFilt[j].szFilt) >= 0 ) //<2F><><EFBFBD><EFBFBD>Ҫ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
bSend = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
if ( bSend )
|
|||
|
{
|
|||
|
//<2F>ύ<EFBFBD><E1BDBB><EFBFBD><EFBFBD>
|
|||
|
long lMobType = MOBILE_TYPE_CMCC;
|
|||
|
//if ( isNumUnicom((char*)(LPCTSTR)strMobile) )
|
|||
|
// lMobType = MOBILE_TYPE_UNICOM;
|
|||
|
|
|||
|
SubmitData data={0};
|
|||
|
data.lCorpID = lCorpID;
|
|||
|
data.lUserID = lUserID;
|
|||
|
_tcscpy( data.szName , _T("email") );
|
|||
|
_tcscpy( data.szMobile , strMobile );
|
|||
|
//strcpy( data.szMsg , strMsg );
|
|||
|
SYSTEMTIME t;::GetLocalTime(&t);
|
|||
|
_stprintf(data.szMsg,_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>%02d.%02d %02d:%02d<32>յ<EFBFBD>%s<><73><EFBFBD>ʼ<EFBFBD>:%s"),t.wMonth,t.wDay,t.wHour,t.wMinute,strFromMin,strSubject);
|
|||
|
CSendThread::SubmitSms( data,&m_AdoRS1,&m_AdoRS2,m_pSMSDlg,lMobType,SMSTYPE_EMAIL); //<2F><><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
pop.Disconnect(); //<2F>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
if ( pFilt ) {delete pFilt;pFilt=NULL;}
|
|||
|
|
|||
|
lRSCount2 ++;
|
|||
|
m_AdoRS.MoveNext();
|
|||
|
}
|
|||
|
}
|
|||
|
m_bStart = false;
|
|||
|
}
|
|||
|
catch (...)
|
|||
|
{
|
|||
|
LOG_APPERROR(_T("T"));
|
|||
|
m_bStart = false;
|
|||
|
return ;
|
|||
|
}
|
|||
|
m_bStart = false;
|
|||
|
return ;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CEmailThread::SetParam(CSmsCenterDlg *pSmsDlg)
|
|||
|
{
|
|||
|
m_pSMSDlg = pSmsDlg;
|
|||
|
BOOL b = m_adoConnection.ConnectSQLServer2(m_pSMSDlg->m_Setup.szDBName,DEFAULT_DBNAME,m_pSMSDlg->m_Setup.szDBUser,m_pSMSDlg->m_Setup.szDBPasswd, m_pSMSDlg->m_Setup.szProvider);
|
|||
|
if ( b )
|
|||
|
{
|
|||
|
m_adoConnection.SetCommandTimeout(7200); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱʱ<CAB1><CAB1>
|
|||
|
#ifdef SMSCENTER_USECLIENT
|
|||
|
m_adoConnection.SetCursorLocation(adUseClient); //<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
#endif
|
|||
|
m_AdoRS.SetAdoConnection( &m_adoConnection ); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
m_AdoRS1.SetAdoConnection( &m_adoConnection ); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
m_AdoRS2.SetAdoConnection( &m_adoConnection ); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
return b;
|
|||
|
}
|