POPClient.cs
上传用户:hncsjykj
上传日期:2022-08-09
资源大小:461k
文件大小:22k
源码类别:

Email客户端

开发平台:

C#

  1. /******************************************************************************
  2. Copyright 2003-2004 Hamid Qureshi and Unruled Boy 
  3. OpenPOP.Net is free software; you can redistribute it and/or modify
  4. it under the terms of the Lesser GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. OpenPOP.Net is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10. Lesser GNU General Public License for more details.
  11. You should have received a copy of the Lesser GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14. /*******************************************************************************/
  15. /*
  16. *Name: OpenPOP.POP3.POPClient
  17. *Function: POP Client
  18. *Author: Hamid Qureshi
  19. *Created: 2003/8
  20. *Modified: 2004/6/16 12:47 GMT+8 by Unruled Boy
  21. *Description:
  22. *Changes:
  23. * 2004/6/16 12:47 GMT+8 by Unruled Boy
  24. * 1.Added new high performance WaitForResponse function;
  25. * 2004/5/26 09:25 GMT+8 by Unruled Boy
  26. * 1.Fixed some parameter description errors and tidy up some codes
  27. * 2004/5/21 00:00 by dteviot via Unruled Boy
  28. * 1.Added support for the LIST command
  29. * 2.Heavily refactored replicated code
  30. * 2004/5/4 20:52 GMT+8 by Unruled Boy
  31. * 1.Renamed DeleteMessages to DeleteAllMessages
  32. * 2004/5/3 12:53 GMT+8 by Unruled Boy
  33. * 1.Adding ReceiveContentSleepInterval property
  34. * 2.Adding WaitForResponseInterval property
  35. * 2004/5/1 14:13 GMT+8 by Unruled Boy
  36. * 1.Adding descriptions to every public functions/property/void
  37. * 2.Now with 6 events!
  38. * 2004/4/23 21:07 GMT+8 by Unruled Boy
  39. * 1.Modifies the construction for new Message
  40. * 2.Tidy up the codes to follow Hungarian Notation
  41. * 2004/4/2 21:25 GMT+8 by Unruled Boy
  42. * 1.modifies the WaitForResponse
  43. * 2.added handling for PopServerLockException
  44. */
  45. using System;
  46. using System.Net.Sockets;
  47. using System.IO;
  48. using System.Threading;
  49. using System.Text;
  50. using System.Text.RegularExpressions;
  51. using System.Collections;
  52. namespace OpenPOP.POP3
  53. {
  54. /// <summary>
  55. /// POPClient
  56. /// </summary>
  57. public class POPClient
  58. {
  59. /// <summary>
  60. /// Event that fires when begin to connect with target POP3 server.
  61. /// </summary>
  62. public event EventHandler CommunicationBegan;
  63. /// <summary>
  64. /// Event that fires when connected with target POP3 server.
  65. /// </summary>
  66. public event EventHandler CommunicationOccured;
  67. /// <summary>
  68. /// Event that fires when disconnected with target POP3 server.
  69. /// </summary>
  70. public event EventHandler CommunicationLost;
  71. /// <summary>
  72. /// Event that fires when authentication began with target POP3 server.
  73. /// </summary>
  74. public event EventHandler AuthenticationBegan;
  75. /// <summary>
  76. /// Event that fires when authentication finished with target POP3 server.
  77. /// </summary>
  78. public event EventHandler AuthenticationFinished;
  79. /// <summary>
  80. /// Event that fires when message transfer has begun.
  81. /// </summary>
  82. public event EventHandler MessageTransferBegan;
  83. /// <summary>
  84. /// Event that fires when message transfer has finished.
  85. /// </summary>
  86. public event EventHandler MessageTransferFinished;
  87. internal void OnCommunicationBegan(EventArgs e)
  88. {
  89. if (CommunicationBegan != null)
  90. CommunicationBegan(this, e);
  91. }
  92. internal void OnCommunicationOccured(EventArgs e)
  93. {
  94. if (CommunicationOccured != null)
  95. CommunicationOccured(this, e);
  96. }
  97. internal void OnCommunicationLost(EventArgs e)
  98. {
  99. if (CommunicationLost != null)
  100. CommunicationLost(this, e);
  101. }
  102. internal void OnAuthenticationBegan(EventArgs e)
  103. {
  104. if (AuthenticationBegan != null)
  105. AuthenticationBegan(this, e);
  106. }
  107. internal void OnAuthenticationFinished(EventArgs e)
  108. {
  109. if (AuthenticationFinished != null)
  110. AuthenticationFinished(this, e);
  111. }
  112. internal void OnMessageTransferBegan(EventArgs e)
  113. {
  114. if (MessageTransferBegan != null)
  115. MessageTransferBegan(this, e);
  116. }
  117. internal void OnMessageTransferFinished(EventArgs e)
  118. {
  119. if (MessageTransferFinished != null)
  120. MessageTransferFinished(this, e);
  121. }
  122. private const string RESPONSE_OK="+OK";
  123. //private const string RESPONSE_ERR="-ERR";
  124. private TcpClient clientSocket=null;
  125. private StreamReader reader;
  126. private StreamWriter writer;
  127. private string _Error = "";
  128. private int _receiveTimeOut=60000;
  129. private int _sendTimeOut=60000;
  130. private int _receiveBufferSize=4090;
  131. private int _sendBufferSize=4090;
  132. private string _basePath=null;
  133. private bool _receiveFinish=false;
  134. private bool _autoDecodeMSTNEF=true;
  135. private int _waitForResponseInterval=200;
  136. private int _receiveContentSleepInterval=100;
  137. private string _aPOPTimestamp;
  138. private string _lastCommandResponse;
  139. private bool _connected=true;
  140. public bool Connected
  141. {
  142. get{return _connected;}
  143. }
  144. public string APOPTimestamp
  145. {
  146. get{return _aPOPTimestamp;}
  147. }
  148. /// <summary>
  149. /// receive content sleep interval
  150. /// </summary>
  151. public int ReceiveContentSleepInterval
  152. {
  153. get{return _receiveContentSleepInterval;}
  154. set{_receiveContentSleepInterval=value;}
  155. }
  156. /// <summary>
  157. /// wait for response interval
  158. /// </summary>
  159. public int WaitForResponseInterval
  160. {
  161. get{return _waitForResponseInterval;}
  162. set{_waitForResponseInterval=value;}
  163. }
  164. /// <summary>
  165. /// whether auto decoding MS-TNEF attachment files
  166. /// </summary>
  167. public bool AutoDecodeMSTNEF
  168. {
  169. get{return _autoDecodeMSTNEF;}
  170. set{_autoDecodeMSTNEF=value;}
  171. }
  172. /// <summary>
  173. /// path to extract MS-TNEF attachment files
  174. /// </summary>
  175. public string BasePath
  176. {
  177. get{return _basePath;}
  178. set
  179. {
  180. try
  181. {
  182. if(value.EndsWith("\"))
  183. _basePath=value;
  184. else
  185. _basePath=value+"\";
  186. }
  187. catch
  188. {
  189. }
  190. }
  191. }
  192. /// <summary>
  193. /// Receive timeout for the connection to the SMTP server in milliseconds.
  194. /// The default value is 60000 milliseconds.
  195. /// </summary>
  196. public int ReceiveTimeOut
  197. {
  198. get{return _receiveTimeOut;}
  199. set{_receiveTimeOut=value;}
  200. }
  201. /// <summary>
  202. /// Send timeout for the connection to the SMTP server in milliseconds.
  203. /// The default value is 60000 milliseconds.
  204. /// </summary>
  205. public int SendTimeOut
  206. {
  207. get{return _sendTimeOut;}
  208. set{_sendTimeOut=value;}
  209. }
  210. /// <summary>
  211. /// Receive buffer size
  212. /// </summary>
  213. public int ReceiveBufferSize
  214. {
  215. get{return _receiveBufferSize;}
  216. set{_receiveBufferSize=value;}
  217. }
  218. /// <summary>
  219. /// Send buffer size
  220. /// </summary>
  221. public int SendBufferSize
  222. {
  223. get{return _sendBufferSize;}
  224. set{_sendBufferSize=value;}
  225. }
  226. private void WaitForResponse(bool blnCondiction, int intInterval)
  227. {
  228. if(intInterval==0)
  229. intInterval=WaitForResponseInterval;
  230. while(!blnCondiction==true)
  231. {
  232. Thread.Sleep(intInterval);
  233. }
  234. }
  235. private void WaitForResponse(ref StreamReader rdReader, int intInterval)
  236. {
  237. if(intInterval==0)
  238. intInterval=WaitForResponseInterval;
  239. //while(rdReader.Peek()==-1 || !rdReader.BaseStream.CanRead)
  240. while(!rdReader.BaseStream.CanRead)
  241. {
  242. Thread.Sleep(intInterval);
  243. }
  244. }
  245. private void WaitForResponse(ref StreamReader rdReader)
  246. {
  247. DateTime dtStart=DateTime.Now;
  248. TimeSpan tsSpan;
  249. while(!rdReader.BaseStream.CanRead)
  250. {
  251. tsSpan=DateTime.Now.Subtract(dtStart);
  252. if(tsSpan.Milliseconds>_receiveTimeOut)
  253. break;
  254. Thread.Sleep(_waitForResponseInterval);
  255. }
  256. }
  257. private void WaitForResponse(ref StreamWriter wrWriter, int intInterval)
  258. {
  259. if(intInterval==0)
  260. intInterval=WaitForResponseInterval;
  261. while(!wrWriter.BaseStream.CanWrite)
  262. {
  263. Thread.Sleep(intInterval);
  264. }
  265. }
  266. /// <summary>
  267. /// Examines string to see if it contains a timestamp to use with the APOP command
  268. /// If it does, sets the ApopTimestamp property to this value
  269. /// </summary>
  270. /// <param name="strResponse">string to examine</param>
  271. private void ExtractApopTimestamp(string strResponse)
  272. {
  273. Match match = Regex.Match(strResponse, "<.+>");
  274. if (match.Success)
  275. {
  276. _aPOPTimestamp = match.Value;
  277. }
  278. }
  279. /// <summary>
  280. /// Tests a string to see if it's a "+OK" string
  281. /// </summary>
  282. /// <param name="strResponse">string to examine</param>
  283. /// <returns>true if response is an "+OK" string</returns>
  284. private bool IsOkResponse(string strResponse)
  285. {
  286. return (strResponse.Substring(0, 3) == RESPONSE_OK);
  287. }
  288. /// <summary>
  289. /// get response content
  290. /// </summary>
  291. /// <param name="strResponse">string to examine</param>
  292. /// <returns>response content</returns>
  293. private string GetResponseContent()
  294. {
  295. return _lastCommandResponse.Substring(3);
  296. }
  297. /// <summary>
  298. /// Sends a command to the POP server.
  299. /// </summary>
  300. /// <param name="strCommand">command to send to server</param>
  301. /// <param name="blnSilent">Do not give error</param>
  302. /// <returns>true if server responded "+OK"</returns>
  303. private bool SendCommand(string strCommand, bool blnSilent)
  304. {
  305. _lastCommandResponse = "";
  306. try
  307. {
  308. if(writer.BaseStream.CanWrite)
  309. {
  310. writer.WriteLine(strCommand);
  311. writer.Flush();
  312. //WaitForResponse(ref reader,WaitForResponseInterval);
  313. WaitForResponse(ref reader);
  314. _lastCommandResponse = reader.ReadLine();
  315. return IsOkResponse(_lastCommandResponse);
  316. }
  317. else
  318. return false;
  319. }
  320. catch(Exception e)
  321. {
  322. if(!blnSilent)
  323. {
  324. _Error = strCommand + ":" +e.Message;
  325. Utility.LogError(_Error);
  326. }
  327. return false;
  328. }
  329. }
  330. /// <summary>
  331. /// Sends a command to the POP server.
  332. /// </summary>
  333. /// <param name="strCommand">command to send to server</param>
  334. /// <returns>true if server responded "+OK"</returns>
  335. private bool SendCommand(string strCommand)
  336. {
  337. return SendCommand(strCommand,false);
  338. }
  339. /// <summary>
  340. /// Sends a command to the POP server, expects an integer reply in the response
  341. /// </summary>
  342. /// <param name="strCommand">command to send to server</param>
  343. /// <returns>integer value in the reply</returns>
  344. private int SendCommandIntResponse(string strCommand)
  345. {
  346. int retVal = 0;
  347. if(SendCommand(strCommand))
  348. {
  349. try
  350. {
  351. retVal = int.Parse(_lastCommandResponse.Split(' ')[1]);
  352. }
  353. catch(Exception e)
  354. {
  355. Utility.LogError(strCommand + ":" + e.Message);
  356. }
  357. }
  358. return retVal;
  359. }
  360. /// <summary>
  361. /// Construct new POPClient
  362. /// </summary>
  363. public POPClient()
  364. {
  365. Utility.Log=false;
  366. }
  367. /// <summary>
  368. /// Construct new POPClient
  369. /// </summary>
  370. public POPClient(string strHost,int intPort,string strlogin,string strPassword,AuthenticationMethod authenticationMethod)
  371. {
  372. Connect(strHost, intPort);
  373. Authenticate(strlogin,strPassword,authenticationMethod);
  374. }
  375. /// <summary>
  376. /// connect to remote server
  377. /// </summary>
  378. /// <param name="strHost">POP3 host</param>
  379. /// <param name="intPort">POP3 port</param>
  380. public void Connect(string strHost,int intPort)
  381. {
  382. OnCommunicationBegan(EventArgs.Empty);
  383. clientSocket=new TcpClient();
  384. clientSocket.ReceiveTimeout=_receiveTimeOut;
  385. clientSocket.SendTimeout=_sendTimeOut;
  386. clientSocket.ReceiveBufferSize=_receiveBufferSize;
  387. clientSocket.SendBufferSize=_sendBufferSize;
  388. try
  389. {
  390. clientSocket.Connect(strHost,intPort);
  391. }
  392. catch(SocketException e)
  393. {
  394. Disconnect();
  395. Utility.LogError("Connect():"+e.Message);
  396. throw new PopServerNotFoundException();
  397. }
  398. reader=new StreamReader(clientSocket.GetStream(),Encoding.Default,true);
  399. writer=new StreamWriter(clientSocket.GetStream());
  400. writer.AutoFlush=true;
  401. WaitForResponse(ref reader,WaitForResponseInterval);
  402. string strResponse=reader.ReadLine();
  403. if(IsOkResponse(strResponse))
  404. {
  405. ExtractApopTimestamp(strResponse);
  406. _connected=true;
  407. OnCommunicationOccured(EventArgs.Empty);
  408. }
  409. else
  410. {
  411. Disconnect();
  412. Utility.LogError("Connect():"+"Error when login, maybe POP3 server not exist");
  413. throw new PopServerNotAvailableException();
  414. }
  415. }
  416. /// <summary>
  417. /// Disconnect from POP3 server
  418. /// </summary>
  419. public void Disconnect()
  420. {
  421. try
  422. {
  423. clientSocket.ReceiveTimeout=500;
  424. clientSocket.SendTimeout=500;
  425. SendCommand("QUIT",true);
  426. clientSocket.ReceiveTimeout=_receiveTimeOut;
  427. clientSocket.SendTimeout=_sendTimeOut;
  428. reader.Close();
  429. writer.Close();
  430. clientSocket.GetStream().Close();
  431. clientSocket.Close();
  432. }
  433. catch
  434. {
  435. //Utility.LogError("Disconnect():"+e.Message);
  436. }
  437. finally
  438. {
  439. reader=null;
  440. writer=null;
  441. clientSocket=null;
  442. }
  443. OnCommunicationLost(EventArgs.Empty);
  444. }
  445. /// <summary>
  446. /// release me
  447. /// </summary>
  448. ~POPClient()
  449. {
  450. Disconnect();
  451. }
  452. /// <summary>
  453. /// verify user and password
  454. /// </summary>
  455. /// <param name="strlogin">user name</param>
  456. /// <param name="strPassword">password</param>
  457. public void Authenticate(string strlogin,string strPassword)
  458. {
  459. Authenticate(strlogin,strPassword,AuthenticationMethod.USERPASS);
  460. }
  461. /// <summary>
  462. /// verify user and password
  463. /// </summary>
  464. /// <param name="strlogin">user name</param>
  465. /// <param name="strPassword">strPassword</param>
  466. /// <param name="authenticationMethod">verification mode</param>
  467. public void Authenticate(string strlogin,string strPassword,AuthenticationMethod authenticationMethod)
  468. {
  469. if(authenticationMethod==AuthenticationMethod.USERPASS)
  470. {
  471. AuthenticateUsingUSER(strlogin,strPassword);
  472. }
  473. else if(authenticationMethod==AuthenticationMethod.APOP)
  474. {
  475. AuthenticateUsingAPOP(strlogin,strPassword);
  476. }
  477. else if(authenticationMethod==AuthenticationMethod.TRYBOTH)
  478. {
  479. try
  480. {
  481. AuthenticateUsingUSER(strlogin,strPassword);
  482. }
  483. catch(InvalidLoginException e)
  484. {
  485. Utility.LogError("Authenticate():"+e.Message);
  486. }
  487. catch(InvalidPasswordException e)
  488. {
  489. Utility.LogError("Authenticate():"+e.Message);
  490. }
  491. catch(Exception e)
  492. {
  493. Utility.LogError("Authenticate():"+e.Message);
  494. AuthenticateUsingAPOP(strlogin,strPassword);
  495. }
  496. }
  497. }
  498. /// <summary>
  499. /// verify user and password
  500. /// </summary>
  501. /// <param name="strlogin">user name</param>
  502. /// <param name="strPassword">password</param>
  503. private void AuthenticateUsingUSER(string strlogin,string strPassword)
  504. {
  505. OnAuthenticationBegan(EventArgs.Empty);
  506. if(!SendCommand("USER " + strlogin))
  507. {
  508. Utility.LogError("AuthenticateUsingUSER():wrong user");
  509. throw new InvalidLoginException();
  510. }
  511. WaitForResponse(ref writer,WaitForResponseInterval);
  512. if(!SendCommand("PASS " + strPassword))
  513. {
  514. if(_lastCommandResponse.ToLower().IndexOf("lock")!=-1)
  515. {
  516. Utility.LogError("AuthenticateUsingUSER():maildrop is locked");
  517. throw new PopServerLockException();
  518. }
  519. else
  520. {
  521. Utility.LogError("AuthenticateUsingUSER():wrong password or " + GetResponseContent());
  522. throw new InvalidPasswordException();
  523. }
  524. }
  525.             MyMD5.SetMd5(strlogin, strPassword);
  526. OnAuthenticationFinished(EventArgs.Empty);
  527. }
  528. /// <summary>
  529. /// verify user and password using APOP
  530. /// </summary>
  531. /// <param name="strlogin">user name</param>
  532. /// <param name="strPassword">password</param>
  533. private void AuthenticateUsingAPOP(string strlogin,string strPassword)
  534. {
  535. OnAuthenticationBegan(EventArgs.Empty);
  536. if(!SendCommand("APOP " + strlogin + " " + MyMD5.GetMD5HashHex(strPassword)))
  537. {
  538. Utility.LogError("AuthenticateUsingAPOP():wrong user or password");
  539. throw new InvalidLoginOrPasswordException();
  540. }
  541.             MyMD5.SetMd5(strlogin, strPassword);
  542. OnAuthenticationFinished(EventArgs.Empty);
  543. }
  544. /* private string GetCommand(string input)
  545. {
  546. try
  547. {
  548. return input.Split(' ')[0];
  549. }
  550. catch(Exception e)
  551. {
  552. Utility.LogError("GetCommand():"+e.Message);
  553. return "";
  554. }
  555. }*/
  556. private string[] GetParameters(string input)
  557. {
  558. string []temp=input.Split(' ');
  559. string []retStringArray=new string[temp.Length-1];
  560. Array.Copy(temp,1,retStringArray,0,temp.Length-1);
  561. return retStringArray;
  562. }
  563. /// <summary>
  564. /// get message count
  565. /// </summary>
  566. /// <returns>message count</returns>
  567. public int GetMessageCount()
  568. {
  569. return SendCommandIntResponse("STAT");
  570. }
  571. /// <summary>
  572. /// Deletes message with given index when Close() is called
  573. /// </summary>
  574. /// <param name="intMessageIndex"> </param>
  575. public bool DeleteMessage(int intMessageIndex) 
  576. {
  577. return SendCommand("DELE " + intMessageIndex.ToString());
  578. }
  579. /// <summary>
  580. /// Deletes messages
  581. /// </summary>
  582. public bool DeleteAllMessages() 
  583. {
  584. int messageCount=GetMessageCount();
  585. for(int messageItem=messageCount;messageItem>0;messageItem--)
  586. {
  587. if (!DeleteMessage(messageItem))
  588. return false;
  589. }
  590. return true;
  591. }
  592. /// <summary>
  593. /// quit POP3 server
  594. /// </summary>
  595. public bool QUIT()
  596. {
  597. return SendCommand("QUIT");
  598. }
  599. /// <summary>
  600. /// keep server active
  601. /// </summary>
  602. public bool NOOP()
  603. {
  604. return SendCommand("NOOP");
  605. }
  606. /// <summary>
  607. /// keep server active
  608. /// </summary>
  609. public bool RSET()
  610. {
  611. return SendCommand("RSET");
  612. }
  613. /// <summary>
  614. /// identify user
  615. /// </summary>
  616. public bool USER()
  617. {
  618. return SendCommand("USER");
  619. }
  620. /// <summary>
  621. /// get messages info
  622. /// </summary>
  623. /// <param name="intMessageNumber">message number</param>
  624. /// <returns>Message object</returns>
  625. public MIMEParser.Message GetMessageHeader(int intMessageNumber)
  626. {
  627. OnMessageTransferBegan(EventArgs.Empty);
  628. MIMEParser.Message msg=FetchMessage("TOP "+intMessageNumber.ToString()+" 0", true);
  629. OnMessageTransferFinished(EventArgs.Empty);
  630. return msg;
  631. }
  632. /// <summary>
  633. /// get message uid
  634. /// </summary>
  635. /// <param name="intMessageNumber">message number</param>
  636. public string GetMessageUID(int intMessageNumber)
  637. {
  638. string[] strValues=null;
  639. if(SendCommand("UIDL " + intMessageNumber.ToString()))
  640. {
  641. strValues = GetParameters(_lastCommandResponse);
  642. }
  643. return strValues[1];
  644. }
  645. /// <summary>
  646. /// get message uids
  647. /// </summary>
  648. public ArrayList GetMessageUIDs()
  649. {
  650. ArrayList uids=new ArrayList();
  651. if(SendCommand("UIDL"))
  652. {
  653. string strResponse=reader.ReadLine();
  654. while (strResponse!=".")
  655. {
  656. uids.Add(strResponse.Split(' ')[1]);
  657. strResponse=reader.ReadLine();
  658. }
  659. return uids;
  660. }
  661. else
  662. {
  663. return null;
  664. }
  665. }
  666. /// <summary>
  667. /// Get the sizes of all the messages
  668. /// CAUTION:  Assumes no messages have been deleted
  669. /// </summary>
  670. /// <returns>Size of each message</returns>
  671. public ArrayList LIST()
  672. {
  673. ArrayList sizes=new ArrayList();
  674. if(SendCommand("LIST"))
  675. {
  676. string strResponse=reader.ReadLine();
  677. while (strResponse!=".")
  678. {
  679. sizes.Add(int.Parse(strResponse.Split(' ')[1]));
  680. strResponse=reader.ReadLine();
  681. }
  682. return sizes;
  683. }
  684. else
  685. {
  686. return null;
  687. }
  688. }
  689. /// <summary>
  690. /// get the size of a message
  691. /// </summary>
  692. /// <param name="intMessageNumber">message number</param>
  693. /// <returns>Size of message</returns>
  694. public int LIST(int intMessageNumber)
  695. {
  696. return SendCommandIntResponse("LIST " + intMessageNumber.ToString());
  697. }
  698. /// <summary>
  699. /// read stream content
  700. /// </summary>
  701. /// <param name="intContentLength">length of content to read</param>
  702. /// <returns>content</returns>
  703. private string ReceiveContent(int intContentLength)
  704. {
  705. string strResponse=null;
  706. StringBuilder builder = new StringBuilder();
  707. WaitForResponse(ref reader,WaitForResponseInterval);
  708. strResponse = reader.ReadLine();
  709. int intLines=0;
  710. int intLen=0;
  711. while (strResponse!=".")// || (intLen<intContentLength)) //(strResponse.IndexOf(".")==0 && intLen<intContentLength)
  712. {
  713. builder.Append(strResponse + "rn");
  714. intLines+=1;
  715. intLen+=strResponse.Length+"rn".Length;
  716. WaitForResponse(ref reader,1);
  717. strResponse = reader.ReadLine();
  718. if((intLines % _receiveContentSleepInterval)==0) //make an interval pause to ensure response from server
  719. Thread.Sleep(1);
  720. }
  721.             
  722.            // Utility.LogError(builder.ToString());
  723. builder.Append(strResponse+"rn");
  724. return builder.ToString();
  725. }
  726. /// <summary>
  727. /// get message info
  728. /// </summary>
  729. /// <param name="number">message number on server</param>
  730. /// <returns>Message object</returns>
  731. public MIMEParser.Message GetMessage(int intNumber, bool blnOnlyHeader)
  732. {
  733. OnMessageTransferBegan(EventArgs.Empty);
  734. MIMEParser.Message msg=FetchMessage("RETR " + intNumber.ToString(), blnOnlyHeader);
  735. OnMessageTransferFinished(EventArgs.Empty);
  736. return msg;
  737. }
  738. /// <summary>
  739. /// fetches a message or a message header
  740. /// </summary>
  741. /// <param name="strCommand">Command to send to Pop server</param>
  742. /// <param name="blnOnlyHeader">Only return message header?</param>
  743. /// <returns>Message object</returns>
  744. public MIMEParser.Message FetchMessage(string strCommand, bool blnOnlyHeader)
  745. {
  746. _receiveFinish=false;
  747. if(!SendCommand(strCommand))
  748. return null;
  749. try
  750. {
  751. string receivedContent=ReceiveContent(-1);
  752. MIMEParser.Message msg=new MIMEParser.Message(ref _receiveFinish,_basePath,_autoDecodeMSTNEF,receivedContent,blnOnlyHeader);
  753. WaitForResponse(_receiveFinish,WaitForResponseInterval);
  754. return msg;
  755. }
  756. catch(Exception e)
  757. {
  758. Utility.LogError("FetchMessage():"+e.Message);
  759. return null;
  760. }
  761. }
  762. }
  763. }