SmartMailSvr.cpp
上传用户:qdlutongda
上传日期:2007-01-14
资源大小:133k
文件大小:94k
源码类别:

Email客户端

开发平台:

Visual C++

  1. // SmartMailSvr.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include "SmartMailSvr.h"
  5. #include "MailService.h"
  6. #include "dnsmx.h"
  7. #include "Encoder.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. #define MAXMESSAGELENGTH 255
  14. #define CURVER "1.0" //current version
  15. #define SOCKET_SIZE  1024
  16. /////////////////////////////////////////////////////////////////////////////
  17. // The one and only application object
  18. CWinApp theApp;
  19. typedef struct
  20. {
  21. char sender[50];
  22. char recver[50];
  23. char title[50];
  24. char time[20];
  25. long size;
  26. }_UDPPacketInfo;
  27. typedef struct
  28. {
  29. SOCKET sock;
  30. char fname[255];
  31. }_SendPop3Param;
  32. int gSocketUseCount = 0; //test
  33. /*************     变量    ****************/
  34. //TCP SOCKET服务对象
  35. SOCKET m_SocketPop3;
  36. SOCKET m_SocketSmtp;
  37. //UDP SOCKET对象
  38. UINT m_nUDPPort;
  39. CString m_strUDPIP;
  40. SOCKET m_UdpSocket;
  41. //FD_SET
  42. fd_set fdset, rfdset;
  43. //保存Socket连接的数组
  44. //CArray<SocketInfo,SocketInfo>m_SocketList;
  45. SocketInfo m_SocketList[SOCKET_SIZE];
  46. //要删除得邮件列表
  47. CArray<DeleteInfo,DeleteInfo>m_DeleteList;
  48. //m_DeleteList的临界区
  49. CRITICAL_SECTION m_csDeleteList;
  50. //通过其他SMTP Server发送的列表
  51. CArray<SMTPForwardInfo,SMTPForwardInfo> m_SMTPForwardList;
  52. //m_SMTPForwardList的临界区
  53. CRITICAL_SECTION m_csSMTPForward;
  54. //上述Socket对应的服务运行状态
  55. bool m_bPop3Allowed = false;
  56. bool m_bSmtpAllowed = false;
  57. bool m_bWebMailAllowed = false;
  58. bool m_bTelnetAllowed = false;
  59. //路径
  60. CString m_strExePath;
  61. //COM对象
  62. IMailSvrConfigCtrl* m_pMailConfig = NULL;
  63. IMailDB* m_pMailDB = NULL;
  64. //Log对象
  65. CLogFile m_logFile;
  66. //POP3 Message
  67. char pop3_msg00[MAXMESSAGELENGTH]; //+OK inetserv ready. %s
  68. char pop3_msg01[MAXMESSAGELENGTH]; //+OK HELO
  69. char pop3_msg02[MAXMESSAGELENGTH]; //-ERR unknown message
  70. char pop3_msg03[MAXMESSAGELENGTH]; //+OK user accepted
  71. char pop3_msg04[MAXMESSAGELENGTH]; //-ERR invalid username
  72. char pop3_msg05[MAXMESSAGELENGTH]; //welcome user!
  73. char pop3_msg06[MAXMESSAGELENGTH]; //wrong password for this user, try again!
  74. char pop3_msg07[MAXMESSAGELENGTH]; //OK closing connection
  75. char pop3_msg08[MAXMESSAGELENGTH]; // message not found
  76. char pop3_msg09[MAXMESSAGELENGTH]; // ok, rset
  77. char pop3_msg10[MAXMESSAGELENGTH]; // -ERR no data found
  78. char pop3_msg11[MAXMESSAGELENGTH]; // -ERR nothing to delete
  79. char pop3_msg12[MAXMESSAGELENGTH]; // +OK Message deleted
  80. char pop3_msg13[MAXMESSAGELENGTH]; // -ERR unknown command
  81. /*************     函数     ****************/
  82. bool Ini_MailCom(); //初始化COM,并连接数据库
  83. void Release_MailCom(); //释放COM
  84. UINT main_mailsvr(LPVOID); //主线程函数
  85. UINT Pop3_AcceptThread(LPVOID); //POP3接收连接线程函数
  86. UINT Smtp_AcceptThread(LPVOID); //SMTP接收连接线程函数
  87. UINT Pop3_ReceiveThread(LPVOID); //接收处理POP数据线程函数
  88. UINT Smtp_ReceiveThread(LPVOID); //接收处理SMTP数据线程函数
  89. void ReadPop3(char* buf, int nDataLen, int i); //处理POP3连接的数据处理
  90. void ReadSmtp(char* buf, int nDataLen, int i); //处理SMTP连接的数据处理
  91. void SendPop3Mail(SOCKET s, char* fileName); //向客户端发送Mail文件
  92. //UINT SendPop3Mail(LPVOID); //向客户端发送Mail文件
  93. void DeleteCRLF(char *string);
  94. void ProcessNewMail(CString CTL, CString Fname,CString Sender);
  95. void LogError (CString expr);
  96. void SendSMTP();
  97. int  SendSmtpMail(int litem);
  98. int  SendSmtpMailDirect(int litem);
  99. BOOL IsLocalUser(const char* tempstr); //判断是否是本地用户
  100. bool SendUDPData(_UDPPacketInfo udpData);
  101. bool WriteMailInfoToDB(CString strSender, CString strRecver, CString strTitle, CString strTime,  long lSize);
  102. bool DealMailInfo(CString strFileName, CString strSender, CString strRecver);
  103. bool AddMessageID(CString strFileName); //加入Message-ID
  104. using namespace std;
  105. int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
  106. {
  107. int nRetCode = 0;
  108. // initialize MFC and print and error on failure
  109. if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
  110. {
  111. // TODO: change error code to suit your needs
  112. //cerr << _T("Fatal Error: MFC initialization failed") << endl;
  113. nRetCode = 1;
  114. }
  115. else
  116. {
  117. // TODO: code your application's behavior here.
  118. CMailService serv;
  119. // RegisterService() checks the parameterlist for predefined switches
  120. // (such as -d or -i etc.; see NTService.h for possible switches) and
  121. // starts the service's functionality.
  122. // You can use the return value from "RegisterService()"
  123. // as your exit-code.
  124. return serv.RegisterService(argc, argv);
  125. }
  126. return nRetCode;
  127. }
  128. bool Ini_MailCom()
  129. {
  130. //设置Log对象的路径
  131. CString strExePath;
  132. LPTSTR lpPath;
  133. lpPath = strExePath.GetBuffer(MAX_PATH);
  134. ::GetModuleFileName(NULL, lpPath, MAX_PATH);
  135. strExePath.ReleaseBuffer();
  136. int nPos = strExePath.ReverseFind('\');
  137. int nSize = strExePath.GetLength();
  138. m_logFile.SetLogFilePath(strExePath.Left(nPos + 1));
  139. CString strLog;
  140. //初始化COM库
  141. HRESULT hr;
  142. hr = ::CoInitialize(NULL);
  143. if(FAILED(hr))
  144. {
  145. m_logFile.WriteLog("CoInitialize() failed");
  146. return false;
  147. }
  148. //创建IMailSvrConfigCtrl接口指针 
  149. hr = ::CoCreateInstance(CLSID_MailSvrConfigCtrl, 
  150. NULL, 
  151. CLSCTX_INPROC_SERVER, 
  152. IID_IMailSvrConfigCtrl, 
  153. (VOID FAR**)&m_pMailConfig);
  154. if(FAILED(hr))
  155. {
  156. m_logFile.WriteLog("CoCreateInstance() for IMailSvrConfigCtrl failed");
  157. return false;
  158. }
  159. //创建IMailDB接口指针 
  160. hr = ::CoCreateInstance(CLSID_MailDB, 
  161. NULL, 
  162. CLSCTX_INPROC_SERVER, 
  163. IID_IMailDB, 
  164. (VOID FAR**)&m_pMailDB);
  165. if(FAILED(hr))
  166. {
  167. m_logFile.WriteLog("CoCreateInstance() for IMailDB failed");
  168. return false;
  169. }
  170. //检查参数配置是否正确
  171. short nCheckResult = 0;
  172. m_pMailConfig->CheckConfig(&nCheckResult);
  173. if(nCheckResult == 0)
  174. {
  175. m_logFile.WriteLog("Lack or Invalid Config In the Register");
  176. return false;
  177. }
  178. //连接数据库
  179. BSTR BstrConnectionString;
  180. m_pMailConfig->GetDBConnectionConfig(&BstrConnectionString);
  181. m_pMailDB->SetMailSvrDBConfig(BstrConnectionString);
  182. hr = m_pMailDB->ConnectMailSvrDB();
  183. if(FAILED(hr))
  184. {
  185. strLog.Format("Connect MailDB, ConnectionString=%S Failed", BstrConnectionString);
  186. m_logFile.WriteLog(strLog);
  187. return false;
  188. }
  189. strLog.Format("Connect MailDB, ConnectionString=%S Succeed", BstrConnectionString);
  190. m_logFile.WriteLog(strLog);
  191. //设置用户信息表名字段
  192. BSTR BstrUserTableName, BstrUserIDField, BstrUserPasswordField, BstrNameField;
  193. m_pMailConfig->GetUserTableConfig(&BstrUserTableName, &BstrUserIDField, &BstrUserPasswordField, &BstrNameField);
  194. m_pMailDB->SetMailUserTableConfig(BstrUserTableName, BstrUserIDField, BstrUserPasswordField, BstrNameField);
  195. strLog.Format("User Table Info: TableName=%S, UserIDField=%S, UserPasswordField=%S, UserNameField=%S", 
  196.    BstrUserTableName, BstrUserIDField, BstrUserPasswordField, BstrNameField);
  197. m_logFile.WriteLog(strLog);
  198. //设置接收的邮件信息表名和字段
  199. BSTR BstrRecvTableName, BstrTimeField, BstrTitleField, BstrSenderField, BstrRecverField, BstrSizeField;
  200. m_pMailConfig->GetRecvMailInfoTableConfig(&BstrRecvTableName, &BstrTimeField, &BstrTitleField, 
  201.  &BstrSenderField, &BstrRecverField, &BstrSizeField);
  202. m_pMailDB->SetMailRecvTableConfig(BstrRecvTableName, BstrTimeField, BstrTitleField, 
  203.   BstrSenderField, BstrRecverField, BstrSizeField);
  204. strLog.Format("RecvInfo Table Info: TableName=%S, TimeField=%S, TitleField=%S, SenderField=%S, RecverField=%S, SizeField=%S",
  205. BstrRecvTableName, BstrTimeField, BstrTitleField, BstrSenderField, BstrRecverField, BstrSizeField);
  206. m_logFile.WriteLog(strLog);
  207. WSADATA WSData;
  208. if (WSAStartup(MAKEWORD(1, 1), &WSData) ) 
  209. {
  210. m_logFile.WriteLog("Load socket lib failed");
  211. return false;
  212. }
  213. char chPath[256];
  214. GetModuleFileName(NULL,chPath,256);
  215. m_strExePath=chPath;
  216. for(int i=m_strExePath.GetLength();i>=0;i--)
  217. {
  218. if(m_strExePath.Mid(i,1)=="\"){
  219. m_strExePath=m_strExePath.Left(i);
  220. break;
  221. }
  222. }
  223. //创建默认文件夹
  224. CString strMailPath;
  225. strMailPath.Format("%s\mail", m_strExePath);
  226. CreateDirectory((LPCTSTR)strMailPath, NULL);
  227. strMailPath.Format("%s\mail\unknown", m_strExePath);
  228. CreateDirectory((LPCTSTR)strMailPath, NULL);
  229. // mkdir("mail");
  230. // mkdir("mail\unknown");
  231. short nCount;
  232. BSTR BstrUserID, BstrPass;
  233. CString strUserPath;
  234. m_pMailDB->GetUser(&nCount);
  235. for(int j=0; j<nCount; j++)
  236. {
  237. m_pMailDB->GetUserInfo(j, &BstrUserID, &BstrPass);
  238. bstr_t bstrUserID(BstrUserID, FALSE);
  239. strUserPath.Format("%s\mail\%s", m_strExePath, (char*)bstrUserID);
  240. CreateDirectory((LPCTSTR)strUserPath, NULL);
  241. }
  242. return true;
  243. }
  244. void Release_MailCom()
  245. {
  246. //释放IMailSvrConfigCtrl接口指针
  247. if(m_pMailConfig != NULL)
  248. m_pMailConfig->Release();
  249. //释放IMailDB接口指针
  250. if(m_pMailDB != NULL)
  251. {
  252. m_pMailDB->DisConnectMailSvrDB();
  253. m_pMailDB->Release();
  254. }
  255. //释放COM库
  256. ::CoUninitialize();
  257. //释放SOCKET库
  258. WSACleanup();
  259. }
  260. UINT main_mailsvr(LPVOID pParam)
  261. {
  262. if((m_pMailConfig == NULL)||(m_pMailDB == NULL))
  263. {
  264. m_logFile.WriteLog("Invalid IMailConfigCtrl or IMailDB pointer");
  265. return 0;
  266. }
  267. //初始化临界区
  268. ::InitializeCriticalSection(&m_csDeleteList);
  269. ::InitializeCriticalSection(&m_csSMTPForward);
  270. CString strLog;
  271. short nPop3Port, nSmtpPort;
  272. short nWebMailFlag, nWebMailPort;
  273. short nTelnetFlag, nTelnetPort;
  274. //读取参数
  275. m_pMailConfig->GetPop3Port(&nPop3Port);
  276. m_pMailConfig->GetSmtpPort(&nSmtpPort);
  277. m_pMailConfig->GetWebMailConfig(&nWebMailFlag, &nWebMailPort);
  278. m_pMailConfig->GetTelnetConfig(&nTelnetFlag, &nTelnetPort);
  279. //创建UDP SOCKET对象
  280. BSTR BstrUdpAdd;
  281. short nUdpPort;
  282. m_pMailConfig->GetUDPConfig(&BstrUdpAdd, &nUdpPort);
  283. _bstr_t bstrUdpAdd(BstrUdpAdd, FALSE);
  284. m_strUDPIP = (char*)bstrUdpAdd;
  285. m_nUDPPort = nUdpPort;
  286. FD_ZERO(&fdset);
  287. FD_ZERO(&rfdset);
  288. m_UdpSocket = socket(AF_INET, SOCK_DGRAM, 0);
  289. if(m_UdpSocket == INVALID_SOCKET)
  290. {
  291. m_logFile.WriteLog("FAILED to Create UDP Socket");
  292. closesocket(m_UdpSocket);
  293. }
  294. else
  295. m_logFile.WriteLog("Succeed to Create UDP Socket");
  296. //创建POP3侦听线程
  297. struct sockaddr_in pop3_add;
  298. m_SocketPop3 = socket(AF_INET, SOCK_STREAM, 0);
  299. if(m_SocketPop3 < 0)
  300. {
  301. strLog.Format("failed to create pop3 socket.");
  302. m_logFile.WriteLog(strLog);
  303. return 0;
  304. }
  305. strLog.Format("Succeed to Create POP3 Socket");
  306. m_logFile.WriteLog(strLog);
  307. memset((char*)&pop3_add, 0x0, sizeof(sockaddr_in));
  308. pop3_add.sin_family = AF_INET;
  309. pop3_add.sin_port = htons(nPop3Port);
  310. pop3_add.sin_addr.s_addr = htonl(INADDR_ANY);
  311. if(bind(m_SocketPop3, (struct sockaddr*)&pop3_add, sizeof(pop3_add)) < 0)
  312. {
  313. strLog.Format("failed to bind POP3 socket on Port %d.", nPop3Port);
  314. m_logFile.WriteLog(strLog);
  315. closesocket(m_SocketPop3);
  316. return 0;
  317. }
  318. strLog.Format("Succeed to bind Pop3 socket on Port %d", nPop3Port);
  319. m_logFile.WriteLog(strLog);
  320. if(listen(m_SocketPop3, 5) < 0)
  321. {
  322. strLog.Format("Failed to Listen Pop3 Socket");
  323. m_logFile.WriteLog(strLog);
  324. closesocket(m_SocketPop3);
  325. return 0;
  326. }
  327. strLog.Format("Succeed to Listen Pop3 Socket");
  328. m_logFile.WriteLog(strLog);
  329. FD_SET(m_SocketPop3, &fdset);
  330. //创建POP接受连接线程 
  331. CWinThread * pop3_thread = NULL;
  332. pop3_thread = AfxBeginThread(Pop3_AcceptThread, NULL);
  333. if(pop3_thread == NULL)
  334. {
  335. strLog.Format("Failed to CreateThread for POP3");
  336. m_logFile.WriteLog(strLog);
  337.     FD_CLR(m_SocketPop3, &fdset);
  338. closesocket(m_SocketPop3);
  339. return 0;
  340. }
  341. strLog.Format("Succeed to CreateThread for POP3");
  342. m_logFile.WriteLog(strLog);
  343. //创建SMTP侦听线程
  344. struct sockaddr_in smtp_add;
  345. m_SocketSmtp = socket(AF_INET, SOCK_STREAM, 0);
  346. if(m_SocketSmtp < 0)
  347. {
  348. strLog.Format("Failed to Create Socket for SMTP");
  349. m_logFile.WriteLog(strLog);
  350. return 0;
  351. }
  352. strLog.Format("Succeed to Create Socket for SMTP");
  353. m_logFile.WriteLog(strLog);
  354. memset((char*)&smtp_add, 0x0, sizeof(smtp_add));
  355. smtp_add.sin_family = AF_INET;
  356. smtp_add.sin_port = htons(nSmtpPort);
  357. smtp_add.sin_addr.s_addr = htonl(INADDR_ANY);
  358. if(bind(m_SocketSmtp, (struct sockaddr*)&smtp_add, sizeof(smtp_add)) < 0)
  359. {
  360. strLog.Format("Failed to bind SMTP Socket on Port %d", nSmtpPort);
  361. m_logFile.WriteLog(strLog);
  362. closesocket(m_SocketSmtp);
  363. TerminateThread(pop3_thread->m_hThread, 0);
  364. FD_CLR(m_SocketPop3, &fdset);
  365. closesocket(m_SocketPop3);
  366. return 0;
  367. }
  368. strLog.Format("Succeed to bind SMTP Socket on Port %d", nSmtpPort);
  369. m_logFile.WriteLog(strLog);
  370. if(listen(m_SocketSmtp, 5) < 0)
  371. {
  372. strLog.Format("Failed to listen SMTP Socket");
  373. m_logFile.WriteLog(strLog);
  374. closesocket(m_SocketSmtp);
  375. TerminateThread(pop3_thread->m_hThread, 0);
  376. FD_CLR(m_SocketPop3, &fdset);
  377. closesocket(m_SocketPop3);
  378. return 0;
  379. }
  380. strLog.Format("Succeed to listen SMTP Socket");
  381. m_logFile.WriteLog(strLog);
  382. FD_SET(m_SocketSmtp, &fdset);
  383. //创建SMTP Socket 接受线程
  384. CWinThread* smtp_thread = NULL;
  385. smtp_thread = AfxBeginThread(Smtp_AcceptThread, NULL);
  386. if(smtp_thread == NULL)
  387. {
  388. strLog.Format("Failed to CreateThread for SMTP");
  389. m_logFile.WriteLog(strLog);
  390. FD_CLR(m_SocketSmtp, &fdset);
  391. closesocket(m_SocketSmtp);
  392. TerminateThread(pop3_thread->m_hThread, 0);
  393. FD_CLR(m_SocketPop3, &fdset);
  394. closesocket(m_SocketPop3);
  395. return 0;
  396. }
  397. strLog.Format("Succeed to CreateThread for SMTP");
  398. m_logFile.WriteLog(strLog);
  399. //创建SMTP Realying处理线程
  400. unsigned long lThreadID;
  401. m_logFile.WriteLog("starting SMTP-Relay thread");
  402. HANDLE hSMTP = CreateThread(NULL,
  403.  0,
  404.  (LPTHREAD_START_ROUTINE)SendSMTP, 
  405.  NULL,
  406.  0,
  407.  &lThreadID);
  408. if(hSMTP == NULL)
  409. m_logFile.WriteLog("SMTP-Relay thread failed");
  410. else
  411. m_logFile.WriteLog("SMTP-Relay thread Started");
  412. sprintf(pop3_msg00,"");
  413. sprintf(pop3_msg01,"HELO d00d");
  414. sprintf(pop3_msg12,"no message found");
  415. sprintf(pop3_msg03,"user accepted");
  416. sprintf(pop3_msg04,"invalid username");
  417. sprintf(pop3_msg05,"welcome");
  418. sprintf(pop3_msg06,"wrong password for this user");
  419. sprintf(pop3_msg07,"closing connection");
  420. sprintf(pop3_msg08,"message not found");
  421. sprintf(pop3_msg09,"done");
  422. sprintf(pop3_msg10,"no data found");
  423. sprintf(pop3_msg11,"nothing to delete");
  424. sprintf(pop3_msg12,"Message deleted");
  425. sprintf(pop3_msg13,"unknown command");
  426. return 1;
  427. }
  428. UINT Pop3_AcceptThread(LPVOID pParam)
  429. {
  430. char send_data[255];
  431. CString strLog;
  432. CString strIP;
  433. UINT nPort;
  434. struct timeval timeout;
  435. struct sockaddr_in client_add;
  436. int nClientSock;
  437. int ret, len;
  438. len = sizeof(client_add);
  439. while(1)
  440. {
  441. if(FD_ISSET(m_SocketPop3, &fdset))
  442. {
  443. timeout.tv_sec = 60;
  444. timeout.tv_usec = 0;
  445. memcpy(&rfdset, &fdset, sizeof(fdset));
  446. ret = select(1, &rfdset, 0, 0, &timeout);
  447. if(ret  < 0)
  448. {
  449. strLog.Format("select() failed for POP3 Socket");
  450. m_logFile.WriteLog(strLog);
  451. break;
  452. }
  453. memset(&client_add, 0x0, sizeof(client_add));
  454. nClientSock = accept(m_SocketPop3, (struct sockaddr*)&client_add, &len);
  455. if(nClientSock < 0)
  456. {
  457. strLog.Format("Pop3 Socket Accept Failed");
  458. m_logFile.WriteLog(strLog);
  459. break;
  460. }
  461. else
  462. {
  463. //test
  464. gSocketUseCount++;
  465. strLog.Format("*************Current Socket for POP3 Count=%d", gSocketUseCount);
  466. m_logFile.WriteLog(strLog);
  467. struct sockaddr_in peer_add;
  468. int nPeerLen = sizeof(peer_add);
  469. getpeername(nClientSock, (struct sockaddr*)&peer_add, &nPeerLen);
  470. strIP = inet_ntoa(peer_add.sin_addr);
  471. nPort = ntohs(peer_add.sin_port);
  472. strLog.Format("Get Pop3 Connection at IP=%s, PORT=%d", strIP, nPort);
  473. m_logFile.WriteLog(strLog);
  474. bool bFlag = false;
  475. for(int i=0; i<SOCKET_SIZE; i++)
  476. {
  477. if(m_SocketList[i].sock == -1)
  478. {
  479. bFlag = true;
  480. break;
  481. }
  482. }
  483. if(!bFlag)
  484. {
  485. strLog.Format("Not Enough Socket buff for the Connection");
  486. m_logFile.WriteLog(strLog);
  487. continue;
  488. }
  489. m_SocketList[i].typ = 1;
  490. m_SocketList[i].sock = nClientSock;
  491. m_SocketList[i].ip = strIP;
  492. FD_SET(nClientSock, &fdset);
  493. sprintf(send_data, "+OK POP3 on Smart Mail Server for M-Office (%s) ready. %srn",CURVER,pop3_msg00);
  494. send(nClientSock, send_data, strlen(send_data), 0);
  495. //启动接收数据线程
  496. AfxBeginThread(Pop3_ReceiveThread, (LPVOID)i); 
  497. strLog.Format("Start Thread %d",i);
  498. m_logFile.WriteLog(strLog);
  499. }
  500. }
  501. else
  502. break;
  503. }
  504. return 0;
  505. }
  506. UINT Smtp_AcceptThread(LPVOID pParam)
  507. {
  508. char send_data[255];
  509. CString strLog;
  510. CString strIP;
  511. UINT nPort;
  512. struct timeval timeout;
  513. struct sockaddr_in client_add;
  514. int nClientSock;
  515. int ret, len;
  516. len = sizeof(client_add);
  517. //接收SMTP连接
  518. while(1)
  519. {
  520. if(FD_ISSET(m_SocketSmtp, &fdset))
  521. {
  522. timeout.tv_sec = 10;
  523. timeout.tv_usec = 0;
  524. memcpy(&rfdset, &fdset, sizeof(fdset));
  525. ret = select(1, &rfdset, 0, 0, &timeout);
  526. if(ret < 0)
  527. {
  528. strLog.Format("select() failed for SMTP socket");
  529. m_logFile.WriteLog(strLog);
  530. break;
  531. }
  532. memset(&client_add, 0x0, sizeof(client_add));
  533. nClientSock = accept(m_SocketSmtp, (struct sockaddr*)&client_add, &len);
  534. if(nClientSock < 0)
  535. {
  536. strLog.Format("SMTP Socket Accept Failed");
  537. m_logFile.WriteLog(strLog);
  538. break;
  539. }
  540. else
  541. {
  542. struct sockaddr_in peer_add;
  543. int nPeerLen = sizeof(peer_add);
  544. getpeername(nClientSock, (struct sockaddr*)&peer_add, &nPeerLen);
  545. strIP = inet_ntoa(peer_add.sin_addr);
  546. nPort = ntohs(peer_add.sin_port);
  547. strLog.Format("Get SMTP Connection at IP=%s, PORT=%d", strIP, nPort);
  548. m_logFile.WriteLog(strLog);
  549. bool bFlag = false;
  550. for(int i=0; i<SOCKET_SIZE; i++)
  551. {
  552. if(m_SocketList[i].sock == -1)
  553. {
  554. bFlag = true;
  555. break;
  556. }
  557. }
  558. if(!bFlag)
  559. {
  560. strLog.Format("Not Enough Socket buff for the Connection");
  561. m_logFile.WriteLog(strLog);
  562. continue;
  563. }
  564. m_SocketList[i].typ = 2;
  565. m_SocketList[i].sock = nClientSock;
  566. m_SocketList[i].ip = strIP;
  567. FD_SET(nClientSock, &fdset);
  568. sprintf(send_data, "220 SMTP on Smart Mail Server for M-Office(%s) ready.rn",CURVER);
  569. send(nClientSock, send_data, strlen(send_data), 0);
  570. //创建线程
  571. AfxBeginThread(Smtp_ReceiveThread, (LPVOID)i);
  572. }
  573. }
  574. else
  575. break;
  576. }
  577. return 1;
  578. }
  579. UINT Pop3_ReceiveThread(LPVOID pParam)
  580. {
  581. CString strLog;
  582. int index = (int)pParam;
  583. char buff[1025];
  584. while(1)
  585. {
  586. memset(buff, 0x0, sizeof(buff));
  587. int ret = recv(m_SocketList[index].sock, (char*)buff, 1024, 0);
  588. if(ret <= 0)
  589. {
  590. // strLog.Format("recv() from pop3 client failed");
  591. // m_logFile.WriteLog(strLog);
  592. if(m_SocketList[index].sock != -1)
  593. {
  594. FD_CLR(m_SocketList[index].sock, &fdset);
  595. closesocket(m_SocketList[index].sock);
  596. m_SocketList[index].sock = -1;
  597. //test
  598. gSocketUseCount--;
  599. strLog.Format("***********Close socket for Pop3 Connection, SocketCOunt=%d", gSocketUseCount);
  600. m_logFile.WriteLog(strLog);
  601. m_SocketList[index].showlog = FALSE;
  602. m_SocketList[index].status2 = 0;
  603. m_SocketList[index].status = 0;
  604. m_SocketList[index].typ = 0;
  605. m_SocketList[index].openf= 0;
  606. m_SocketList[index].Temp = "";
  607. m_SocketList[index].Username = "unknown";
  608. m_SocketList[index].dontwrite = FALSE;
  609. }
  610. break;
  611. }
  612. else
  613. {
  614. ReadPop3(buff, ret, index); //处理数据 
  615. }
  616. }
  617. return 1;
  618. }
  619. UINT Smtp_ReceiveThread(LPVOID pParam)
  620. {
  621. CString strLog;
  622. int index = (int)pParam;
  623. char buff[1025];
  624. while(1)
  625. {
  626. int ret = recv(m_SocketList[index].sock, (char*)buff, 1024, 0);
  627. if(ret <= 0)
  628. {
  629. // strLog.Format("recv() from SMTP client failed");
  630. // m_logFile.WriteLog(strLog);
  631. if(m_SocketList[index].sock != -1)
  632. {
  633. FD_CLR(m_SocketList[index].sock, &fdset);
  634. closesocket(m_SocketList[index].sock);
  635. m_SocketList[index].sock = -1;
  636. }
  637. break;
  638. }
  639. else
  640. {
  641. ReadSmtp(buff, ret, index); //处理数据 
  642. }
  643. }
  644. return 1;
  645. }
  646. void ReadPop3(char* buf, int nDataLen, int i)
  647. {
  648. CString strLog;
  649. SOCKET sock_temp = m_SocketList[i].sock;
  650. // char buf[1025];
  651. CString tempstr = "";
  652. // int nix = pSocket->Receive(&buf, 1024,0);
  653. int nix = nDataLen;
  654. buf[nix] = '';
  655. strLog.Format("SOCKET=%d Pop3 Received buf[%d]: %s", sock_temp, i, buf);
  656. m_logFile.WriteLog(strLog);
  657. CString tempcstr;
  658. tempstr = buf;
  659. char sendstr[255];
  660. tempcstr = tempstr;
  661. m_SocketList[i].Temp = m_SocketList[i].Temp + tempstr;
  662. if (m_SocketList[i].Temp.GetLength()>240) 
  663. {
  664. m_SocketList[i].Temp = "";
  665. return;
  666. }; //buffer to large problem
  667. tempstr =  m_SocketList[i].Temp;
  668. if(tempstr.GetLength() == 0)
  669. return ;
  670. if(tempstr.GetAt(tempstr.GetLength()-1) != 'n') 
  671. return;
  672. strLog.Format("SOCKET=%d Pop3 Received aaaaaa[%d]: %s", sock_temp, i, tempstr);
  673. m_logFile.WriteLog(strLog);
  674. char tempstrU[255];
  675. sprintf(tempstrU,"%s",tempstr);
  676. strupr(tempstrU);
  677. //AUTH command
  678. if ((tempstrU[0] == 'A') && (tempstrU[1] == 'U') 
  679. && (tempstrU[2] == 'T') && (tempstrU[3] == 'H') 
  680. && (tempstrU[4] == ' ') )
  681. {
  682. sprintf(sendstr,"-ERR %srn",pop3_msg02);
  683. send (sock_temp, sendstr,strlen(sendstr),0);
  684. m_SocketList[i].Temp = "";
  685. return;
  686. }
  687. //USER command 
  688. if ((tempstrU[0] == 'U') && (tempstrU[1] == 'S') 
  689. && (tempstrU[2] == 'E') && (tempstrU[3] == 'R') 
  690. && (tempstrU[4] == ' ') )
  691. {
  692. sprintf(sendstr,"+OK %srn",pop3_msg03);
  693. send(sock_temp, sendstr,strlen(sendstr),0);
  694. char tempstr2[255];
  695. sprintf(tempstr2,"%s",tempstr);
  696. for (UINT z = 5; z<= strlen(tempstr2);z++)
  697. {
  698. tempstr2[z-5] = tempstr2[z];
  699. }
  700. tempstr2[z-5] = '';
  701. CString tempcstr;
  702. if (tempstr2[strlen(tempstr2)-2] == 'n') tempstr2[strlen(tempstr2)-2] = '';
  703. if (tempstr2[strlen(tempstr2)-2] == 'r') tempstr2[strlen(tempstr2)-2] = '';
  704. tempcstr = tempstr2;
  705. m_SocketList[i].Username= tempcstr;
  706. m_SocketList[i].status = 1; 
  707. m_SocketList[i].Temp = "";
  708. return;
  709. }
  710. //XSENDER command
  711. if ((tempstrU[0] == 'X') && (tempstrU[1] == 'S') 
  712. && (tempstrU[2] == 'E') && (tempstrU[3] == 'N') 
  713. && (tempstrU[4] == 'D') && (tempstrU[5] == 'E')
  714. && (tempstrU[6] == 'R') && (tempstrU[7] == ' '))
  715. {
  716. send(sock_temp, "+OKrn",5,0);
  717. m_SocketList[i].Temp = "";
  718. return;
  719. }
  720. //PASS command
  721. if (((tempstrU[0] == 'P') && (tempstrU[1] == 'A') 
  722. && (tempstrU[2] == 'S') && (tempstrU[3] == 'S') 
  723. && (tempstrU[4] == ' ') ) && (m_SocketList[i].status == 1))
  724. {
  725. bool bOK = false;
  726. //查询数据库,查找对应的用户
  727. HRESULT hr;
  728. BSTR BstrUserID, BstrPassword, BstrName;
  729. CString strUserID, strPassword;
  730. strUserID.Format("%s", m_SocketList[i].Username);
  731. BstrUserID = strUserID.AllocSysString();
  732. hr = m_pMailDB->FindUserByUserID(BstrUserID, &BstrPassword, &BstrName);
  733. if(FAILED(hr)) //查询失败
  734. m_logFile.WriteLog("Seach the UserID from DB Failed");
  735. else
  736. {
  737. _bstr_t bstrPassword(BstrPassword, FALSE);
  738. strPassword = (char*)bstrPassword;
  739. if(strPassword != "") //存在此用户,不存在该用户时Password返回空
  740. bOK = true;
  741. }
  742. if (!bOK)
  743. {
  744. strLog.Format("SOCKET=%d POP3 Login incorrect: User=%s not Exist from IP=%s", sock_temp, m_SocketList[i].Username, m_SocketList[i].ip);
  745. m_logFile.WriteLog(strLog);
  746. sprintf(sendstr,"-ERR %srn",pop3_msg04);
  747. send (sock_temp, sendstr,strlen(sendstr),0);
  748. m_SocketList[i].status = 0;
  749. m_SocketList[i].Temp = "";
  750. return;
  751. }
  752. char tempstr2[255];
  753. sprintf(tempstr2,"%s",tempstr);
  754. for (UINT z = 5; z<= strlen(tempstr2);z++)
  755. {
  756. tempstr2[z-5] = tempstr2[z];
  757. }
  758. tempstr2[z-5] = '';
  759. CString tempcstr;
  760. if (tempstr2[strlen(tempstr2)-2] == 'n') tempstr2[strlen(tempstr2)-2] = '';
  761. if (tempstr2[strlen(tempstr2)-2] == 'r') tempstr2[strlen(tempstr2)-2] = '';
  762. if (strPassword == tempstr2)
  763. {
  764. strLog.Format("SOCKET=%d User login: UserID=%s from IP=%s",sock_temp,m_SocketList[i].Username,m_SocketList[i].ip);
  765. m_logFile.WriteLog(strLog);
  766. sprintf(sendstr,"+OK %srn",pop3_msg05);
  767. send(sock_temp, sendstr,strlen(sendstr),0);
  768. strLog.Format("SOCKET=%d send:%s", sock_temp, sendstr);
  769. m_logFile.WriteLog(strLog);
  770. m_SocketList[i].Temp = "";
  771. m_SocketList[i].status = 2; 
  772. }
  773. else
  774. {
  775. sprintf(sendstr,"-ERR %srn",pop3_msg06);
  776. send (sock_temp, sendstr,strlen(sendstr),0);
  777. m_SocketList[i].Temp = "";
  778. m_SocketList[i].status = 0; 
  779. strLog.Format("Login incorrect: User=%s from IP=%s", m_SocketList[i].Username, m_SocketList[i].ip);
  780. m_logFile.WriteLog(strLog);
  781. }
  782. return;
  783. }
  784. //NOOP command
  785. if ((tempstrU[0] == 'N') && (tempstrU[1] == 'O') 
  786. && (tempstrU[2] == 'O') && (tempstrU[3] == 'P') )
  787. {
  788. send (sock_temp, "+OKrn",5,0);
  789. m_SocketList[i].Temp = "";
  790. return;
  791. }
  792. //QUIT command
  793. if ((tempstrU[0] == 'Q') && (tempstrU[1] == 'U') 
  794. && (tempstrU[2] == 'I') && (tempstrU[3] == 'T') )
  795. {
  796. sprintf(sendstr,"+OK %srn",pop3_msg07);
  797. send(sock_temp, sendstr,strlen(sendstr),0);
  798. for (int z = 0; z < m_DeleteList.GetSize(); z++)
  799. {
  800. if (m_SocketList[i].sock == m_DeleteList[z].sock)
  801. {
  802. int m = DeleteFile(m_strExePath + "\" +m_DeleteList[z].Filename);
  803. ::EnterCriticalSection(&m_csDeleteList);
  804. m_DeleteList.RemoveAt(z);
  805. ::LeaveCriticalSection(&m_csDeleteList);
  806. z--;
  807. }
  808. }
  809. //关闭该socket
  810. if(m_SocketList[i].sock != -1)
  811. {
  812. //test
  813. /* gSocketUseCount--;
  814. strLog.Format("***********Close socket for Pop3 Connection, SocketCOunt=%d", gSocketUseCount);
  815. m_logFile.WriteLog(strLog);
  816. FD_CLR(m_SocketList[i].sock, &fdset);
  817. closesocket(m_SocketList[i].sock);
  818. m_SocketList[i].sock = -1;
  819. strLog.Format("Connection closed for %s",m_SocketList[i].ip);
  820. m_logFile.WriteLog(strLog);
  821. m_SocketList[i].showlog = FALSE;
  822. m_SocketList[i].status2 = 0;
  823. m_SocketList[i].status = 0;
  824. m_SocketList[i].typ = 0;
  825. m_SocketList[i].openf= 0;
  826. m_SocketList[i].Temp = "";
  827. m_SocketList[i].Username = "unknown";
  828. m_SocketList[i].dontwrite = FALSE;
  829. */
  830. }
  831. return;
  832. }
  833. //LIST command
  834. if ((tempstrU[0] == 'L') && (tempstrU[1] == 'I') 
  835. && (tempstrU[2] == 'S') && (tempstrU[3] == 'T') 
  836. && (m_SocketList[i].status == 2))
  837. {
  838. char fstr[255];
  839. sprintf(fstr,"%s\mail\%s\*.in",m_strExePath, m_SocketList[i].Username); 
  840. HANDLE hFind;
  841. WIN32_FIND_DATA findData = {0};
  842. char tempinf[255];
  843. char tempbuf[1024];
  844. sprintf(tempbuf,"");
  845. int c = 0;
  846. int length = 0;
  847. if(strlen(tempstrU) == 6)
  848. {
  849. hFind = FindFirstFile (fstr, &findData);
  850. if (hFind != INVALID_HANDLE_VALUE)
  851. {
  852. do
  853. {
  854. if (findData.cFileName[0] != '.')
  855. {
  856. c++;
  857. length = length + (findData.nFileSizeHigh * MAXDWORD) + findData.nFileSizeLow;
  858. }
  859. }while (FindNextFile(hFind, &findData));
  860. sprintf(tempbuf,"+OK %i %irn",c,length);
  861. FindClose (hFind);
  862. }
  863. c = 0;
  864. length = 0;
  865. hFind = FindFirstFile (fstr, &findData);
  866. if (hFind == INVALID_HANDLE_VALUE)
  867. {
  868. send (sock_temp, "+OK 0 0rn.rn",9,0);
  869. strLog.Format("SOCKET=%d send:+OK 0 0rn.rn", sock_temp);
  870. m_logFile.WriteLog(strLog);
  871. }
  872. else
  873. {
  874. do
  875. {
  876. if (findData.cFileName[0] != '.')
  877. {
  878. c++;
  879. length = (findData.nFileSizeHigh * MAXDWORD) + findData.nFileSizeLow;
  880. sprintf(tempbuf,"%s%i %irn",tempbuf,c,length);
  881. }
  882. }   while (FindNextFile(hFind, &findData));
  883. sprintf(tempbuf,"%s.rn",tempbuf);
  884. send (sock_temp, tempbuf,strlen(tempbuf),0);   
  885. strLog.Format("SOCKET=%d send:%s", sock_temp, tempbuf);
  886. m_logFile.WriteLog(strLog);
  887. FindClose (hFind);
  888. }
  889. }
  890. else
  891. {
  892. int nr;
  893. hFind = FindFirstFile (fstr, &findData);
  894. DeleteCRLF(tempstrU);
  895. int foundit = 0;
  896. sscanf(tempstrU,"%s %i",tempinf,&nr);
  897. if (hFind == INVALID_HANDLE_VALUE)
  898. {
  899. send (sock_temp, "+OK 0 0rn",9,0);
  900. strLog.Format("SOCKET=%d send:+OK 0 0rn", sock_temp);
  901. m_logFile.WriteLog(strLog);
  902. }
  903. else
  904. {
  905. do
  906. {
  907. if (findData.cFileName[0] != '.')
  908. {
  909. c++;
  910. if (c == nr) 
  911. {
  912. foundit = 1;
  913. length = (findData.nFileSizeHigh * MAXDWORD) + findData.nFileSizeLow;
  914. }
  915. }
  916. }   while (FindNextFile(hFind, &findData));
  917. if (foundit == 1)
  918. sprintf(tempinf,"+OK %i %irn",nr,length);
  919. if (foundit == 0)
  920. sprintf(tempinf,"-ERR %srn",pop3_msg08);
  921. send (sock_temp, tempinf,strlen(tempinf),0);   
  922. strLog.Format("SOCKET=%d send:%s", sock_temp,tempinf);
  923. m_logFile.WriteLog(strLog);
  924. FindClose (hFind);
  925. }
  926. }
  927. m_SocketList[i].Temp = "";
  928. return;
  929. }
  930. //RSET command
  931. if ((tempstrU[0] == 'R') && (tempstrU[1] == 'S') 
  932. && (tempstrU[2] == 'E') && (tempstrU[3] == 'T') )
  933. {
  934. sprintf(sendstr,"+OK %srn",pop3_msg09);
  935. send (sock_temp, sendstr,strlen(sendstr),0);
  936. m_SocketList[i].Temp = "";
  937. m_SocketList[i].status = 0; 
  938. return;
  939. }
  940. //RETR command
  941. if ((tempstrU[0] == 'R') && (tempstrU[1] == 'E') 
  942. && (tempstrU[2] == 'T') && (tempstrU[3] == 'R') 
  943. && (tempstrU[4] == ' ')&& (m_SocketList[i].status >= 2) )
  944. {
  945. char tempstr2[255];
  946. sprintf(tempstr2,tempstr);
  947. for (UINT z = 5; z<= strlen(tempstr2);z++)
  948. {
  949. tempstr2[z-5] = tempstr2[z];
  950. }
  951. tempstr2[z-5] = '';
  952. CString tempcstr;
  953. if (tempstr2[strlen(tempstr2)-2] == 'n') tempstr2[strlen(tempstr2)-2] = '';
  954. if (tempstr2[strlen(tempstr2)-2] == 'r') tempstr2[strlen(tempstr2)-2] = '';
  955. tempcstr = tempstr2;
  956. int iretr = atoi(tempcstr); //the number of the mail...
  957. char fstr[255];
  958. sprintf(fstr,"%s\mail\%s\*.in", m_strExePath, m_SocketList[i].Username); 
  959. HANDLE hFind;
  960. char fname[255];
  961. WIN32_FIND_DATA findData = {0};
  962. hFind = FindFirstFile (fstr, &findData);
  963. if (hFind == INVALID_HANDLE_VALUE)
  964. {
  965. sprintf(sendstr,"-ERR %srn",pop3_msg10);
  966. send (sock_temp, sendstr,strlen(sendstr),0);
  967. }
  968. else
  969. {
  970. int c = 0;
  971. int length = 0;
  972. BOOL found = FALSE;
  973. int status1 = 0;
  974. do
  975. {
  976. if (findData.cFileName[0] != '.')
  977. {
  978. c++;
  979. length = length + (findData.nFileSizeHigh * MAXDWORD) + findData.nFileSizeLow;
  980. if (c == iretr)
  981. {
  982. found = TRUE;
  983. sprintf(sendstr,"+OK %i octetsrn",length);
  984. int len=strlen(sendstr);
  985. send(sock_temp, sendstr, strlen(sendstr), 0);
  986. sprintf(fname,"mail\%s\%s", m_SocketList[i].Username, findData.cFileName);
  987. //发送Mail内容
  988. SendPop3Mail(sock_temp, fname);
  989. /* _SendPop3Param* pSock_file = new _SendPop3Param;
  990. pSock_file->sock = sock_temp;
  991. memcpy(&pSock_file->fname, fname, sizeof(pSock_file->fname));
  992. AfxBeginThread(SendPop3Mail, (LPVOID)pSock_file );
  993. */
  994. }
  995. }
  996. }
  997. while (FindNextFile(hFind, &findData));
  998. FindClose (hFind);
  999. if (found == FALSE)
  1000. {
  1001. sprintf(sendstr,"-ERR %srn",pop3_msg10);
  1002. send (sock_temp, sendstr,strlen(sendstr),0);
  1003. }
  1004. }
  1005. m_SocketList[i].Temp = "";
  1006. return;
  1007. }
  1008. //TOP command
  1009. if ((tempstrU[0] == 'T') && (tempstrU[1] == 'O') 
  1010. && (tempstrU[2] == 'P') && (tempstrU[3] == ' ') && (m_SocketList[i].status == 2))
  1011. {
  1012. char tempstr2[255];
  1013. sprintf(tempstr2,tempstr);
  1014. CString tempcstr;
  1015. if (tempstr2[strlen(tempstr2)-2] == 'n') tempstr2[strlen(tempstr2)-2] = '';
  1016. if (tempstr2[strlen(tempstr2)-2] == 'r') tempstr2[strlen(tempstr2)-2] = '';
  1017. tempcstr = tempstr2;
  1018. char tempstr1[255];
  1019. char mesgn[255];
  1020. sprintf(mesgn,"");
  1021. char lines[255];
  1022. sprintf(lines,"");
  1023. sscanf(tempcstr,"%s %s %s",tempstr1,mesgn,lines);
  1024. int iretr = atoi(mesgn);
  1025. char fstr[255];
  1026. sprintf(fstr,"%s\mail\%s\*.in", m_strExePath, m_SocketList[i].Username); 
  1027. HANDLE hFind;
  1028. char fname[255];
  1029. WIN32_FIND_DATA findData = {0};
  1030. char outstr[255];
  1031. int err;
  1032. BOOL found = FALSE;
  1033. FILE *outmail;
  1034. hFind = FindFirstFile (fstr, &findData);
  1035. if (hFind == INVALID_HANDLE_VALUE)
  1036. {
  1037. send (sock_temp, "-ERR No data foundrn",20,0);
  1038. strLog.Format("SOCKET=%d send:-ERR No data foundrn", sock_temp);
  1039. m_logFile.WriteLog(strLog);
  1040. }
  1041. else
  1042. {
  1043. int c = 0;
  1044. int length = 0;
  1045. int status1 = 0;
  1046. do
  1047. {
  1048. if (findData.cFileName[0] != '.')
  1049. {
  1050. c++;
  1051. length = length + (findData.nFileSizeHigh * MAXDWORD) + findData.nFileSizeLow;
  1052. if (c == iretr)
  1053. {
  1054. char sendstr[255];
  1055. int ilines = abs(atoi(lines));
  1056. //if (ilines == 0) ilines = 10;
  1057. //sprintf(sendstr,"+OK showing %i linesrn",ilines);
  1058. sprintf(sendstr,"+OKrn");
  1059. send (sock_temp, sendstr,strlen(sendstr),0);
  1060. sprintf(fname,"%s\mail\%s\%s", m_strExePath,
  1061. m_SocketList[i].Username, findData.cFileName);
  1062. if( (outmail= fopen(fname, "rb" )) != NULL )
  1063. {
  1064. //for (int ii = 0;ii<ilines;ii++)
  1065. int SendLines=0;
  1066. for (;;)
  1067. {
  1068. memset(outstr,0x0,255);
  1069. fgets(outstr,254,outmail);
  1070. if (!feof(outmail))
  1071. {
  1072. //outstr[strlen(outstr)-2] = 'n';
  1073. outstr[strlen(outstr)] = '';
  1074. int nbyte;
  1075. nbyte = send (sock_temp, outstr,strlen(outstr),0);
  1076. strLog.Format("SOCKET=%d send:%s", sock_temp,outstr);
  1077. m_logFile.WriteLog(strLog);
  1078. if(nbyte < 0)
  1079. {
  1080. err = GetLastError();
  1081. if(err == WSAEWOULDBLOCK)
  1082. {
  1083. while(err == WSAEWOULDBLOCK)
  1084. {
  1085. send (sock_temp, outstr,strlen(outstr),0);
  1086. strLog.Format("SOCKET=%d send:%s", sock_temp,outstr);
  1087. m_logFile.WriteLog(strLog);
  1088. err = GetLastError();
  1089. }
  1090. }
  1091. else
  1092. {
  1093. fclose(outmail); 
  1094. send (sock_temp, "-ERR Server Send Data Errorrn",20,0);
  1095. strLog.Format("SOCKET=%d send:-ERR Server Send Data Errorrn", sock_temp);
  1096. m_logFile.WriteLog(strLog);
  1097. return;
  1098. }
  1099. }
  1100. }else
  1101. {
  1102. break;
  1103. }
  1104. if((strlen(outstr)==2 && SendLines==0) ||  SendLines >0)
  1105. SendLines++;
  1106. if (SendLines > ilines)
  1107. break;
  1108. }
  1109. found = TRUE;
  1110. if (!feof(outmail)) 
  1111. {
  1112. send (sock_temp, ".rn",3,0);
  1113. strLog.Format("SOCKET=%d send:.rn", sock_temp);
  1114. m_logFile.WriteLog(strLog);
  1115. }
  1116. fclose(outmail);
  1117. }
  1118. }
  1119. }
  1120. }
  1121. while (FindNextFile(hFind, &findData));
  1122. FindClose (hFind);
  1123. }
  1124. if (found == FALSE)  
  1125. {
  1126. send (sock_temp, "-ERR No data foundrn",20,0);
  1127. strLog.Format("SOCKET=%d send:-ERR No data foundrn", sock_temp);
  1128. m_logFile.WriteLog(strLog);
  1129. }
  1130. m_SocketList[i].Temp = "";
  1131. return;
  1132. }
  1133. //DELE command
  1134. if (((tempstrU[0] == 'D') && (tempstrU[1] == 'E') 
  1135. && (tempstrU[2] == 'L') && (tempstrU[3] == 'E') 
  1136. && (tempstrU[4] == ' ')) && (m_SocketList[i].status == 2))
  1137. {
  1138. char tempstr2[255];
  1139. sprintf(tempstr2,tempstr);
  1140. for (UINT z = 5; z<= strlen(tempstr2);z++)
  1141. {
  1142. tempstr2[z-5] = tempstr2[z];
  1143. }
  1144. tempstr2[z-5] = '';
  1145. CString tempcstr;
  1146. if (tempstr2[strlen(tempstr2)-2] == 'n') tempstr2[strlen(tempstr2)-2] = '';
  1147. if (tempstr2[strlen(tempstr2)-2] == 'r') tempstr2[strlen(tempstr2)-2] = '';
  1148. tempcstr = tempstr2;
  1149. int iretr = atoi(tempcstr);
  1150. char fstr[255];
  1151. sprintf(fstr,"%s\mail\%s\*.in", m_strExePath, m_SocketList[i].Username); 
  1152. DeleteInfo Mydelinfo;   
  1153. Mydelinfo.sock = m_SocketList[i].sock;
  1154. HANDLE hFind;
  1155. char fname[255];
  1156. WIN32_FIND_DATA findData = {0};
  1157. hFind = FindFirstFile (fstr, &findData);
  1158. if (hFind == INVALID_HANDLE_VALUE)
  1159. {
  1160. sprintf(sendstr,"-ERR %srn",pop3_msg11);
  1161. send (sock_temp, sendstr,strlen(sendstr),0);
  1162. }
  1163. else
  1164. {
  1165. int c = 0;
  1166. BOOL found = FALSE;
  1167. do
  1168. {
  1169. if (findData.cFileName[0] != '.')
  1170. {
  1171. c++;
  1172. if (c == iretr)
  1173. {
  1174. sprintf(fname,"mail\%s\%s", m_SocketList[i].Username, findData.cFileName);
  1175. Mydelinfo.Filename = fname;
  1176. m_DeleteList.Add(Mydelinfo);
  1177. sprintf(sendstr,"+OK %srn",pop3_msg12);
  1178. send (sock_temp, sendstr,strlen(sendstr),0);
  1179. found = TRUE;
  1180. }
  1181. }
  1182. }while (FindNextFile(hFind, &findData));
  1183. FindClose (hFind);
  1184. if (found == FALSE)
  1185. {
  1186. sprintf(sendstr,"-ERR %srn",pop3_msg11);
  1187. send (sock_temp, sendstr,strlen(sendstr),0);
  1188. }
  1189. }
  1190. m_SocketList[i].Temp = "";
  1191. return;
  1192. }
  1193. //STAT command
  1194. if (((tempstrU[0] == 'S') && (tempstrU[1] == 'T') 
  1195. && (tempstrU[2] == 'A') && (tempstrU[3] == 'T') 
  1196. ) && (m_SocketList[i].status == 2))
  1197. {
  1198. char fstr[255];
  1199. sprintf(fstr,"%s\mail\%s\*.in", m_strExePath, m_SocketList[i].Username); 
  1200. char tempinf[255];
  1201. HANDLE hFind;
  1202. WIN32_FIND_DATA findData = {0};
  1203. hFind = FindFirstFile (fstr, &findData);
  1204. if (hFind == INVALID_HANDLE_VALUE)
  1205. {
  1206. send (sock_temp, "+OK 0 0rn",9,0);
  1207. strLog.Format("SOCKET=%d send:+OK 0 0rn", sock_temp);
  1208. m_logFile.WriteLog(strLog);
  1209. }
  1210. else
  1211. {
  1212. int c = 0;
  1213. int length = 0;
  1214. do
  1215. {
  1216. if (findData.cFileName[0] != '.')
  1217. {
  1218. c++;
  1219. length = length + (findData.nFileSizeHigh * MAXDWORD) + findData.nFileSizeLow;
  1220. }
  1221. }   while (FindNextFile(hFind, &findData));
  1222. sprintf(tempinf,"+OK %i %irn",c,length);
  1223. send (sock_temp, tempinf,strlen(tempinf),0);
  1224. strLog.Format("SOCKET=%d send:%s", sock_temp, tempinf);
  1225. m_logFile.WriteLog(strLog);
  1226. FindClose (hFind);
  1227. }
  1228. m_SocketList[i].Temp = "";
  1229. return;
  1230. }
  1231. sprintf(sendstr,"-ERR %srn",pop3_msg13);
  1232. send (sock_temp, sendstr,strlen(sendstr),0);
  1233. strLog.Format("SOCKET=%d send:%s", sock_temp, sendstr);
  1234. m_logFile.WriteLog(strLog);
  1235. if (tempstr[tempstr.GetLength()-1] == 'n') 
  1236. m_SocketList[i].Temp = "";
  1237. }
  1238. void ReadSmtp(char* buf, int nDataLen, int i)
  1239. {
  1240. CString strLog;
  1241. SOCKET sock_temp = m_SocketList[i].sock;
  1242. // char buf[1025];
  1243. CString tempstr;
  1244. FILE *stream;
  1245. // int nix = pSocket->Receive(&buf, 1024,0);
  1246. int nix = nDataLen;
  1247. buf[nix] = '';
  1248. if (m_SocketList[i].status >= 5) // get a mail... :)
  1249. {
  1250. //将收到的邮件内容以流的形式写入文件
  1251. // fprintf(m_SocketList[i].mail,"%s",buf); 
  1252. m_SocketList[i].strHead = m_SocketList[i].strHead+ buf;
  1253. if(m_SocketList[i].bTransHead == 0) //信件头部未传输完毕
  1254. {
  1255. if(m_SocketList[i].strHead.Find("rnrn") > -1)
  1256. {
  1257. m_SocketList[i].bTransHead = 1;
  1258. CString strTemp=m_SocketList[i].strHead;
  1259. strTemp.MakeUpper();
  1260. if(strTemp.Find("rnMESSAGE-ID:") >-1 || strTemp.Find("MESSAGE-ID:") == 0)
  1261. {
  1262. fprintf(m_SocketList[i].mail,"%s",m_SocketList[i].strHead);
  1263. m_SocketList[i].strHead="";
  1264. }else
  1265. {
  1266. //产生message-id
  1267. char chMessageID[100];
  1268. time_t tm;
  1269. time(&tm);
  1270. srand((unsigned)time(NULL));
  1271. sprintf(chMessageID, "Message-ID: <%d.%d.smartmailserver@m_office.com>rn", tm, rand());
  1272. strTemp=chMessageID+m_SocketList[i].strHead;
  1273. fprintf(m_SocketList[i].mail,"%s",strTemp);
  1274. m_SocketList[i].strHead="";
  1275. }
  1276. }
  1277. }else
  1278. {
  1279. if(m_SocketList[i].strHead.GetLength()>4096)
  1280. {
  1281. if(fprintf(m_SocketList[i].mail,"%s",m_SocketList[i].strHead)!=m_SocketList[i].strHead.GetLength())
  1282. {
  1283. CString strLog;
  1284. strLog.Format("Write file %s error",m_SocketList[i].Fname);
  1285. m_logFile.WriteLog(strLog);
  1286. }
  1287. m_SocketList[i].strHead = "";
  1288. }
  1289. }
  1290. if (nix == 1)
  1291. {
  1292. m_SocketList[i].crstr[0] = m_SocketList[i].crstr[1];
  1293. m_SocketList[i].crstr[1] = m_SocketList[i].crstr[2];
  1294. m_SocketList[i].crstr[2] = m_SocketList[i].crstr[3];
  1295. m_SocketList[i].crstr[3] = m_SocketList[i].crstr[4];
  1296. m_SocketList[i].crstr[4] = buf[0];
  1297. }
  1298. if (nix == 2)
  1299. {
  1300. m_SocketList[i].crstr[0] = m_SocketList[i].crstr[2];
  1301. m_SocketList[i].crstr[1] = m_SocketList[i].crstr[3];
  1302. m_SocketList[i].crstr[2] = m_SocketList[i].crstr[4];
  1303. m_SocketList[i].crstr[3] = buf[0];
  1304. m_SocketList[i].crstr[4] = buf[1];
  1305. }
  1306. if (nix == 3)
  1307. {
  1308. m_SocketList[i].crstr[0] = m_SocketList[i].crstr[3];
  1309. m_SocketList[i].crstr[1] = m_SocketList[i].crstr[4];
  1310. m_SocketList[i].crstr[2] = buf[0];
  1311. m_SocketList[i].crstr[3] = buf[1];
  1312. m_SocketList[i].crstr[4] = buf[2];
  1313. }
  1314. if (nix == 4)
  1315. {
  1316. m_SocketList[i].crstr[0] = m_SocketList[i].crstr[1];
  1317. m_SocketList[i].crstr[1] = buf[0];
  1318. m_SocketList[i].crstr[2] = buf[1];
  1319. m_SocketList[i].crstr[3] = buf[2];
  1320. m_SocketList[i].crstr[4] = buf[3];
  1321. }
  1322. if (nix == 5)
  1323. {
  1324. m_SocketList[i].crstr[0] = buf[0];
  1325. m_SocketList[i].crstr[1] = buf[1];
  1326. m_SocketList[i].crstr[2] = buf[2];
  1327. m_SocketList[i].crstr[3] = buf[3];
  1328. m_SocketList[i].crstr[4] = buf[4];
  1329. }
  1330. if (nix > 5)
  1331. {
  1332. m_SocketList[i].crstr[0] = buf[nix-5];
  1333. m_SocketList[i].crstr[1] = buf[nix-4];
  1334. m_SocketList[i].crstr[2] = buf[nix-3];
  1335. m_SocketList[i].crstr[3] = buf[nix-2];
  1336. m_SocketList[i].crstr[4] = buf[nix-1];
  1337. }
  1338. /*
  1339. if(m_SocketList[i].bTransHead == 0) //信件头部未传输完毕
  1340. {
  1341. CString strTemp=m_SocketList[i].crstr;
  1342. strTemp=strTemp+buf;
  1343. strTemp.MakeUpper();
  1344. //查找Message-ID:
  1345. if(strTemp.Find("rnMESSAGE-ID:") >-1)
  1346. {
  1347. m_SocketList[i].bFinded = 1;
  1348. }
  1349. int pos=strTemp.Find("rnrn");
  1350. if(pos > -1)//信件头部已经传输完毕
  1351. {
  1352. m_SocketList[i].bTransHead = 1;
  1353. if(m_SocketList[i].bFinded ==0)  //在头部没有发现Message-ID
  1354. {
  1355. //产生message-id
  1356. char chMessageID[100];
  1357. time_t tm;
  1358. time(&tm);
  1359. srand((unsigned)time(NULL));
  1360. sprintf(chMessageID, "Message-ID: <%d.%d.smartmailserver@m_office.com>rn", tm, rand());
  1361. CString strBuf=m_SocketList[i].crstr;
  1362. strBuf=strBuf+buf;
  1363. CString WriteStr;
  1364. WriteStr=strBuf.Left(pos+2)+chMessageID+strBuf.Right(strBuf.GetLength()-pos-2);
  1365. fseek(m_SocketList[i].mail, -5, SEEK_CUR);
  1366. fprintf(m_SocketList[i].mail,"%s",WriteStr);
  1367. }
  1368. }
  1369. fprintf(m_SocketList[i].mail,"%s",buf);
  1370. }else
  1371. {
  1372. fprintf(m_SocketList[i].mail,"%s",buf);
  1373. }
  1374. */
  1375. if (strcmp(m_SocketList[i].crstr,"rn.rn") == 0)
  1376. {
  1377. fprintf(m_SocketList[i].mail,"%s",m_SocketList[i].strHead); //保存剩余部分
  1378. m_SocketList[i].strHead = "";
  1379. send (sock_temp, "250 OKrn",8,0); //TODO if ok
  1380. if (m_SocketList[i].openf ==  1) 
  1381. fclose(m_SocketList[i].mail);
  1382. m_SocketList[i].status = 0;
  1383. ProcessNewMail(m_SocketList[i].FnameCTL,m_SocketList[i].Fname,m_SocketList[i].Sender);
  1384. if (m_SocketList[i].openf ==  1) 
  1385. fclose(m_SocketList[i].mail);
  1386. m_SocketList[i].FnameCTL = "";
  1387. m_SocketList[i].Fname = "";
  1388. }
  1389. return;
  1390. }
  1391. CString tempcstr;
  1392. tempstr = buf;
  1393. tempcstr = tempstr;
  1394. m_SocketList[i].Temp = m_SocketList[i].Temp + tempstr;
  1395. if (m_SocketList[i].Temp.GetLength()>240) 
  1396. {
  1397. m_SocketList[i].Temp = "";
  1398. return;
  1399. } //buffer to large problem
  1400. tempstr = m_SocketList[i].Temp;
  1401. if (tempstr[tempstr.GetLength()-1] != 'n') 
  1402. return;
  1403. strLog.Format("Smtp Received[%d]: %s", i, tempstr);
  1404. m_logFile.WriteLog(strLog);
  1405. char tempstrU[255];
  1406. sprintf(tempstrU,tempstr);
  1407. strupr(tempstrU);
  1408. if(m_SocketList[i].sLogin ==1) //已发送Auth login
  1409. {
  1410. char UserNameTemp[255];
  1411. strcpy(UserNameTemp,tempstr);
  1412. if (UserNameTemp[strlen(UserNameTemp)-2] == 'n') UserNameTemp[strlen(UserNameTemp)-2] = '';
  1413. if (UserNameTemp[strlen(UserNameTemp)-2] == 'r') UserNameTemp[strlen(UserNameTemp)-2] = '';
  1414. char UserName[255];
  1415. memset(UserName,0x0,255);
  1416. CEncoder base;
  1417. base.Decode(UserNameTemp,strlen(UserNameTemp),UserName,254,0);
  1418. m_SocketList[i].strLoginUserName =UserName;
  1419. m_SocketList[i].sLogin=2;
  1420. int dd=send (sock_temp, "334 UGFzc3dvcmQ6rn",18,0);
  1421. m_SocketList[i].Temp = "";
  1422. return;
  1423. }else if(m_SocketList[i].sLogin ==2) //已发送用户名
  1424. {
  1425. char PasswordTemp[255];
  1426. strcpy(PasswordTemp,tempstr);
  1427. if (PasswordTemp[strlen(PasswordTemp)-2] == 'n') PasswordTemp[strlen(PasswordTemp)-2] = '';
  1428. if (PasswordTemp[strlen(PasswordTemp)-2] == 'r') PasswordTemp[strlen(PasswordTemp)-2] = '';
  1429. char Password[255];
  1430. memset(Password,0x0,255);
  1431. CEncoder base;
  1432. base.Decode(PasswordTemp,strlen(PasswordTemp),Password,254,0);
  1433. m_SocketList[i].strLoginPassword =Password;
  1434. BSTR BstrUserID, BstrPassword,BstrName;
  1435. CString strPassword;
  1436. BstrUserID = m_SocketList[i].strLoginUserName.AllocSysString();
  1437. m_pMailDB->FindUserByUserID(BstrUserID, &BstrPassword, &BstrName);
  1438. _bstr_t  bstrPassword(BstrPassword, FALSE);
  1439. strPassword = (char*)bstrPassword;
  1440. if(strPassword ==m_SocketList[i].strLoginPassword)
  1441. {
  1442. send (sock_temp, "235 Authentication successfulrn",31,0);
  1443. m_SocketList[i].sLogin =3;
  1444. }else
  1445. {
  1446. send (sock_temp, "501 Login Errorrn",17,0);
  1447. m_SocketList[i].sLogin =4;
  1448. }
  1449. m_SocketList[i].Temp = "";
  1450. return;
  1451. }
  1452. //EHLO command
  1453. if ((tempstrU[0] == 'E') && (tempstrU[1] == 'H') 
  1454. && (tempstrU[2] == 'L') && (tempstrU[3] == 'O') 
  1455. && (tempstrU[4] == ' ') )
  1456. {
  1457. //send (sock_temp, "250 implementedrn",21,0);
  1458. send (sock_temp, "250-Welcomern",12,0);
  1459. send (sock_temp, "250-AUTH=LOGINrn",16,0);
  1460. send (sock_temp, "250 AUTH LOGINrn",16,0);
  1461. m_SocketList[i].sLogin =0;
  1462. m_SocketList[i].Temp = "";
  1463. return;
  1464. }
  1465. //AUTH LOGIN command
  1466. if ((tempstrU[0] == 'A') && (tempstrU[1] == 'U') 
  1467. && (tempstrU[2] == 'T') && (tempstrU[3] == 'H') 
  1468. && (tempstrU[4] == ' ') && (tempstrU[5] == 'L')
  1469. && (tempstrU[6] == 'O') && (tempstrU[7] == 'G')
  1470. && (tempstrU[8] == 'I') && (tempstrU[9] == 'N'))
  1471. {
  1472. send (sock_temp, "334 VXNlcm5hbWU6rn",18,0);
  1473. m_SocketList[i].sLogin =1;
  1474. m_SocketList[i].Temp = "";
  1475. return;
  1476. }
  1477. //HELO command
  1478. if ((tempstrU[0] == 'H') && (tempstrU[1] == 'E') 
  1479. && (tempstrU[2] == 'L') && (tempstrU[3] == 'O') 
  1480. && (tempstrU[4] == ' ') )
  1481. {
  1482. send (sock_temp, "250 HELOrn",10,0);
  1483. m_SocketList[i].sLogin =0;
  1484. m_SocketList[i].Temp = "";
  1485. return;
  1486. }
  1487. //NOOP command
  1488. if ((tempstrU[0] == 'N') && (tempstrU[1] == 'O') 
  1489. && (tempstrU[2] == 'O') && (tempstrU[3] == 'P') )
  1490. {
  1491. send (sock_temp, "220 OKrn",8,0);
  1492. m_SocketList[i].Temp = "";
  1493. return;
  1494. }
  1495. //RSET command
  1496. if ((tempstrU[0] == 'R') && (tempstrU[1] == 'S') 
  1497. && (tempstrU[2] == 'E') && (tempstrU[3] == 'T') )
  1498. {
  1499. send (sock_temp, "220 OKrn",8,0);
  1500. m_SocketList[i].Temp = "";
  1501. return;
  1502. }
  1503. //MAIL FROM command
  1504. if ((tempstrU[0] == 'M') && (tempstrU[1] == 'A') 
  1505. && (tempstrU[2] == 'I') && (tempstrU[3] == 'L') 
  1506. && (tempstrU[4] == ' ')&& (tempstrU[5]  == 'F') 
  1507. && (tempstrU[6] == 'R') && (tempstrU[7] == 'O')
  1508. && (tempstrU[8] == 'M'))
  1509. {
  1510. send (sock_temp, "250 OKrn",8,0);
  1511. m_SocketList[i].Temp = "";
  1512. m_SocketList[i].Sender = tempstr;
  1513. return;
  1514. }
  1515. //RCPT TO command
  1516. if ((tempstrU[0] == 'R') && (tempstrU[1] == 'C') 
  1517. && (tempstrU[2] == 'P') && (tempstrU[3] == 'T') 
  1518. && (tempstrU[4] == ' ')&& (tempstrU[5]  == 'T') 
  1519. && (tempstrU[6] == 'O'))
  1520. {
  1521. CString strRcpt=tempstr;
  1522. if(!IsLocalUser((LPSTR)(LPCSTR)strRcpt) && m_SocketList[i].sLogin != 3)  //不是本地用户并且没有通过验证
  1523. {
  1524. send (sock_temp, "501 Not loginrn",18,0);
  1525. }else
  1526. {
  1527. if (m_SocketList[i].FnameCTL == "")
  1528. {
  1529. char tempstrA[255];
  1530. CTime t = CTime::GetCurrentTime();
  1531. SYSTEMTIME stime;
  1532. GetSystemTime(&stime);
  1533. sprintf(tempstrA,"%i%02i%02i%02i%02i%02i%i.in",t.GetYear(),t.GetMonth(),t.GetDay(),t.GetHour(),t.GetMinute(),t.GetSecond(),stime.wMilliseconds);
  1534. int xxi = 0;
  1535. m_SocketList[i].Fname = tempstrA;
  1536. sprintf(tempstrA,"%i%02i%02i%02i%02i%02i%i.ctl",t.GetYear(),t.GetMonth(),t.GetDay(),t.GetHour(),t.GetMinute(),t.GetSecond(),stime.wMilliseconds);
  1537. m_SocketList[i].FnameCTL = tempstrA;
  1538. }
  1539. if( (stream  = fopen(m_strExePath+"\mail\" + m_SocketList[i].FnameCTL, "at" )) != NULL )
  1540. {
  1541. fprintf(stream,"%s",tempstr);
  1542. fclose(stream);
  1543. send (sock_temp, "250 OKrn",8,0);
  1544. }
  1545. else
  1546. {
  1547. send (sock_temp, "501 Server Errorrn",18,0);
  1548. }
  1549. m_SocketList[i].status = 4; 
  1550. }
  1551. m_SocketList[i].Temp = "";
  1552. return;
  1553. }
  1554. //DATA command
  1555. if ( ((tempstrU[0] == 'D') && (tempstrU[1] == 'A') 
  1556. && (tempstrU[2] == 'T') && (tempstrU[3] == 'A')) && m_SocketList[i].status == 4)
  1557. {
  1558. send (sock_temp, "354 Enter your data, end with <crlf>.<crlf>rn",45,0);
  1559. if( (m_SocketList[i].mail = fopen(m_strExePath+"\mail\" + m_SocketList[i].Fname, "wb" )) != NULL )
  1560. {
  1561. m_SocketList[i].crstr[0] = ' ';
  1562. m_SocketList[i].crstr[1] = ' ';
  1563. m_SocketList[i].crstr[2] = ' ';
  1564. m_SocketList[i].crstr[3] = ' ';
  1565. m_SocketList[i].crstr[4] = ' ';
  1566. m_SocketList[i].crstr[5] = '';
  1567. m_SocketList[i].status = 5;
  1568. m_SocketList[i].openf = 1;
  1569. m_SocketList[i].bTransHead = 0;
  1570. m_SocketList[i].strHead="";
  1571. //m_SocketList[i].bFinded = 0;
  1572. else
  1573. {
  1574. send (sock_temp, "502 Server Errorrn",18,0);
  1575. }
  1576. m_SocketList[i].Temp = "";
  1577. return;
  1578. }
  1579. if ((tempstrU[0] == 'Q') && (tempstrU[1] == 'U') 
  1580. && (tempstrU[2] == 'I') && (tempstrU[3] == 'T') )
  1581. {
  1582. send(sock_temp, "221 Closing connectionrn",24,0);
  1583. strLog.Format("Connection closed for %s", m_SocketList[i].ip);
  1584. m_logFile.WriteLog(strLog);
  1585. if(m_SocketList[i].sock != -1)
  1586. {
  1587. FD_CLR(m_SocketList[i].sock, &fdset);
  1588. closesocket(m_SocketList[i].sock);
  1589. m_SocketList[i].sock = -1;
  1590. m_SocketList[i].showlog = FALSE;
  1591. m_SocketList[i].status2 = 0;
  1592. m_SocketList[i].status = 0;
  1593. m_SocketList[i].typ = 0;
  1594. m_SocketList[i].openf= 0;
  1595. m_SocketList[i].Temp = "";
  1596. m_SocketList[i].Username = "unknown";
  1597. m_SocketList[i].dontwrite = FALSE;
  1598. }
  1599. return;
  1600. }
  1601. }
  1602. void SendSMTP()
  1603. {
  1604. CString strLog;
  1605. time_t the_time;
  1606. int curitem = -1;
  1607. for (;;)
  1608. {
  1609. Sleep(1000); //zzz, every second we check if we should send a mail
  1610. if(m_SMTPForwardList.GetSize()>0)
  1611. {
  1612. for (int li= 0;li<=m_SMTPForwardList.GetSize()-1;li++)
  1613. {
  1614. curitem = li;
  1615. if (m_SMTPForwardList[curitem].error == 0)
  1616. {
  1617. m_SMTPForwardList[curitem].sendnr = 0;
  1618. strLog.Format("Trying to send mail (%s)", m_SMTPForwardList[curitem].Rcpt);
  1619. m_logFile.WriteLog(strLog);
  1620. // if (SendSmtpMail(curitem) == 0)
  1621. if (SendSmtpMailDirect(curitem) == 0)
  1622. {
  1623. DeleteFile(m_strExePath+"\"+m_SMTPForwardList[curitem].Fname);
  1624. strLog.Format("Successfull SMTP mail send (%s)", m_SMTPForwardList[curitem].Rcpt);
  1625. m_logFile.WriteLog(strLog);
  1626. ::EnterCriticalSection(&m_csSMTPForward);
  1627. m_SMTPForwardList.RemoveAt(curitem);
  1628. ::LeaveCriticalSection(&m_csSMTPForward);
  1629. break;
  1630. }
  1631. else
  1632. {
  1633. strLog.Format("Sending of SMTP mail (%s) failed the first time.", m_SMTPForwardList[curitem].Rcpt);
  1634. m_logFile.WriteLog(strLog);
  1635. ::EnterCriticalSection(&m_csSMTPForward);
  1636. time(&the_time);
  1637. m_SMTPForwardList[curitem].timestamp = the_time;
  1638. m_SMTPForwardList[curitem].error= 1;
  1639. m_SMTPForwardList[curitem].sendnr++;
  1640. ::LeaveCriticalSection(&m_csSMTPForward);
  1641. }
  1642. }
  1643. else
  1644. {
  1645. short nMaxTries;
  1646. m_pMailConfig->GetRelayMaxTries(&nMaxTries);
  1647. if (nMaxTries < m_SMTPForwardList[curitem].sendnr)
  1648. {
  1649. strLog.Format("Send mail (%s) not possible after maximum tries.",  m_SMTPForwardList[curitem].Rcpt);
  1650. m_logFile.WriteLog(strLog);
  1651. // SendErrorMail(curitem);
  1652. DeleteFile(m_strExePath+"\"+m_SMTPForwardList[curitem].Fname);
  1653. ::EnterCriticalSection(&m_csSMTPForward);
  1654. m_SMTPForwardList.RemoveAt(curitem);
  1655. ::LeaveCriticalSection(&m_csSMTPForward);
  1656. break;
  1657. }
  1658. time(&the_time);
  1659. short nTimeInterval;
  1660. m_pMailConfig->GetRelayTimeInterval(&nTimeInterval);
  1661. if (difftime(the_time, m_SMTPForwardList[curitem].timestamp) > nTimeInterval*60)
  1662. {
  1663. strLog.Format("Trying to send failed mail again (%s)", m_SMTPForwardList[curitem].Rcpt);
  1664. m_logFile.WriteLog(strLog);
  1665. m_SMTPForwardList[curitem].error = 0;
  1666. // if (SendSmtpMail(curitem) == 0)
  1667. if (SendSmtpMailDirect(curitem) == 0)
  1668. {
  1669. strLog.Format("Successfull SMTP mail send (%s)", m_SMTPForwardList[curitem].Rcpt);
  1670. m_logFile.WriteLog(strLog);
  1671. ::EnterCriticalSection(&m_csSMTPForward);
  1672. DeleteFile(m_strExePath+"\"+m_SMTPForwardList[curitem].Fname);
  1673. m_SMTPForwardList.RemoveAt(curitem);
  1674. ::LeaveCriticalSection(&m_csSMTPForward);
  1675. break;
  1676. }
  1677. else
  1678. {
  1679. time(&the_time);
  1680. m_SMTPForwardList[curitem].timestamp = the_time;
  1681. m_SMTPForwardList[curitem].error= 1;
  1682. m_SMTPForwardList[curitem].sendnr++;
  1683. strLog.Format("Could not send %s", m_SMTPForwardList[curitem].Rcpt);
  1684. m_logFile.WriteLog(strLog);
  1685. }
  1686. }
  1687. }
  1688. }
  1689. }
  1690. }
  1691. }
  1692. int SendSmtpMail(int litem) //relay
  1693. {
  1694. SOCKET         hServer;
  1695. char           szBuffer[4096];
  1696. SOCKADDR_IN    SockAddr;
  1697. // WSADATA        WSData;
  1698. LPHOSTENT      lpHostEntry;
  1699. int            iProtocolPort;
  1700. char           ServerName[255];
  1701. BSTR BstrRelaySmtpServer;
  1702. m_pMailConfig->GetRelayServerName(&BstrRelaySmtpServer);
  1703. bstr_t bstrRelaySmtpServer(BstrRelaySmtpServer, FALSE);
  1704. sprintf(ServerName,"%s",(char*)bstrRelaySmtpServer);
  1705. lpHostEntry = gethostbyname(ServerName);
  1706. if (lpHostEntry == NULL) 
  1707. {
  1708. // WSACleanup();
  1709. return 1;
  1710. }
  1711. hServer = socket( PF_INET, SOCK_STREAM, 0); 
  1712. if (hServer == INVALID_SOCKET) 
  1713. {
  1714. closesocket( hServer );
  1715. // WSACleanup();
  1716. return 1;
  1717. }
  1718. iProtocolPort = htons(25);
  1719. SockAddr.sin_family = AF_INET;
  1720. SockAddr.sin_port = iProtocolPort;
  1721. SockAddr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
  1722. int stimeout = 60000;
  1723. int rtimeout = 60000;
  1724. int err;
  1725. if (stimeout != 0) 
  1726. {
  1727. err = setsockopt(hServer ,      
  1728.  SOL_SOCKET,     
  1729.  SO_SNDTIMEO,
  1730.  (char *)&stimeout,  
  1731.  sizeof(stimeout) );
  1732. if (err != NO_ERROR) 
  1733. {
  1734. closesocket( hServer );
  1735. // WSACleanup();
  1736. return 1;
  1737. }
  1738. }
  1739. if (rtimeout != 0) 
  1740. {
  1741. err = setsockopt(hServer ,      
  1742.  SOL_SOCKET,     
  1743.  SO_RCVTIMEO,
  1744.  (char *)&rtimeout,  
  1745.  sizeof(rtimeout) );
  1746. if (err != NO_ERROR) 
  1747. {
  1748. closesocket( hServer );
  1749. // WSACleanup();
  1750. return 1;
  1751. }
  1752. }
  1753. if (connect( hServer, (PSOCKADDR) &SockAddr, sizeof(SockAddr)))
  1754. {
  1755. closesocket(hServer);
  1756. // WSACleanup();
  1757. return 1;
  1758. }
  1759. //AskError();
  1760. int cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
  1761. if (cnt == SOCKET_ERROR)
  1762. closesocket( hServer );
  1763. // WSACleanup();
  1764. return 1;
  1765. }
  1766. if (szBuffer[0] != '2') 
  1767. {
  1768. closesocket( hServer );
  1769. // WSACleanup();
  1770. return 1;
  1771. }
  1772. char sendstr[255];
  1773. BSTR BstrHostName;
  1774. m_pMailConfig->GetHostName(1, &BstrHostName);
  1775. bstr_t bstrHostName(BstrHostName, FALSE);
  1776. sprintf(sendstr,"HELO %srn",(char*)bstrHostName);
  1777. cnt = send( hServer, sendstr, strlen(sendstr), 0);
  1778. if (cnt == SOCKET_ERROR)
  1779. closesocket( hServer );
  1780. // WSACleanup();
  1781. return 1;
  1782. }
  1783. cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
  1784. if (cnt == SOCKET_ERROR)
  1785. closesocket( hServer );
  1786. // WSACleanup();
  1787. return 1;
  1788. }
  1789. if (szBuffer[0] != '2') 
  1790. {
  1791. closesocket( hServer );
  1792. // WSACleanup();
  1793. return 1;
  1794. }
  1795. sprintf(sendstr,"%s",m_SMTPForwardList[litem].Sender);
  1796. cnt = send( hServer, sendstr, strlen(sendstr), 0);
  1797. if (cnt == SOCKET_ERROR)
  1798. closesocket( hServer );
  1799. // WSACleanup();
  1800. return 1;
  1801. }
  1802. cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
  1803. if (cnt == SOCKET_ERROR)
  1804. closesocket( hServer );
  1805. // WSACleanup();
  1806. return 1;
  1807. }
  1808. if (szBuffer[0] != '2') 
  1809. {
  1810. closesocket( hServer );
  1811. // WSACleanup();
  1812. return 1;
  1813. }
  1814. sprintf(sendstr,"%srn", m_SMTPForwardList[litem].Rcpt);
  1815. cnt = send( hServer, sendstr, strlen(sendstr), 0);
  1816. if (cnt == SOCKET_ERROR)
  1817. closesocket( hServer );
  1818. // WSACleanup();
  1819. return 1;
  1820. }
  1821. cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
  1822. if (cnt == SOCKET_ERROR)
  1823. closesocket( hServer );
  1824. // WSACleanup();
  1825. return 1;
  1826. }
  1827. if (szBuffer[0] != '2') 
  1828. {
  1829. closesocket( hServer );
  1830. // WSACleanup();
  1831. return 1;
  1832. }
  1833. sprintf(sendstr,"DATArn");
  1834. cnt = send( hServer, sendstr, strlen(sendstr), 0);
  1835. if (cnt == SOCKET_ERROR)
  1836. closesocket( hServer );
  1837. // WSACleanup();
  1838. return 1;
  1839. }
  1840. cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
  1841. if (cnt == SOCKET_ERROR)
  1842. closesocket( hServer );
  1843. // WSACleanup();
  1844. return 1;
  1845. }
  1846. if (szBuffer[0] != '3')
  1847. {
  1848. closesocket( hServer );
  1849. // WSACleanup();
  1850. return 1;
  1851. }
  1852. FILE *fp = fopen(m_strExePath+"\"+m_SMTPForwardList[litem].Fname,"rb");
  1853. if (fp == NULL) 
  1854. {
  1855. closesocket( hServer );
  1856. // WSACleanup();
  1857. return 1;
  1858. }
  1859. char tempstr[255];
  1860. while(!feof(fp))
  1861. {
  1862. fgets(tempstr,255,fp);
  1863. tempstr[strlen(tempstr)-2] = 'n';
  1864. tempstr[strlen(tempstr)-1] = '';
  1865. if (!feof(fp))
  1866. {
  1867. cnt = send( hServer, tempstr, strlen(tempstr), 0);
  1868. if (cnt == SOCKET_ERROR)
  1869. fclose(fp);
  1870. closesocket( hServer );
  1871. // WSACleanup();
  1872. return 1;
  1873. }
  1874. }
  1875. }
  1876. fclose(fp);
  1877. cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
  1878. if (cnt == SOCKET_ERROR)
  1879. closesocket( hServer );
  1880. // WSACleanup();
  1881. return 1;
  1882. }
  1883. if (szBuffer[0] != '2')
  1884. {
  1885. closesocket( hServer );
  1886. // WSACleanup();
  1887. return 1;
  1888. }
  1889. sprintf(sendstr,"QUITrn");
  1890. cnt = send( hServer, sendstr, strlen(sendstr), 0);
  1891. if (cnt == SOCKET_ERROR)
  1892. closesocket( hServer );
  1893. // WSACleanup();
  1894. return 1;
  1895. }
  1896. cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
  1897. if (cnt == SOCKET_ERROR)
  1898. closesocket( hServer );
  1899. // WSACleanup();
  1900. return 1;
  1901. }
  1902. if (szBuffer[0] != '2') 
  1903. {
  1904. closesocket( hServer );
  1905. // WSACleanup();
  1906. return 1;
  1907. }
  1908. closesocket( hServer );
  1909. // WSACleanup();
  1910. return 0;
  1911. }
  1912. //向客户端发送Mail文件
  1913. void SendPop3Mail(SOCKET s, char* fileName)
  1914. //UINT SendPop3Mail(LPVOID pParam)
  1915. {
  1916. // _SendPop3Param* psock_file = (_SendPop3Param*)pParam;
  1917. // SOCKET s = psock_file->sock;
  1918. // char* fileName = psock_file->fname;
  1919. FILE *outmail;
  1920. char outstr[255];
  1921. int err = 0;
  1922. if( (outmail= fopen(m_strExePath+"\"+fileName, "rb" )) != NULL )
  1923. {
  1924. while (!feof(outmail))
  1925. {
  1926. fgets(outstr,254,outmail);
  1927. //outstr[strlen(outstr)-2] = 'n';
  1928. outstr[strlen(outstr)] = '';
  1929. if (!feof(outmail))
  1930. {
  1931. int nByte;
  1932. nByte = send (s, outstr,strlen(outstr),0);
  1933. if(nByte < 0)
  1934. {
  1935. err = GetLastError();
  1936. if(err == WSAEWOULDBLOCK)
  1937. {
  1938. while(err == WSAEWOULDBLOCK)
  1939. {
  1940. send (s, outstr,strlen(outstr),0);
  1941. err = GetLastError();
  1942. }
  1943. }
  1944. else
  1945. break;
  1946. }
  1947. }
  1948. }
  1949. fclose(outmail);
  1950. }
  1951. // return 0;
  1952. }
  1953. void DeleteCRLF(char *string)
  1954. {
  1955. if (string[strlen(string)-2] == 'n') string[strlen(string)-2] = '';
  1956. if (string[strlen(string)-2] == 'r') string[strlen(string)-2] = '';
  1957. if (string[strlen(string)-1] == 'n') string[strlen(string)-1] = '';
  1958. if (string[strlen(string)-1] == 'r') string[strlen(string)-1] = '';
  1959. }
  1960. void ProcessNewMail(CString CTL, CString Fname,CString Sender)
  1961. {
  1962. if (Fname == "") return;
  1963. CString strLog;
  1964. //在邮件中加入Message-ID
  1965. // AddMessageID(Fname);
  1966. short nCopyAllFlag;
  1967. BSTR BstrCopyDesUserID;
  1968. CString strCopyDesUserID;
  1969. m_pMailConfig->GetCopyAllMailConfig(&nCopyAllFlag, &BstrCopyDesUserID);
  1970. if(nCopyAllFlag == 1)
  1971. {
  1972. _bstr_t bstrCopyDesUserID(BstrCopyDesUserID, FALSE);
  1973. strCopyDesUserID = (char*)bstrCopyDesUserID;
  1974. //this one should may be a extra thread:
  1975. CopyFile(m_strExePath+"\mail\" + Fname, m_strExePath+"mail\" + strCopyDesUserID + "\"  + Fname,FALSE );
  1976. }
  1977. CString rcpt;
  1978. char srcpt[255];
  1979. char srcptip[255];
  1980. FILE *stream;
  1981. CString rcptFull;
  1982. char tempstr[255];
  1983. if( (stream  = fopen(m_strExePath+"\mail\" + CTL, "rt" )) != NULL )
  1984. {
  1985. m_logFile.WriteLog("Open Ctl Filen");
  1986. while (!feof(stream))
  1987. {
  1988. fgets(tempstr,255,stream);
  1989. if (!feof(stream))
  1990. {
  1991. if (tempstr[strlen(tempstr)-2] == 'n') tempstr[strlen(tempstr)-2] = '';
  1992. if (tempstr[strlen(tempstr)-2] == 'r') tempstr[strlen(tempstr)-2] = '';
  1993. rcptFull = tempstr;
  1994. int beginsign= -1;
  1995. int endsign= -1;
  1996. int atsign= -1;
  1997. for (UINT i = 0;i<= strlen(tempstr);i++)
  1998. {
  1999. if (tempstr[i] == '@') atsign = i;
  2000. if (tempstr[i] == '<') beginsign = i;
  2001. if (tempstr[i] == '>') endsign = i;
  2002. }
  2003. if ((beginsign==  -1) || (endsign==  -1) || (atsign==  -1))
  2004. {
  2005. char err[255];
  2006. sprintf(err,"wrong reciepment format: %s (mail\unknown\%s)",tempstr,Fname);
  2007. m_logFile.WriteLog((CString)err);
  2008. LogError(err);
  2009. CopyFile(m_strExePath+"\mail\" + Fname,m_strExePath+"\mail\unknown\"  + Fname,FALSE );
  2010. }
  2011. else
  2012. {
  2013. beginsign++;
  2014. for (int z = beginsign;z<=atsign;z++)
  2015. {
  2016. srcpt[z-beginsign] = tempstr[z];
  2017. }
  2018. srcpt[z-beginsign-1] = '';
  2019. atsign++;
  2020. for (z = atsign;z<=endsign;z++)
  2021. {
  2022. srcptip[z-atsign] = tempstr[z];
  2023. }
  2024. srcptip[z-atsign-1] = '';
  2025. rcpt = srcptip;
  2026. BOOL aka_ok = FALSE;
  2027. BOOL rcpt_ok = FALSE;
  2028. /*
  2029. for (int a = 0;a<= MyAkaList.GetSize()-1;a++)
  2030. {
  2031. if (strcmpi(MyAkaList[a].Text,rcpt) == 0) 
  2032. aka_ok = TRUE;
  2033. }
  2034. */
  2035. CString strRcpt;
  2036. strRcpt.Format("%s", rcpt);
  2037. short nHostCount;
  2038. BSTR BstrHostName;
  2039. CString strHostName;
  2040. m_pMailConfig->GetHostNameCount(&nHostCount);
  2041. for(int i=1; i<=nHostCount; i++) //index begins from 1
  2042. {
  2043. m_pMailConfig->GetHostName(i, &BstrHostName);
  2044. _bstr_t bstrHostName(BstrHostName, FALSE);
  2045. strHostName = (char*)bstrHostName;
  2046. if(strHostName == strRcpt)
  2047. {
  2048. aka_ok = TRUE;
  2049. break;
  2050. }
  2051. }
  2052. /*
  2053. for (a = 0;a<= MailUserList.GetSize()-1;a++)
  2054. {
  2055. if (strcmpi(MailUserList[a].Username,srcpt)== 0) 
  2056. rcpt_ok = TRUE;
  2057. }
  2058. */
  2059. BSTR BstrUserID, BstrPassword, BstrName;
  2060. CString strUserID, strPassword;
  2061. strUserID.Format("%s", srcpt);
  2062. BstrUserID = strUserID.AllocSysString();
  2063. m_pMailDB->FindUserByUserID(BstrUserID, &BstrPassword, &BstrName);
  2064. _bstr_t  bstrPassword(BstrPassword, FALSE);
  2065. strPassword = (char*)bstrPassword;
  2066. if(strPassword != "")
  2067. rcpt_ok = TRUE;
  2068. if ((aka_ok) && (rcpt_ok)) 
  2069. {
  2070. rcpt = srcpt;
  2071. //创建收件用户的文件夹
  2072. CString strFolder;
  2073. strFolder.Format("%s\mail\%s", m_strExePath, rcpt);
  2074. CreateDirectory((LPCTSTR)strFolder, NULL);
  2075. //mkdir(chfolder);
  2076. if (CopyFile(m_strExePath+"\mail\" + Fname,m_strExePath+"\mail\" + rcpt + "\" + Fname,FALSE ) == FALSE)
  2077. {
  2078. CopyFile(m_strExePath+"\mail\" + Fname,m_strExePath+"\mail\unknown\"  + Fname,FALSE );    
  2079. strLog.Format("Count not send %s", tempstr);
  2080. m_logFile.WriteLog(strLog);
  2081. LogError(strLog);
  2082. }
  2083. else
  2084. {
  2085. //发送UDP包,并将相关的信息写入数据库
  2086. CString strFileName, strRecver;
  2087. strFileName.Format("mail\%s\%s", rcpt, Fname);
  2088. strRecver.Format("%s", tempstr);
  2089. DealMailInfo(strFileName, Sender, strRecver);
  2090. strLog.Format("Mail Send To: %s", tempstr);
  2091. m_logFile.WriteLog(strLog);
  2092. }
  2093. }
  2094. else
  2095. {
  2096. //FORWARD Check
  2097. BOOL fwd =FALSE;
  2098. BOOL listmail = FALSE;
  2099. if (aka_ok == TRUE)
  2100. {
  2101. FILE *fwdfp;
  2102. fwdfp = fopen (m_strExePath+"\forward.ctl","rt");
  2103. if (fwdfp != NULL)
  2104. {
  2105. char fwdstr[255];
  2106. char fwdsrc[255];
  2107. char fwddest[255];
  2108. sprintf(fwdstr,"");
  2109. while (!feof(fwdfp))
  2110. {
  2111. sprintf(fwdstr,"");
  2112. fgets(fwdstr,255,fwdfp);
  2113. if (strlen(fwdstr) > 3)
  2114. {
  2115. if (fwdstr[strlen(fwdstr)-2] == 'n') fwdstr[strlen(fwdstr)-2] = '';
  2116. if (fwdstr[strlen(fwdstr)-2] == 'r') fwdstr[strlen(fwdstr)-2] = '';
  2117. sscanf(fwdstr,"%s %s",fwdsrc,fwddest);
  2118. rcpt = srcpt;
  2119. if (strcmpi(fwdsrc,rcpt) == 0)
  2120. {
  2121. fwd =TRUE;
  2122. //char mkd[255];
  2123. CString strmkd;
  2124. strmkd.Format("%s\mail\%s", m_strExePath, fwddest);
  2125. CreateDirectory((LPCTSTR)strmkd, NULL);
  2126. //sprintf(mkd,"mail\%s",fwddest);
  2127. //mkdir(mkd);
  2128. rcpt = fwddest;
  2129. if (CopyFile(m_strExePath+"\mail\" + Fname,m_strExePath+"\mail\" + rcpt + "\" + Fname,FALSE ) == FALSE)
  2130. {
  2131. char logstr[255];
  2132. sprintf(logstr,"Could not send mail (read error): %s (mail\unknown\%s)n",tempstr,Fname);
  2133. LogError(logstr);
  2134. CopyFile(m_strExePath+"\mail\" + Fname,m_strExePath+"\mail\unknown\"  + Fname,FALSE );    
  2135. strLog.Format("Could not send %s",tempstr);
  2136. m_logFile.WriteLog(strLog);
  2137. }
  2138. else
  2139. {
  2140. strLog.Format("Mail forward: %s->%s",fwdsrc,fwddest);
  2141. m_logFile.WriteLog(strLog);
  2142. }
  2143. }
  2144. }
  2145. }
  2146. fclose(fwdfp);
  2147. //end alias-check
  2148. }
  2149. else
  2150. {
  2151. m_logFile.WriteLog("Cant read forward.ctl! Mail marked as bad.");
  2152. }
  2153. //is the user a list?
  2154. char curname[255];
  2155. strlwr(srcpt);
  2156. HANDLE hFind;
  2157. WIN32_FIND_DATA findData = {0};
  2158. hFind = FindFirstFile (m_strExePath+"\lists\*.lst", &findData);
  2159. if (hFind != INVALID_HANDLE_VALUE)
  2160. {
  2161. do
  2162. {
  2163. if (findData.cFileName[0] != '.')
  2164. {
  2165. sprintf(curname,"%s",findData.cFileName);
  2166. strlwr(curname);
  2167. if ((curname[strlen(curname)-3] == 'l') &&
  2168. (curname[strlen(curname)-2] == 's') &&
  2169. (curname[strlen(curname)-1] == 't'))
  2170. {
  2171. curname[strlen(curname)-4] = '';
  2172. if (stricmp(srcpt,curname) == 0) //valid list
  2173. {
  2174. listmail = TRUE;
  2175. strLog.Format("New Mailinglist ( %s ) mail", curname);
  2176. m_logFile.WriteLog(strLog);
  2177. HANDLE hFind1;
  2178. WIN32_FIND_DATA findData1 = {0};
  2179. hFind1 = FindFirstFile (m_strExePath + "\mail\" + Fname, &findData1);
  2180. int mlsize = (findData1.nFileSizeHigh * MAXDWORD) + findData1.nFileSizeLow;
  2181. FindClose(hFind1);
  2182. FILE *fpf;
  2183. char listfname[255];
  2184. sprintf(listfname,"%s\lists\%s",m_strExePath,findData.cFileName);
  2185. fpf = fopen (listfname,"rt");
  2186. if (fpf == NULL) //this sucks
  2187. {
  2188. m_logFile.WriteLog("Couldn't read mailing list file");
  2189. }
  2190. else
  2191. {
  2192. int readstatus = 0;
  2193. int maxsize = 0;
  2194. char reply_to[255];
  2195. char xtdsender[255];
  2196. char subject_prefix[255];
  2197. char templine[255];
  2198. sprintf(reply_to,"");
  2199. sprintf(subject_prefix,"");
  2200. sprintf(xtdsender,"");
  2201. while (!feof(fpf))
  2202. {
  2203. fgets(templine,255,fpf);
  2204. if(!feof(fpf))
  2205. {
  2206. DeleteCRLF(templine);
  2207. if ((templine[0] != '#') || (templine[0] != '['))
  2208. {
  2209. if (readstatus == 1)
  2210. {
  2211. char seps[] = "=";
  2212. char *token;
  2213. token = strtok( templine, seps );
  2214. char lastoption[255];
  2215. int xpos = 0;
  2216. while( token != NULL )
  2217. {
  2218. if (xpos == 0)
  2219. {
  2220. sprintf(lastoption,"%s",token);
  2221. }
  2222. if (xpos == 1)
  2223. {
  2224. if (stricmp(lastoption,"reply_to") == 0)
  2225. {
  2226. sprintf(reply_to,"%s",token);
  2227. }
  2228. if (stricmp(lastoption,"maxlength") == 0)
  2229. {
  2230. maxsize = atoi(token);
  2231. }
  2232. if (stricmp(lastoption,"subject_prefix") == 0)
  2233. {
  2234. sprintf(subject_prefix,"%s",token);
  2235. }
  2236. if (stricmp(lastoption,"sender") == 0)
  2237. {
  2238. sprintf(xtdsender,"%s",token);
  2239. }
  2240. }
  2241. xpos++;
  2242. token = strtok( NULL, seps );
  2243. }
  2244. if (maxsize != 0)
  2245. {
  2246. if (mlsize >= maxsize)
  2247. {
  2248. m_logFile.WriteLog("Mail to large for mailing list");
  2249. break;
  2250. }
  2251. }
  2252. }
  2253. if (readstatus == 2)
  2254. {
  2255. //mkdir("spool");
  2256. CString strSpool;
  2257. strSpool.Format("%s\spool", m_strExePath);
  2258. CreateDirectory((LPCTSTR)strSpool, NULL);
  2259. SMTPForwardInfo fwdinf;
  2260. //we generate a new filename for each send
  2261. //so we can easely delete the file
  2262. CTime t = CTime::GetCurrentTime();
  2263. SYSTEMTIME stime;
  2264. GetSystemTime(&stime);
  2265. char fnamenew[255];
  2266. sprintf(fnamenew,"%i%02i%02i%02i%02i%02i%i.out",t.GetYear(),t.GetMonth(),t.GetDay(),t.GetHour(),t.GetMinute(),t.GetSecond(),stime.wMilliseconds);
  2267. fwdinf.Fname = "spool\" + (CString)fnamenew;
  2268. fwdinf.error= 0;
  2269. fwdinf.sendnr = 0;
  2270. fwdinf.Sender= "MAIL FROM: <" + (CString) xtdsender + ">rn";
  2271. fwdinf.Rcpt= "RCPT TO: <" + (CString)templine + ">";
  2272. time_t theTime;
  2273. time(&theTime);
  2274. fwdinf.timestamp = theTime;
  2275. fwdinf.islocal = true;
  2276. CopyFile(m_strExePath+"\mail\" + Fname,m_strExePath+"\"+fwdinf.Fname ,FALSE );
  2277. strLog.Format("Posting mailing-list mail to %s", templine);
  2278. m_logFile.WriteLog(strLog);
  2279. ::EnterCriticalSection(&m_csSMTPForward);
  2280. m_SMTPForwardList.Add(fwdinf); //have fun :)
  2281. ::LeaveCriticalSection(&m_csSMTPForward);
  2282. }
  2283. }
  2284. if (strcmp(templine,"[Setup]") == 0) readstatus = 1;
  2285. if (strcmp(templine,"[Users]") == 0)
  2286. {
  2287. readstatus = 2;
  2288. FILE *fpin = fopen(m_strExePath+"\mail\" + Fname,"rt");
  2289. CTime t = CTime::GetCurrentTime();
  2290. SYSTEMTIME stime;
  2291. GetSystemTime(&stime);
  2292. char tempfile[255];
  2293. sprintf(tempfile,"mail\%i%02i%02i%02i%02i%02i%i.in",t.GetYear(),t.GetMonth(),t.GetDay(),t.GetHour(),t.GetMinute(),t.GetSecond(),stime.wMilliseconds);
  2294. FILE *fpout = fopen(m_strExePath+"\"+tempfile,"wt");
  2295. BOOL insideheader = TRUE;
  2296. while(!feof(fpin))
  2297. {
  2298. fgets(templine,255,fpin);
  2299. if(!feof(fpin))
  2300. {
  2301. if (insideheader)
  2302. {
  2303. if ((templine[0] == 'S') && (templine[1] == 'u') && (templine[2] == 'b')
  2304. && (templine[3] == 'j') && (templine[4] == 'e') && (templine[5] == 'c')
  2305. && (templine[6] == 't') && (templine[7] == ':'))
  2306. {
  2307. //modify subject?
  2308. if (strlen(subject_prefix) != 0) 
  2309. {
  2310. //is our new subject already in the text?
  2311. if (strstr(templine,subject_prefix) == NULL)
  2312. {
  2313. //there isnt
  2314. for (UINT x = 9;x<= strlen(templine);x++)
  2315. {
  2316. templine[x-9] = templine[x];
  2317. }
  2318. fprintf(fpout,"Subject: %s %s",subject_prefix,templine);
  2319. sprintf(templine,"");
  2320. }
  2321. }
  2322. }
  2323. if ((templine[0] == 'S') && (templine[1] == 'e') && (templine[2] == 'n')
  2324. && (templine[3] == 'd') && (templine[4] == 'e') && (templine[5] == 'r')
  2325. && (templine[6] == ':') ) //sender already excist, use ours now
  2326. {
  2327. //if xtdsender is = 0 something is wrong or we already have it
  2328. if (strlen(xtdsender) != 0) 
  2329. {
  2330. fprintf(fpout,"Sender: %srn",xtdsender);
  2331. sprintf(xtdsender,"");
  2332. sprintf(templine,"");
  2333. }
  2334. }
  2335. if (stricmp(templine,"rn") == 0)
  2336. {
  2337. if (strlen(xtdsender) != 0) fprintf(fpout,"Sender: %srn",xtdsender);
  2338. if (strlen(reply_to) != 0) fprintf(fpout,"Reply-To: %srn",reply_to);
  2339. fprintf(fpout,"rn");
  2340. insideheader = FALSE;
  2341. }
  2342. else
  2343. {
  2344. fprintf(fpout,"%s",templine);
  2345. }
  2346. }
  2347. else
  2348. {
  2349. fprintf(fpout,"%s",templine);
  2350. }
  2351. }
  2352. }
  2353. fclose(fpin);
  2354. fclose(fpout);
  2355. CopyFile(m_strExePath+"\" + tempfile,m_strExePath+"\mail\" + Fname,FALSE );
  2356. DeleteFile(m_strExePath+"\"+tempfile);
  2357. }
  2358. }
  2359. }
  2360. fclose(fpf);
  2361. }
  2362. }
  2363. }
  2364. }
  2365. }   while (FindNextFile(hFind, &findData));
  2366. FindClose (hFind);
  2367. }
  2368. }
  2369. if ((fwd == FALSE) && (listmail == FALSE)) //dont know that user
  2370. {
  2371. //send to user who receives all unknown stuff
  2372. short nUnknownFlag;
  2373. BSTR BstrForwardUserID;
  2374. CString strForwardUserID;
  2375. m_pMailConfig->GetForwardUnknowMailUserConfig(&nUnknownFlag, &BstrForwardUserID);
  2376. if(nUnknownFlag == 1)
  2377. {
  2378. _bstr_t bstrForwardUserID(BstrForwardUserID, FALSE);
  2379. strForwardUserID = (char*)bstrForwardUserID;
  2380. //char mkd[255];
  2381. CString strmkd;
  2382. strmkd.Format("%s\mail\%s", m_strExePath, strForwardUserID);
  2383. CreateDirectory((LPCTSTR)strmkd, NULL);
  2384. //sprintf(mkd,"mail\%s",strForwardUserID);
  2385. //mkdir(mkd);
  2386. CopyFile(m_strExePath+"\mail\" + Fname,m_strExePath+"\mail\" + strForwardUserID +  "\"  + Fname,FALSE );    
  2387. }
  2388. //after that lets relay (if allowed)
  2389. BOOL islocal = FALSE;
  2390. if (aka_ok == FALSE)
  2391. {
  2392. char tempstra[255];
  2393. sprintf(tempstra,"%s",Sender);
  2394. int ps = 0;
  2395. for (UINT ci = 0;ci<strlen(tempstra);ci++)
  2396. {
  2397. if(tempstra[ci] == '@')
  2398. {
  2399. ps = ci;
  2400. }
  2401. }
  2402. for (UINT xi = ps;xi<strlen(tempstra);xi++)
  2403. {
  2404. tempstra[xi-ps] = tempstra[xi+1];
  2405. }
  2406. tempstra[xi-ps-4] = '';
  2407. strlwr(tempstra);
  2408. /* for (int bb = 0;bb<= MyAkaList.GetSize()-1;bb++)
  2409. {
  2410. if (strcmpi(MyAkaList[bb].Text,tempstra) == 0) 
  2411. {
  2412. islocal = TRUE;
  2413. }
  2414. }
  2415. */
  2416. CString str_tempstra;
  2417. str_tempstra.Format("%s", tempstra);
  2418. short nHostCount;
  2419. BSTR BstrHostName;
  2420. CString strHostName;
  2421. m_pMailConfig->GetHostNameCount(&nHostCount);
  2422. for(int i=1; i<=nHostCount; i++) //index begins from 1
  2423. {
  2424. m_pMailConfig->GetHostName(i, &BstrHostName);
  2425. _bstr_t bstrHostName(BstrHostName, FALSE);
  2426. strHostName = (char*)bstrHostName;
  2427. if(strHostName == str_tempstra)
  2428. {
  2429. islocal = TRUE;
  2430. break;
  2431. }
  2432. }
  2433. // char tempstr2[255];
  2434. // sprintf(tempstr2,"%s",GetReg("Software\InetServ","SMTPRelayCheckHost"));
  2435. BOOL sender_ok = TRUE;
  2436. /* //lets check if we must validate hosts
  2437. if (strcmp(tempstr2,"TRUE") == 0)
  2438. {
  2439. if (islocal == FALSE) sender_ok = FALSE;
  2440. }
  2441. */
  2442. if (sender_ok == TRUE)
  2443. {
  2444. //mkdir("spool");
  2445. CString str_spool;
  2446. str_spool.Format("%s\spool", m_strExePath);
  2447. CreateDirectory((LPCTSTR)str_spool, NULL);
  2448. SMTPForwardInfo fwdinf;
  2449. //we generate a new filename for each send
  2450. //so we can easely delete the file
  2451. CTime t = CTime::GetCurrentTime();
  2452. SYSTEMTIME stime;
  2453. GetSystemTime(&stime);
  2454. char fnamenew[255];
  2455. sprintf(fnamenew,"%i%02i%02i%02i%02i%02i%i.out",t.GetYear(),t.GetMonth(),t.GetDay(),t.GetHour(),t.GetMinute(),t.GetSecond(),stime.wMilliseconds);
  2456. fwdinf.Fname = "spool\" + (CString)fnamenew;
  2457. fwdinf.error= 0;
  2458. fwdinf.sendnr = 0;
  2459. fwdinf.Sender= Sender;
  2460. fwdinf.Rcpt= rcptFull;
  2461. //memset(fwdinf.RcptHostName,0x0,255);
  2462. strcpy(fwdinf.RcptHostName,strRcpt);
  2463. time_t theTime;
  2464. time(&theTime);
  2465. fwdinf.timestamp = theTime;
  2466. fwdinf.islocal = true;
  2467. CopyFile(m_strExePath+"\mail\" + Fname,m_strExePath+"\"+fwdinf.Fname ,FALSE );
  2468. m_logFile.WriteLog("Relaying mail...");
  2469. ::EnterCriticalSection(&m_csSMTPForward);
  2470. m_SMTPForwardList.Add(fwdinf); //have fun :)
  2471. ::LeaveCriticalSection(&m_csSMTPForward);
  2472. }
  2473. else
  2474. {
  2475. //user not known to me, mail dropped
  2476. m_logFile.WriteLog("Relay tried to use by non local user: " + Sender);
  2477. }
  2478. }
  2479. else
  2480. {
  2481. CopyFile(m_strExePath+"\mail\" + Fname,m_strExePath+"\mail\unknown\"  + Fname,FALSE );
  2482. char logstr[255];
  2483. sprintf(logstr,"User not local: %s (mail\unknown\%s)n",tempstr,Fname);
  2484. LogError(logstr);
  2485. strLog.Format("Could not send %s",tempstr);
  2486. m_logFile.WriteLog(strLog);
  2487. }
  2488. }
  2489. }
  2490. }
  2491. }
  2492. }
  2493. fclose(stream);
  2494. DeleteFile(m_strExePath+"\"+"mail\" + Fname);
  2495. DeleteFile(m_strExePath+"\"+"mail\" + CTL);
  2496.    }
  2497.    else
  2498.    {
  2499.    
  2500.    m_logFile.WriteLog("WARNING! Could not process NewMail"); //this is a hard error!
  2501.    }
  2502. }
  2503. void LogError (CString expr)//log to logfiles\error.txt
  2504. {
  2505. CTime t = CTime::GetCurrentTime();
  2506. FILE *x;
  2507. CString logcstr = expr + "rn";
  2508. CString strLogfiles;
  2509. //mkdir ("logfiles");
  2510. CString strLog;
  2511. strLogfiles.Format("%s\logfiles", m_strExePath, NULL);
  2512. CreateDirectory((LPCTSTR)strLogfiles, NULL);
  2513. if( (x = fopen(m_strExePath+"\logfiles\error.txt", "at" )) != NULL )
  2514. {
  2515. fprintf(x,"%02i:%02i:%02i: %s",t.GetHour(),t.GetMinute(),t.GetSecond(),logcstr);
  2516. fclose(x);
  2517. }
  2518. }
  2519. bool AddMessageID(CString strFileName)
  2520. {
  2521. BOOL bHasMsgID = FALSE;
  2522. int nLines = 0;
  2523. char chMessageID[255];
  2524. char chFile[255];
  2525. sprintf(chFile, "%s\mail\%s", m_strExePath, strFileName);
  2526. char filebuff[255], filebuff_temp[255];
  2527. FILE* fstream = fopen(chFile, "a+t");
  2528. if(fstream != NULL)
  2529. {
  2530. fseek(fstream, 0, SEEK_SET);
  2531. while(!feof(fstream))
  2532. {
  2533. fgets(filebuff, 255, fstream);
  2534. filebuff[strlen(filebuff)-2] = 'n';
  2535. filebuff[strlen(filebuff)-1] = '';
  2536. sprintf(filebuff_temp, "%s", filebuff);
  2537. strupr(filebuff_temp);
  2538. if(!feof(fstream))
  2539. {
  2540. nLines++;
  2541. if((nLines > 10)||(bHasMsgID == TRUE))
  2542. break;
  2543. if((filebuff_temp[0] == 'M')&&(filebuff_temp[1] == 'E')
  2544. &&(filebuff_temp[2] == 'S')&&(filebuff_temp[3] == 'S')
  2545. &&(filebuff_temp[4] == 'A')&&(filebuff_temp[5] == 'G')
  2546. &&(filebuff_temp[6] == 'E')&&(filebuff_temp[7] == '-')
  2547. &&(filebuff_temp[8] == 'I')&&(filebuff_temp[9] == 'D')
  2548. &&(filebuff_temp[10] == ' '))
  2549. {
  2550. bHasMsgID = TRUE;
  2551. break;
  2552. }
  2553. }
  2554. }
  2555. if(bHasMsgID == FALSE)
  2556. {
  2557. fclose(fstream);
  2558. char chFileNew[255];
  2559. sprintf(chFileNew, "%s\mail\%s_temp", m_strExePath, strFileName);
  2560. rename(chFile, chFileNew);
  2561. FILE* fs = fopen(chFile, "w+b");
  2562. if(fs != NULL)
  2563. {
  2564. //产生message-id
  2565. time_t tm;
  2566. time(&tm);
  2567. srand((unsigned)time(NULL));
  2568. sprintf(chMessageID, "Message-ID: <%d.%d.smartmailserver@m_office.com>rn", tm, rand());
  2569. //写入MessageID
  2570. fprintf(fs, "%s", chMessageID);
  2571. FILE* fs_old = fopen(chFileNew, "rb");
  2572. char file_content[255];
  2573. int rdcount=0;
  2574. if(fs_old != NULL)
  2575. {
  2576. while(!feof(fs_old))
  2577. {
  2578. rdcount = fread(file_content, sizeof(char), 255, fs_old);
  2579. fwrite(file_content, sizeof(char), rdcount, fs);
  2580. }
  2581. fclose(fs);
  2582. fclose(fs_old);
  2583. DeleteFile(chFileNew);
  2584. }
  2585. else
  2586. {
  2587. fclose(fs);
  2588. DeleteFile(chFile);
  2589. rename(chFileNew, chFile);
  2590. }
  2591. }
  2592. else
  2593. {
  2594. rename(chFileNew, chFile);
  2595. }
  2596. }
  2597. else
  2598. fclose(fstream);
  2599. }
  2600. return true;
  2601. }
  2602. bool DealMailInfo(CString strFileName, CString strSender, CString strRecver)
  2603. {
  2604. CString strLog;
  2605. char chFile[255];
  2606. sprintf(chFile, "%s\%s", m_strExePath, strFileName);
  2607. //发送UDP数据包,并将相关的接收信息写入数据库
  2608. HANDLE hFile = CreateFile(chFile, 
  2609.   GENERIC_READ,
  2610.   FILE_SHARE_READ,
  2611.   NULL,
  2612.   OPEN_EXISTING, 
  2613.   FILE_ATTRIBUTE_NORMAL, 
  2614.   NULL);
  2615. if(hFile == NULL)
  2616. {
  2617. strLog.Format("Open File %s failed while Send UDP Info", strFileName);
  2618. m_logFile.WriteLog(strLog);
  2619. return false;
  2620. }
  2621. DWORD dwSize = GetFileSize(hFile, NULL);
  2622. if(dwSize == -1)
  2623. {
  2624. strLog.Format("GetFileSize() failed, ErrorCode=%d", GetLastError());
  2625. CloseHandle(hFile);
  2626. return false;
  2627. }
  2628. CloseHandle(hFile);
  2629. CString strTime, strSubject;
  2630. char tempstr[255];
  2631. long lSize = (long)(dwSize*0.75);
  2632. char filebuff[255], filebuff_temp[255];
  2633. short sFlag=0;
  2634. FILE *fstream = fopen(chFile, "rt");
  2635. if(fstream != NULL)
  2636. {
  2637. while(!feof(fstream))
  2638. {
  2639. fgets(filebuff, 255, fstream);
  2640. //filebuff[strlen(filebuff)-2] = 'n';
  2641. filebuff[strlen(filebuff)-1] = '';
  2642. if(filebuff[0]=='')
  2643. break;
  2644. sprintf(filebuff_temp, "%s", filebuff);
  2645. strupr(filebuff_temp);
  2646. if(!feof(fstream))
  2647. {
  2648. //Date:
  2649. if((filebuff_temp[0] == 'D') && (filebuff_temp[1] == 'A') && (filebuff_temp[2] == 'T')
  2650. && (filebuff_temp[3] == 'E') && (filebuff_temp[4] == ':'))
  2651. {
  2652. for(int i=0; i<strlen(filebuff); i++)
  2653. tempstr[i] = filebuff[i+6];
  2654. strTime.Format("%s", tempstr);
  2655. strTime.TrimRight();
  2656. sFlag++;
  2657. continue;
  2658. }
  2659. //Subject
  2660. if((filebuff_temp[0] == 'S') && (filebuff_temp[1] == 'U') && (filebuff_temp[2] == 'B')
  2661. && (filebuff_temp[3] == 'J') && (filebuff_temp[4] == 'E') && (filebuff_temp[5] == 'C')
  2662. && (filebuff_temp[6] == 'T') && (filebuff_temp[7] == ':'))
  2663. {
  2664. sprintf(tempstr, "%s", &filebuff[9]);
  2665. strSubject.Format("%s", tempstr);
  2666. strSubject.TrimRight();
  2667. sFlag++;
  2668. continue;
  2669. }
  2670. }
  2671. }
  2672. fclose(fstream);
  2673. }
  2674. if(sFlag != 2)
  2675. return false;
  2676. int npos, nlen;
  2677. npos = strRecver.Find('<');
  2678. nlen = strRecver.GetLength();
  2679. strRecver = strRecver.Right(nlen - npos - 1);
  2680. npos = strRecver.Find('>');
  2681. strRecver = strRecver.Left(npos);
  2682. npos = strSender.Find('<');
  2683. nlen = strSender.GetLength();
  2684. strSender = strSender.Right(nlen - npos - 1);
  2685. npos = strSender.Find('>');
  2686. strSender = strSender.Left(npos);
  2687. _UDPPacketInfo data;
  2688. sprintf(data.recver, "%s", strRecver);
  2689. sprintf(data.sender, "%s", strSender);
  2690. sprintf(data.title, "%s", strSubject);
  2691. sprintf(data.time, "%s", strTime);
  2692. data.size = htonl(lSize);
  2693. if(!SendUDPData(data))
  2694. {
  2695. strLog.Format("Failed to Send UDP : Recver=%s, Sender=%s, Subject=%s, Date=%s, Size=%d",
  2696. strRecver, strSender, strSubject, strTime, lSize);
  2697. m_logFile.WriteLog(strLog);
  2698. }
  2699. else
  2700. {
  2701. strLog.Format("Succeed to Send UDP : Recver=%s, Sender=%s, Subject=%s, Date=%s, Size=%d",
  2702. strRecver, strSender, strSubject, strTime, lSize);
  2703. m_logFile.WriteLog(strLog);
  2704. }
  2705. if(!WriteMailInfoToDB(strSender, strRecver, strSubject, strTime, lSize))
  2706. {
  2707. strLog.Format("Failed to Insert RecvInfo to DB : Recver=%s, Sender=%s, Subject=%s, Date=%s, Size=%d",
  2708. strRecver, strSender, strSubject, strTime, lSize);
  2709. m_logFile.WriteLog(strLog);
  2710. }
  2711. else
  2712. {
  2713. strLog.Format("Succeed to Insert RecvInfo to DB : Recver=%s, Sender=%s, Subject=%s, Date=%s, Size=%d",
  2714. strRecver, strSender, strSubject, strTime, lSize);
  2715. m_logFile.WriteLog(strLog);
  2716. }
  2717. return true;
  2718. }
  2719. bool SendUDPData(_UDPPacketInfo udpData)
  2720. {
  2721. struct sockaddr_in udpadd;
  2722. memset(&udpadd, 0x0, sizeof(sockaddr_in));
  2723. udpadd.sin_family = AF_INET;
  2724. udpadd.sin_port = htons(m_nUDPPort);
  2725. udpadd.sin_addr.s_addr = inet_addr(m_strUDPIP);
  2726.     int nRet = sendto(m_UdpSocket, (char*)&udpData, sizeof(_UDPPacketInfo), 0, (struct sockaddr*)&udpadd, sizeof(udpadd));
  2727. if(nRet < 0)
  2728. return false;
  2729. return true;
  2730. }
  2731. bool WriteMailInfoToDB(CString strSender, CString strRecver, CString strTitle, CString strTime, long lSize)
  2732. {
  2733. if(m_pMailDB == NULL)
  2734. return false;
  2735. BSTR BstrSender, BstrRecver, BstrTitle, BstrTime;
  2736. BstrSender = strSender.AllocSysString();
  2737. BstrRecver = strRecver.AllocSysString();
  2738. BstrTitle = strTitle.AllocSysString();
  2739.     BstrTime = strTime.AllocSysString();
  2740. HRESULT hr;
  2741. hr = m_pMailDB->InsertRecvMailInfo(BstrTime, BstrTitle, BstrSender, BstrRecver, lSize);
  2742. if(FAILED(hr))
  2743. return false;
  2744. return true;
  2745. }
  2746. //直接发送到目的地,
  2747. int SendSmtpMailDirect(int litem) //relay
  2748. {
  2749. SOCKET         hServer;
  2750. char           szBuffer[4096];
  2751. SOCKADDR_IN    SockAddr;
  2752. // WSADATA        WSData;
  2753. LPHOSTENT      lpHostEntry;
  2754. int            iProtocolPort;
  2755. char           ServerName[255];
  2756. BSTR BstrDnsSmtpServer;
  2757. m_pMailConfig->GetDnsServerName(&BstrDnsSmtpServer);
  2758. bstr_t bstrDnsSmtpServer(BstrDnsSmtpServer, FALSE);
  2759. sprintf(ServerName,"%s",(char*)bstrDnsSmtpServer);
  2760. //加入获取Mx记录,把原来设置的转发服务器变为DNS服务器的设置
  2761. char* pchDestMachine;
  2762. pchDestMachine=GetMX(m_SMTPForwardList[litem].RcptHostName,ServerName,1);
  2763. CString strDestMachine=pchDestMachine;
  2764. if(strDestMachine.GetLength()<1)
  2765. {
  2766. return 1;
  2767. }
  2768. HeapFree(GetProcessHeap(),HEAP_NO_SERIALIZE,pchDestMachine);
  2769. strDestMachine=strDestMachine.Left(strDestMachine.Find(" "));
  2770. CString strLog;
  2771. strLog.Format("Relay To:%s",strDestMachine);
  2772. m_logFile.WriteLog(strLog);
  2773. int nPos=strDestMachine.Find("n");
  2774. if(nPos!=-1)
  2775. {
  2776. strDestMachine=strDestMachine.Left(strDestMachine.Find("n"));
  2777. }
  2778. lpHostEntry = gethostbyname(strDestMachine);
  2779. if (lpHostEntry == NULL) 
  2780. {
  2781. // WSACleanup();
  2782. strLog.Format("Error1");
  2783. m_logFile.WriteLog(strLog);
  2784. return 1;
  2785. }
  2786. hServer = socket( PF_INET, SOCK_STREAM, 0); 
  2787. if (hServer == INVALID_SOCKET) 
  2788. {
  2789. strLog.Format("Error2");
  2790. m_logFile.WriteLog(strLog);
  2791. closesocket( hServer );
  2792. // WSACleanup();
  2793. return 1;
  2794. }
  2795. iProtocolPort = htons(25);
  2796. SockAddr.sin_family = AF_INET;
  2797. SockAddr.sin_port = iProtocolPort;
  2798. SockAddr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
  2799. int stimeout = 60000;
  2800. int rtimeout = 60000;
  2801. int err;
  2802. if (stimeout != 0) 
  2803. {
  2804. err = setsockopt(hServer ,      
  2805.  SOL_SOCKET,     
  2806.  SO_SNDTIMEO,
  2807.  (char *)&stimeout,  
  2808.  sizeof(stimeout) );
  2809. if (err != NO_ERROR) 
  2810. {
  2811. strLog.Format("Error3");
  2812. m_logFile.WriteLog(strLog);
  2813. closesocket( hServer );
  2814. // WSACleanup();
  2815. return 1;
  2816. }
  2817. }
  2818. if (rtimeout != 0) 
  2819. {
  2820. err = setsockopt(hServer ,      
  2821.  SOL_SOCKET,     
  2822.  SO_RCVTIMEO,
  2823.  (char *)&rtimeout,  
  2824.  sizeof(rtimeout) );
  2825. if (err != NO_ERROR) 
  2826. {
  2827. strLog.Format("Error4");
  2828. m_logFile.WriteLog(strLog);
  2829. closesocket( hServer );
  2830. // WSACleanup();
  2831. return 1;
  2832. }
  2833. }
  2834. if (connect( hServer, (PSOCKADDR) &SockAddr, sizeof(SockAddr)))
  2835. {
  2836. strLog.Format("Error5");
  2837. m_logFile.WriteLog(strLog);
  2838. closesocket(hServer);
  2839. // WSACleanup();
  2840. return 1;
  2841. }
  2842. //AskError();
  2843. int cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
  2844. if (cnt == SOCKET_ERROR)
  2845. strLog.Format("Error6");
  2846. m_logFile.WriteLog(strLog);
  2847. closesocket( hServer );
  2848. // WSACleanup();
  2849. return 1;
  2850. }
  2851. if (szBuffer[0] != '2') 
  2852. {
  2853. strLog.Format("Error7");
  2854. m_logFile.WriteLog(strLog);
  2855. closesocket( hServer );
  2856. // WSACleanup();
  2857. return 1;
  2858. }
  2859. char sendstr[255];
  2860. BSTR BstrHostName;
  2861. m_pMailConfig->GetHostName(1, &BstrHostName);
  2862. bstr_t bstrHostName(BstrHostName, FALSE);
  2863. sprintf(sendstr,"HELO %srn",(char*)bstrHostName);
  2864. cnt = send( hServer, sendstr, strlen(sendstr), 0);
  2865. if (cnt == SOCKET_ERROR)
  2866. strLog.Format("Error8");
  2867. m_logFile.WriteLog(strLog);
  2868. closesocket( hServer );
  2869. // WSACleanup();
  2870. return 1;
  2871. }
  2872. cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
  2873. if (cnt == SOCKET_ERROR)
  2874. strLog.Format("Error9");
  2875. m_logFile.WriteLog(strLog);
  2876. closesocket( hServer );
  2877. // WSACleanup();
  2878. return 1;
  2879. }
  2880. if (szBuffer[0] != '2') 
  2881. {
  2882. closesocket( hServer );
  2883. // WSACleanup();
  2884. return 1;
  2885. }
  2886. sprintf(sendstr,"%s",m_SMTPForwardList[litem].Sender);
  2887. cnt = send( hServer, sendstr, strlen(sendstr), 0);
  2888. if (cnt == SOCKET_ERROR)
  2889. closesocket( hServer );
  2890. // WSACleanup();
  2891. return 1;
  2892. }
  2893. cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
  2894. if (cnt == SOCKET_ERROR)
  2895. closesocket( hServer );
  2896. // WSACleanup();
  2897. return 1;
  2898. }
  2899. if (szBuffer[0] != '2') 
  2900. {
  2901. closesocket( hServer );
  2902. // WSACleanup();
  2903. return 1;
  2904. }
  2905. sprintf(sendstr,"%srn", m_SMTPForwardList[litem].Rcpt);
  2906. cnt = send( hServer, sendstr, strlen(sendstr), 0);
  2907. if (cnt == SOCKET_ERROR)
  2908. closesocket( hServer );
  2909. // WSACleanup();
  2910. return 1;
  2911. }
  2912. cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
  2913. if (cnt == SOCKET_ERROR)
  2914. strLog.Format("Error12");
  2915. m_logFile.WriteLog(strLog);
  2916. closesocket( hServer );
  2917. // WSACleanup();
  2918. return 1;
  2919. }
  2920. if (szBuffer[0] != '2') 
  2921. {
  2922. strLog.Format("Error13");
  2923. m_logFile.WriteLog(strLog);
  2924. closesocket( hServer );
  2925. // WSACleanup();
  2926. return 1;
  2927. }
  2928. sprintf(sendstr,"DATArn");
  2929. cnt = send( hServer, sendstr, strlen(sendstr), 0);
  2930. if (cnt == SOCKET_ERROR)
  2931. closesocket( hServer );
  2932. // WSACleanup();
  2933. return 1;
  2934. }
  2935. cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
  2936. if (cnt == SOCKET_ERROR)
  2937. closesocket( hServer );
  2938. // WSACleanup();
  2939. return 1;
  2940. }
  2941. if (szBuffer[0] != '3')
  2942. {
  2943. closesocket( hServer );
  2944. // WSACleanup();
  2945. return 1;
  2946. }
  2947. FILE *fp = fopen(m_strExePath+"\"+m_SMTPForwardList[litem].Fname,"rb");
  2948. strLog.Format("Open file:%s",m_SMTPForwardList[litem].Fname);
  2949. m_logFile.WriteLog(strLog);
  2950. if (fp == NULL) 
  2951. {
  2952. closesocket( hServer );
  2953. // WSACleanup();
  2954. return 1;
  2955. }
  2956. char tempstr[255];
  2957. while(!feof(fp))
  2958. {
  2959. fgets(tempstr,255,fp);
  2960. //tempstr[strlen(tempstr)-2] = 'n';
  2961. tempstr[strlen(tempstr)] = '';
  2962. if (!feof(fp))
  2963. {
  2964. cnt = send( hServer, tempstr, strlen(tempstr), 0);
  2965. if (cnt == SOCKET_ERROR)
  2966. fclose(fp);
  2967. closesocket( hServer );
  2968. // WSACleanup();
  2969. return 1;
  2970. }
  2971. }
  2972. }
  2973. fclose(fp);
  2974. cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
  2975. if (cnt == SOCKET_ERROR)
  2976. closesocket( hServer );
  2977. // WSACleanup();
  2978. return 1;
  2979. }
  2980. if (szBuffer[0] != '2')
  2981. {
  2982. closesocket( hServer );
  2983. // WSACleanup();
  2984. return 1;
  2985. }
  2986. sprintf(sendstr,"QUITrn");
  2987. cnt = send( hServer, sendstr, strlen(sendstr), 0);
  2988. if (cnt == SOCKET_ERROR)
  2989. closesocket( hServer );
  2990. // WSACleanup();
  2991. return 1;
  2992. }
  2993. cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
  2994. if (cnt == SOCKET_ERROR)
  2995. closesocket( hServer );
  2996. // WSACleanup();
  2997. return 1;
  2998. }
  2999. if (szBuffer[0] != '2') 
  3000. {
  3001. closesocket( hServer );
  3002. // WSACleanup();
  3003. return 1;
  3004. }
  3005. closesocket( hServer );
  3006. // WSACleanup();
  3007. return 0;
  3008. }
  3009. BOOL IsLocalUser(const char* tempstr)
  3010. {
  3011. BOOL bRet;
  3012. CString rcpt;
  3013. char srcpt[255];
  3014. char srcptip[255];
  3015. CString rcptFull;
  3016. rcptFull=tempstr;
  3017. bRet=FALSE;
  3018. if (rcptFull.GetAt(rcptFull.GetLength()-2) == 'n') 
  3019. rcptFull.SetAt(rcptFull.GetLength()-2,'');
  3020. if (rcptFull.GetAt(rcptFull.GetLength()-2) == 'r') 
  3021. rcptFull.SetAt(rcptFull.GetLength()-2,'');
  3022. int beginsign= -1;
  3023. int endsign= -1;
  3024. int atsign= -1;
  3025. for (UINT i = 0;i<= strlen(rcptFull);i++)
  3026. {
  3027. if (rcptFull.GetAt(i) == '@') atsign = i;
  3028. if (rcptFull.GetAt(i) == '<') beginsign = i;
  3029. if (rcptFull.GetAt(i) == '>') endsign = i;
  3030. }
  3031. if ((beginsign==  -1) || (endsign==  -1) || (atsign==  -1))
  3032. {
  3033. bRet=FALSE;
  3034. }
  3035. else
  3036. {
  3037. beginsign++;
  3038. for (int z = beginsign;z<=atsign;z++)
  3039. {
  3040. srcpt[z-beginsign] = rcptFull[z];
  3041. }
  3042. srcpt[z-beginsign-1] = '';
  3043. atsign++;
  3044. for (z = atsign;z<=endsign;z++)
  3045. {
  3046. srcptip[z-atsign] = rcptFull[z];
  3047. }
  3048. srcptip[z-atsign-1] = '';
  3049. rcpt = srcptip;
  3050. BOOL aka_ok = FALSE;
  3051. CString strRcpt;
  3052. strRcpt.Format("%s", rcpt);
  3053. short nHostCount;
  3054. BSTR BstrHostName;
  3055. CString strHostName;
  3056. m_pMailConfig->GetHostNameCount(&nHostCount);
  3057. for(int i=1; i<=nHostCount; i++) //index begins from 1
  3058. {
  3059. m_pMailConfig->GetHostName(i, &BstrHostName);
  3060. _bstr_t bstrHostName(BstrHostName, FALSE);
  3061. strHostName = (char*)bstrHostName;
  3062. if(strHostName == strRcpt)
  3063. {
  3064. aka_ok = TRUE;
  3065. break;
  3066. }
  3067. }
  3068. if( aka_ok)
  3069. {
  3070. bRet=TRUE;
  3071. }
  3072. }
  3073. return bRet;
  3074. }