SmsCenter/EmailThread.cpp

337 lines
8.8 KiB
C++
Raw Normal View History

2025-01-03 16:47:25 +08:00
// 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;
}