// 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 ) //如果正在发送,立即返回 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); //判断检查时间是否到了 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()-tCheckLast0;i-- ) { if ( !pop.GetMessageHeader(i,popmsg) ) break; //判断日期 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 ) //日期不是当天的大于3条,不通知,直接退出。 { break; } else { continue; //日期不对,继续 } } abc.GetAsSystemTime(t); } else { iNoDayCount ++ ; if ( iNoDayCount >= 3 ) //日期不是当天的大于3条,不通知,直接退出。 { break; } else { continue; //日期不对,继续 } } //判断MsgID是否已存在 CString strMsgID = popmsg.GetMsgID(); strMsgID.TrimLeft(); strMsgID.TrimRight(); if ( strMsgID.GetLength() <= 0 || strMsgID.GetLength() > 60 ) continue; strMsgID.Replace(_T("'"),_T("''")); //防止'引起的问题 strSelect.Format( _T("select * from emailid where UserID=%d and MsgID='%s'"),lUserID,strMsgID); if ( m_AdoRS1.Open(strSelect) && m_AdoRS1.GetRecordCount()> 0 ) //已存在,跳过 { m_AdoRS1.Close(); iNoInDB ++; if ( iNoInDB >= 2 ) //如果有两条以上在数据库中存在,则退出 { break; } else { continue; //日期不对,继续 } } //没有,存入EmailID表 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(); //判断是否属于要过滤的Email BOOL bSend = false; strFrom.MakeUpper(); for ( int j=0;j= 0 ) //属于要通知的类别 { bSend = true; break; } } if ( bSend ) { //提交短信 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("你于%02d.%02d %02d:%02d收到%s的邮件:%s"),t.wMonth,t.wDay,t.wHour,t.wMinute,strFromMin,strSubject); CSendThread::SubmitSms( data,&m_AdoRS1,&m_AdoRS2,m_pSMSDlg,lMobType,SMSTYPE_EMAIL); //发送短信 } } } pop.Disconnect(); //断开连接 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); //设置连接超时时间 #ifdef SMSCENTER_USECLIENT m_adoConnection.SetCursorLocation(adUseClient); //设置为本地游标类型 #endif m_AdoRS.SetAdoConnection( &m_adoConnection ); //设置数据库连接 m_AdoRS1.SetAdoConnection( &m_adoConnection ); //设置数据库连接 m_AdoRS2.SetAdoConnection( &m_adoConnection ); //设置数据库连接 } return b; }