PopGet.cpp
上传用户:geanq888
上传日期:2007-01-03
资源大小:316k
文件大小:12k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. /*----------------------------------------------------------------------------------------------- 
  2. // PopGet.cpp : Defines the class behaviors for the application. 
  3. ---------------------------------------------------------------------------------------------------*/ 
  4. #include "stdafx.h" 
  5. //#include "TesToolbar.h"
  6. #include "Popget.h" 
  7. #ifdef _DEBUG 
  8. #define new DEBUG_NEW 
  9. #undef THIS_FILE 
  10. static char THIS_FILE[] = __FILE__; 
  11. #endif 
  12. #define templist "templist.pop" // <<file used for temp list command
  13. #define temptop  "temptop.pop" // <<file used for temp top command
  14. //////////////////////////////////////////////////////////////////// 
  15. // CPop Class 
  16. ////////////////////////////////////////////////////////////////////// 
  17. ////////////////////////////////////////////////////////////////////// 
  18. // Construction/Destruction 
  19. ////////////////////////////////////////////////////////////////////// 
  20. CPop::CPop() 
  21. if (!m_PopServer.Create()) MessageBox(NULL,"Cant create socket!","Warning",MB_OK);
  22. //{4EEC1C91-6BE1-11d1-8824-00001C302581} 
  23. CPop::~CPop() 
  24.  m_PopServer.Close(); 
  25. BOOL CPop::Connect(CString & Host, int Port, CString & User, CString & Password) 
  26.  char buf [512]; 
  27.  if (!m_PopServer.Connect(Host,Port)) // 110 Pop3 Port 
  28.  { 
  29.   m_ErrorMessage = _T("Server cannot be connected"); 
  30.   return FALSE; 
  31.  } 
  32.  else 
  33.  { 
  34.   if(CheckResponse(CONNECTION_CHECK)==FALSE) 
  35.    return FALSE; 
  36.   wsprintf (buf, "USER %srn", (LPCSTR) User); 
  37.   m_PopServer.Send(buf, strlen (buf)); 
  38.   if(CheckResponse(USER_CHECK)==FALSE) 
  39.    return FALSE; 
  40.   wsprintf (buf, "PASS %srn", (LPCSTR) Password); 
  41.   m_PopServer.Send(buf, strlen (buf)); 
  42.   if (CheckResponse(PASSWORD_CHECK)==FALSE) 
  43.    return FALSE; 
  44.   return TRUE; 
  45.  } 
  46. BOOL CPop::Delete(int MsgNumber) 
  47.  char buf [512]; 
  48.  wsprintf (buf, "DELE %drn",MsgNumber ); 
  49.  m_PopServer.Send(buf, strlen (buf)); 
  50.  if (CheckResponse(DELETE_CHECK)==FALSE) 
  51.   return FALSE; 
  52.  else 
  53.   return TRUE; 
  54. BOOL CPop::Disconnect() 
  55.  char buf [512]; 
  56.  wsprintf (buf, "QUIT rn"); 
  57.  m_PopServer.Send(buf, strlen (buf)); 
  58.  if (CheckResponse(QUIT_CHECK)==FALSE) 
  59.   return FALSE; 
  60.  else 
  61.  {
  62. m_PopServer.Close(); 
  63. return TRUE; 
  64.  }
  65. BOOL CPop::Noop() 
  66.  char buf [512]; 
  67.  wsprintf (buf, "NOOP  rn"); 
  68.  m_PopServer.Send(buf, strlen (buf)); 
  69.  if (CheckResponse(NOOP_CHECK)==FALSE) 
  70.   return FALSE; 
  71.  else 
  72.   return TRUE; 
  73. // Return the Msg Size for given msg number 
  74. int CPop::GetMessageSize(int MsgNumber) 
  75.  if(m_SizeOfMsg.GetSize() < MsgNumber+1) 
  76.   return 0; 
  77.  else 
  78.   return m_SizeOfMsg[MsgNumber+1]; 
  79. BOOL CPop::Reset() 
  80.  char buf [512]; 
  81.  wsprintf (buf, "RSET rn"); 
  82.  m_PopServer.Send(buf, strlen (buf)); 
  83.  if (CheckResponse(RSET_CHECK)==FALSE) 
  84.   return FALSE; 
  85.  else 
  86.   return TRUE; 
  87. // MsgContents will hold the msg body 
  88. BOOL CPop::Retrieve(int  MsgNumber) 
  89.  char buf [512]; 
  90.  m_todisk=FALSE;
  91.  wsprintf (buf, "RETR %drn",MsgNumber );
  92.  m_PopServer.Send(buf, strlen (buf)); 
  93.  if (CheckResponse(RETR_CHECK)==FALSE) 
  94.   return FALSE; 
  95.  else 
  96.   return TRUE; 
  97. BOOL CPop::Retrieve(int  MsgNumber,CString fname) 
  98.  char buf [512]; 
  99.  if (SetOutputFile(fname)) m_todisk=TRUE;
  100.  else
  101.  {
  102. m_ErrorMessage = _T("Error opening output file");
  103.  return FALSE;
  104.  }
  105.  wsprintf (buf, "RETR %drn",MsgNumber );
  106.  m_PopServer.Send(buf, strlen (buf)); 
  107.  if (CheckResponse(RETR_CHECK)==FALSE) 
  108.   return FALSE; 
  109.  else 
  110.   return TRUE; 
  111. BOOL CPop::Statistics() 
  112.  char buf [512]; 
  113.  wsprintf (buf, "STAT rn"); 
  114.  m_PopServer.Send(buf, strlen (buf)); 
  115.  if (CheckResponse(STAT_CHECK)==FALSE) 
  116.   return FALSE; 
  117.  else 
  118.   return TRUE; 
  119. CString CPop::GetMsgContents() 
  120.  return m_MsgContents; 
  121. int CPop::GetNumberOfMails() 
  122.  return m_NumberMail; 
  123. int CPop::GetTotalMailSize() 
  124.  return m_TotalSize; 
  125. BOOL CPop::Connect() 
  126.  return Connect(m_Host, m_port, m_User, m_Password); 
  127. void CPop::SetHost(CString Host) 
  128.  m_Host = Host; 
  129. CString CPop::GetHost() 
  130.  return m_Host; 
  131. void CPop::SetUser(CString User) 
  132.  m_User = User; 
  133. CString CPop::GetUser() 
  134.  return m_User; 
  135. void CPop::SetPassword(CString Password) 
  136.  m_Password = Password; 
  137. CString CPop::GetPassword() 
  138.  return m_Password; 
  139. BOOL CPop::CheckResponse(int ResponseType) 
  140.  char buf[8192]; 
  141.  int totr,skip;
  142.  BOOL ready;
  143.  for (int i=0;i<sizeof(buf);i++) 
  144.   buf[i]=''; 
  145.  Sleep(2000);
  146.  totr=m_PopServer.Receive(buf, sizeof(buf)); 
  147.   
  148.  switch (ResponseType) 
  149.  { 
  150.   case CONNECTION_CHECK: 
  151.    if (strnicmp(buf,"-ERR", 4) == 0) 
  152.    { 
  153.     m_ErrorMessage = _T("Bad Connection"); 
  154.     return FALSE; 
  155.    } 
  156.    break; 
  157.   case USER_CHECK: 
  158.    if (strnicmp(buf,"-ERR", 4) == 0) 
  159.    { 
  160.     m_ErrorMessage = _T("Bad User Name"); 
  161.     return FALSE; 
  162.    } 
  163.    break; 
  164.   case PASSWORD_CHECK: 
  165.    if (strnicmp(buf,"-ERR", 4) == 0) 
  166.    { 
  167.     m_ErrorMessage = _T("Bad Password Name"); 
  168.     return FALSE; 
  169.    } 
  170.    break; 
  171.   case QUIT_CHECK: 
  172.    if (strnicmp(buf,"-ERR", 4) == 0) 
  173.    { 
  174.     m_ErrorMessage = _T("Error occured during QUIT"); 
  175.     return FALSE; 
  176.    } 
  177.    break; 
  178.   case DELETE_CHECK: 
  179.    if (strnicmp(buf,"-ERR", 4) == 0) 
  180.    { 
  181.     m_ErrorMessage = _T("Error occured during DELE"); 
  182.     return FALSE; 
  183.    } 
  184.    break; 
  185.   case RSET_CHECK: 
  186.    if (strnicmp(buf,"-ERR", 4) == 0) 
  187.    { 
  188.     m_ErrorMessage = _T("Error occured during RSET"); 
  189.     return FALSE; 
  190.    } 
  191.    break; 
  192.   case STAT_CHECK: 
  193.    if (strnicmp(buf,"-ERR", 4) == 0) 
  194.    { 
  195.     m_ErrorMessage = _T("Error occured during STAT"); 
  196.     return FALSE; 
  197.    } 
  198.    else 
  199.    { 
  200.     BOOL EmailNumber = TRUE; 
  201.     for (char *p = buf; *p != ''; p++) 
  202.     { 
  203.      if (*p == 't' || *p == ' ') 
  204.      { 
  205.       if(EmailNumber == TRUE) 
  206.       { 
  207.        m_NumberMail = atoi(p); 
  208.        EmailNumber = FALSE; 
  209.       } 
  210.       else 
  211.       { 
  212.        m_TotalSize = atoi(p); 
  213.        return TRUE; 
  214.       } 
  215.      } 
  216.     } 
  217.    } 
  218.    break; 
  219.   case NOOP_CHECK: 
  220.    if (strnicmp(buf,"-ERR", 4) == 0) 
  221.    { 
  222.     m_ErrorMessage = _T("Error occured during NOOP"); 
  223.     return FALSE; 
  224.    } 
  225.    break; 
  226.   case LIST_CHECK: 
  227. if (strnicmp(buf,"-ERR", 4) == 0) 
  228.     m_ErrorMessage = _T("Error occured during LIST"); 
  229. return FALSE; 
  230. else 
  231. m_outputfile.Open(templist,CFile::modeCreate|CFile::modeWrite);
  232. if (m_outputfile==0)
  233. {
  234. //receive all rest data and return false;
  235. if ((totr!=0) && (totr==sizeof(buf))) totr=m_PopServer.Receive(buf, sizeof(buf));
  236. m_ErrorMessage = _T("Error creating temp input file!");
  237. return FALSE;
  238. }
  239.    ready=FALSE;
  240.    if (strnicmp(buf,"+OK rn", 6) == 0) skip=6;
  241.    else  skip=4; //skip +OK(SPACE)
  242.    while (!ready)
  243.    {
  244. if (totr==SOCKET_ERROR)
  245. {
  246. m_outputfile.Close();
  247. ready=TRUE;
  248. m_ErrorMessage = _T("Error reading from socket!");
  249. return FALSE;
  250. }
  251. else
  252. {
  253. m_outputfile.Write(buf+skip,totr-skip);
  254. skip=0;
  255. if (
  256. ((buf[totr-3]=='.')&&(buf[totr-2]=='r')&&(buf[totr-1]=='n')) ||
  257. (totr==0) ||
  258. ((buf[0]='O')&&(buf[1]=='K')&&(buf[totr-3]=='.')&&(buf[totr-2]=='r')&&(buf[totr-1]=='n'))
  259. )
  260. {
  261. ready=TRUE;
  262. m_outputfile.Close();
  263. }
  264. else
  265. {
  266. totr=m_PopServer.Receive(buf, sizeof(buf));
  267. }
  268. }
  269.    }
  270. return MakeMsgList();
  271.    }
  272.    break; 
  273.   case RETR_CHECK: 
  274.    if (strnicmp(buf,"-ERR", 4) == 0) 
  275.    { 
  276.     m_ErrorMessage = _T("Error occured during RETR"); 
  277. if (m_todisk) m_outputfile.Close();
  278.     return FALSE; 
  279.    } 
  280.    else 
  281.    { 
  282.    skip=0;
  283.    if (strnicmp(buf,"+OK", 3) == 0)
  284.    {
  285.    int ii=0;
  286.    while (buf[ii]!='R') ii++;
  287.    skip=ii;
  288.    }
  289. ready=FALSE;
  290.     while (!ready)
  291. {
  292. if (totr==SOCKET_ERROR)
  293. {
  294. if (m_todisk) m_outputfile.Close();
  295. ready=TRUE;
  296. m_ErrorMessage = _T("Error reading from socket!");
  297. return FALSE;
  298. }
  299. else
  300. {
  301. if (m_todisk) m_outputfile.Write(buf+skip,totr-skip);
  302. skip=0;
  303. if (
  304. ((buf[totr-3]=='.')&&(buf[totr-2]=='r')&&(buf[totr-1]=='n')) ||
  305. (totr==0)
  306. )
  307. {
  308. ready=TRUE;
  309. if (m_todisk) m_outputfile.Close();
  310. }
  311. else
  312. {
  313. totr=m_PopServer.Receive(buf, sizeof(buf)); 
  314. }
  315. }
  316. }
  317. if (!m_todisk) m_MsgContents = buf; 
  318.    } 
  319.    break; 
  320.   case TOP_CHECK: 
  321. m_outputfile.Open(temptop,CFile::modeCreate|CFile::modeWrite);
  322. if (m_outputfile==0)
  323. {
  324. //receive all rest data and return false;
  325. if ((totr!=0) && (totr==sizeof(buf))) totr=m_PopServer.Receive(buf, sizeof(buf));
  326. m_ErrorMessage = _T("Error creating temp input file!");
  327. return FALSE;
  328. }
  329.    ready=FALSE;
  330.    if (strnicmp(buf,"+OK rn", 6) == 0) skip=6;
  331.    else  skip=4; //skip +OK(SPACE)
  332.    while (!ready)
  333.    {
  334. if (totr==SOCKET_ERROR)
  335. {
  336. //receive all rest data and return false;
  337. if ((totr!=0) && (totr==sizeof(buf))) totr=m_PopServer.Receive(buf, sizeof(buf));
  338. m_outputfile.Close();
  339. ready=TRUE;
  340. m_ErrorMessage = _T("Error reading from socket!");
  341. return FALSE;
  342. }
  343. else
  344. {
  345. m_outputfile.Write(buf+skip,totr-skip);
  346. skip=0;
  347. if (
  348. ((buf[totr-3]=='.')&&(buf[totr-2]=='r')&&(buf[totr-1]=='n')) ||
  349. (totr==0)
  350. )
  351. {
  352. ready=TRUE;
  353. m_outputfile.Close();
  354. }
  355. else
  356. {
  357. totr=m_PopServer.Receive(buf, sizeof(buf));
  358. }
  359. }
  360.    }
  361.    if (ExtractTop(temptop))
  362.    {
  363. CFile::Remove(temptop);
  364. return TRUE;
  365.    }
  366.    else
  367.    {
  368. CFile::Remove(temptop);
  369. return FALSE;
  370.    }
  371.    break; 
  372.  } 
  373.  return TRUE; 
  374. CString CPop::GetErrorMessage() 
  375.  return m_ErrorMessage; 
  376. BOOL CPop::List() 
  377.  char buf [512]; 
  378.  wsprintf (buf, "LIST  rn"); 
  379.  m_PopServer.Send(buf, strlen (buf)); 
  380.  if (CheckResponse(LIST_CHECK)==FALSE) 
  381.   return FALSE; 
  382.  else 
  383.   return TRUE; 
  384. BOOL CPop::GetTop(int MsgNumber, int Length) 
  385.  char buf [512]; 
  386.  m_todisk=FALSE;
  387.  wsprintf (buf, "TOP %d %drn",MsgNumber,Length );
  388.  m_PopServer.Send(buf, strlen (buf)); 
  389.  if (CheckResponse(TOP_CHECK)==FALSE) 
  390.   return FALSE; 
  391.  else 
  392.   return TRUE; 
  393. void CPop::SetPort(int port)
  394. {
  395. m_port=port;
  396. }
  397. BOOL CPop::SetOutputFile(CString fname)
  398. {
  399. TRY
  400. {
  401. m_outputfile.Open(fname,CFile::modeCreate|CFile::modeWrite);
  402. return TRUE;
  403. }
  404. CATCH( CFileException, e )
  405. {
  406. MessageBox(NULL,"Error opening outputfile!","Error:",MB_OK);
  407. return FALSE;
  408. }
  409. END_CATCH
  410. }
  411. BOOL CPop::ExtractTop(CString fname)
  412. {
  413. CString tcstring;
  414. int pos;
  415. TRY{
  416. CStdioFile f(fname,CFile::modeRead);
  417. while (f.ReadString(tcstring))
  418. {
  419. tcstring.TrimLeft(); tcstring.TrimRight();
  420. if (tcstring.Find('r')!=-1) tcstring=tcstring.Left(tcstring.GetLength()-1);
  421. if (tcstring.Find('n')!=-1) tcstring=tcstring.Left(tcstring.GetLength()-1);
  422. tcstring.TrimLeft(); tcstring.TrimRight();
  423. if (pos=tcstring.Find("To:")==0) t_To=tcstring.Right(tcstring.GetLength()-sizeof("To:"));
  424. if (pos=tcstring.Find("From:")==0) t_From=tcstring.Right(tcstring.GetLength()-sizeof("From:"));
  425. if (pos=tcstring.Find("Subject:")==0) t_Subject=tcstring.Right(tcstring.GetLength()-sizeof("Subject:"));
  426. if (pos=tcstring.Find("Date:")==0) t_Date=tcstring.Right(tcstring.GetLength()-sizeof("Date:"));
  427. }
  428. f.Close();
  429. //if ((t_To=="")||(t_From=="")||(t_Date=="")) return FALSE;
  430. if (t_To == "") return FALSE;
  431. else return TRUE;
  432. }
  433. CATCH( CFileException, e ){
  434. m_ErrorMessage="cant open message file";
  435. return FALSE;
  436. }END_CATCH
  437. }
  438. BOOL CPop::MakeMsgList()
  439. {
  440. m_SizeOfMsg.RemoveAll();
  441. CString tcstring;
  442. int ii;
  443. TRY{
  444. CStdioFile f(templist,CFile::modeRead);
  445. while (f.ReadString(tcstring))
  446. {
  447. tcstring.TrimLeft(); tcstring.TrimRight();
  448. if (tcstring.Find('r')!=-1) tcstring=tcstring.Left(tcstring.GetLength()-1);
  449. if (tcstring.Find('n')!=-1) tcstring=tcstring.Left(tcstring.GetLength()-1);
  450. tcstring.TrimLeft(); tcstring.TrimRight();
  451. ii=tcstring.Find(' ');
  452. if (ii!=-1)
  453. {
  454. tcstring=tcstring.Mid(ii+1,tcstring.GetLength());
  455. m_SizeOfMsg.Add(atoi(tcstring));
  456. }
  457. }
  458. f.Close();
  459. CFile::Remove(templist);
  460. return TRUE;
  461. }
  462. CATCH( CFileException, e ){
  463. m_ErrorMessage="cant open templist file";
  464. CFile::Remove(templist);
  465. return FALSE;
  466. }END_CATCH
  467. }