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

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.Utility
  17. *Function: Utility
  18. *Author: Hamid Qureshi
  19. *Created: 2003/8
  20. *Modified: 2004/5/31 14:22 GMT+8 by Unruled Boy
  21. *Description:
  22. *Changes:
  23. * 2004/5/31 14:22 GMT+8 by Unruled Boy
  24. * 1.Fixed a bug in decoding Base64 text when using non-standard encoding
  25. * 2004/5/30 15:04 GMT+8 by Unruled Boy
  26. * 1.Added all description to all functions
  27. * 2004/5/25 13:55 GMT+8 by Unruled Boy
  28. * 1.Rewrote the DecodeText function using Regular Expression
  29. * 2004/5/17 14:20 GMT+8 by Unruled Boy
  30. * 1.Added ParseFileName
  31. * 2004/4/29 19:05 GMT+8 by Unruled Boy
  32. * 1.Adding ReadPlainTextFromFile function
  33. * 2004/4/28 19:06 GMT+8 by Unruled Boy
  34. * 1.Rewriting the Decode method
  35. * 2004/3/29 12:25 GMT+8 by Unruled Boy
  36. * 1.GetMimeType support for MONO
  37. * 2.cleaning up the names of variants
  38. */
  39. using System;
  40. using System.Text;
  41. using System.IO;
  42. using System.Threading;
  43. using System.Text.RegularExpressions;
  44. using System.Collections;
  45. namespace OpenPOP.MIMEParser
  46. {
  47. /// <summary>
  48. /// Summary description for Utility.
  49. /// </summary>
  50. public class Utility
  51. {
  52. private static bool m_blnLog=false;
  53. private static string m_strLogFile = "OpenPOP.log";
  54. public Utility()
  55. {
  56. }
  57. // public static string[] SplitText(string strText, string strSplitter)
  58. // {
  59. // string []segments=new string[0];
  60. // int indexOfstrSplitter=strText.IndexOf(strSplitter);
  61. // if(indexOfstrSplitter!=-1)
  62. // {
  63. //
  64. // }
  65. // return segments;
  66. // }
  67. //
  68. /// <summary>
  69. /// Verifies whether the file is of picture type or not
  70. /// </summary>
  71. /// <param name="strFile">File to be verified</param>
  72. /// <returns>True if picture file, false if not</returns>
  73. public static bool IsPictureFile(string strFile)
  74. {
  75. try
  76. {
  77. if(strFile!=null&&strFile!="")
  78. {
  79. strFile=strFile.ToLower();
  80. if(strFile.EndsWith(".jpg")||strFile.EndsWith(".bmp")||strFile.EndsWith(".ico")||strFile.EndsWith(".gif")||strFile.EndsWith(".png"))
  81. return true;
  82. else
  83. return false;
  84. }
  85. else
  86. return false;
  87. }
  88. catch
  89. {
  90. return false;
  91. }
  92. }
  93. /// <summary>
  94. /// Parse date time info from MIME header
  95. /// </summary>
  96. /// <param name="strDate">Encoded MIME date time</param>
  97. /// <returns>Decoded date time info</returns>
  98. public static string ParseEmailDate(string strDate)
  99. {
  100. string strRet=strDate.Trim();
  101. int indexOfTag=strRet.IndexOf(",");
  102. if(indexOfTag!=-1)
  103. {
  104. strRet=strRet.Substring(indexOfTag+1);
  105. }
  106. strRet=QuoteText(strRet,"+");
  107. strRet=QuoteText(strRet,"-");
  108. strRet=QuoteText(strRet,"GMT");
  109. strRet=QuoteText(strRet,"CST");
  110. return strRet.Trim();
  111. }
  112. /// <summary>
  113. /// Quote the text according to a tag
  114. /// </summary>
  115. /// <param name="strText">Text to be quoted</param>
  116. /// <param name="strTag">Quote tag</param>
  117. /// <returns>Quoted Text</returns>
  118. public static string QuoteText(string strText, string strTag)
  119. {
  120. int indexOfTag=strText.IndexOf(strTag);
  121. if(indexOfTag!=-1)
  122. return strText.Substring(0,indexOfTag-1);
  123. else
  124. return strText;
  125. }
  126. /// <summary>
  127. /// Parse file name from MIME header
  128. /// </summary>
  129. /// <param name="strHeader">MIME header</param>
  130. /// <returns>Decoded file name</returns>
  131. public static string ParseFileName(string strHeader)
  132. {
  133. string strTag;
  134. strTag="filename=";
  135. int intPos=strHeader.ToLower().IndexOf(strTag);
  136. if(intPos==-1)
  137. {
  138. strTag="name=";
  139. intPos=strHeader.ToLower().IndexOf(strTag);
  140. }
  141. string strRet;
  142. if(intPos!=-1)
  143. {
  144. strRet=strHeader.Substring(intPos+strTag.Length);
  145. intPos=strRet.ToLower().IndexOf(";");
  146. if(intPos!=-1)
  147. strRet=strRet.Substring(1,intPos-1);
  148. strRet=RemoveQuote(strRet);
  149. }
  150. else
  151. strRet="";
  152. return strRet;
  153. }
  154. /// <summary>
  155. /// Parse email address from MIME header
  156. /// </summary>
  157. /// <param name="strEmailAddress">MIME header</param>
  158. /// <param name="strUser">Decoded user name</param>
  159. /// <param name="strAddress">Decoded email address</param>
  160. /// <returns>True if decoding succeeded, false if failed</returns>
  161. public static bool ParseEmailAddress(string strEmailAddress,ref string strUser, ref string strAddress)
  162. {
  163. int indexOfAB=strEmailAddress.Trim().LastIndexOf("<");
  164. int indexOfEndAB=strEmailAddress.Trim().LastIndexOf(">");
  165. strUser=strEmailAddress;
  166. strAddress=strEmailAddress;
  167. if(indexOfAB>=0&&indexOfEndAB>=0)
  168. {
  169. if(indexOfAB>0)
  170. {
  171. strUser=strUser.Substring(0,indexOfAB-1);
  172. // strUser=strUser.Substring(0,indexOfAB-1).Trim('"');
  173. // if(strUser.IndexOf(""")>=0)
  174. // {
  175. // strUser=strUser.Substring(1,strUser.Length-1);
  176. // }
  177. }
  178. strUser=strUser.Trim();
  179. strUser=strUser.Trim('"');
  180. strAddress=strAddress.Substring(indexOfAB+1,indexOfEndAB-(indexOfAB+1));
  181. }
  182. strUser=strUser.Trim();
  183. strUser=DecodeText(strUser);
  184. strAddress=strAddress.Trim();
  185. return true;
  186. }
  187. /// <summary>
  188. /// Save byte content to a file
  189. /// </summary>
  190. /// <param name="strFile">File to be saved to</param>
  191. /// <param name="bytContent">Byte array content</param>
  192. /// <returns>True if saving succeeded, false if failed</returns>
  193. public static bool SaveByteContentToFile(string strFile,byte[] bytContent)
  194. {
  195. try
  196. {
  197. if(File.Exists(strFile))
  198. File.Delete(strFile);
  199. FileStream fs=File.Create(strFile);
  200. fs.Write(bytContent,0,bytContent.Length);
  201. fs.Close();
  202. return true;
  203. }
  204. catch(Exception e)
  205. {
  206. Utility.LogError("SaveByteContentToFile():"+e.Message);
  207. return false;
  208. }
  209. }
  210. /// <summary>
  211. /// Save text content to a file
  212. /// </summary>
  213. /// <param name="strFile">File to be saved to</param>
  214. /// <param name="strText">Text content</param>
  215. /// <param name="blnReplaceExists">Replace file if exists</param>
  216. /// <returns>True if saving succeeded, false if failed</returns>
  217. public static bool SavePlainTextToFile(string strFile, string strText, bool blnReplaceExists)
  218. {
  219. try
  220. {
  221. bool blnRet=true;
  222. if(File.Exists(strFile))
  223. {
  224. if(blnReplaceExists)
  225. File.Delete(strFile);
  226. else
  227. blnRet=false;
  228. }
  229. if(blnRet==true)
  230. {
  231. StreamWriter sw=File.CreateText(strFile);
  232. sw.Write(strText);
  233. sw.Close();
  234. }
  235. return blnRet;
  236. }
  237. catch(Exception e)
  238. {
  239. Utility.LogError("SavePlainTextToFile():"+e.Message);
  240. return false;
  241. }
  242. }
  243. /// <summary>
  244. /// Read text content from a file
  245. /// </summary>
  246. /// <param name="strFile">File to be read from</param>
  247. /// <param name="strText">Read text content</param>
  248. /// <returns>True if reading succeeded, false if failed</returns>
  249. public static bool ReadPlainTextFromFile(string strFile, ref string strText)
  250. {
  251. if(File.Exists(strFile))
  252. {
  253. StreamReader fs=new StreamReader(strFile);
  254. strText=fs.ReadToEnd();
  255. fs.Close();
  256. return true;
  257. }
  258. else
  259. return false;
  260. }
  261. /// <summary>
  262. /// Sepearte header name and header value
  263. /// </summary>
  264. /// <param name="strRawHeader"></param>
  265. /// <returns></returns>
  266. public static string[] GetHeadersValue(string strRawHeader)
  267. {
  268. if(strRawHeader==null)
  269. throw new ArgumentNullException("strRawHeader","Argument was null");
  270. string []array=new string[2]{"",""};
  271. int indexOfColon=strRawHeader.IndexOf(":");
  272. try
  273. {
  274. array[0]=strRawHeader.Substring(0,indexOfColon).Trim();
  275. array[1]=strRawHeader.Substring(indexOfColon+1).Trim();
  276. }
  277. catch(Exception){}
  278. return array;
  279. }
  280. /// <summary>
  281. /// Get quoted text
  282. /// </summary>
  283. /// <param name="strText">Text with quotes</param>
  284. /// <param name="strSplitter">Splitter</param>
  285. /// <param name="strTag">Target tag</param>
  286. /// <returns>Text without quote</returns>
  287. public static string GetQuotedValue(string strText, string strSplitter, string strTag)
  288. {
  289. if(strText==null)
  290. throw new ArgumentNullException("strText","Argument was null");
  291. string []array=new string[2]{"",""};
  292. int indexOfstrSplitter=strText.IndexOf(strSplitter);
  293. try
  294. {
  295. array[0]=strText.Substring(0,indexOfstrSplitter).Trim();
  296. array[1]=strText.Substring(indexOfstrSplitter+1).Trim();
  297. int pos=array[1].IndexOf(""");
  298. if(pos!=-1)
  299. {
  300. int pos2=array[1].IndexOf(""",pos+1);
  301. array[1]=array[1].Substring(pos+1,pos2-pos-1);
  302. }
  303. }
  304. catch(Exception){}
  305. //return array;
  306. if(array[0].ToLower()==strTag.ToLower())
  307. return array[1].Trim();
  308. else
  309. return null;
  310. /* string []array=null;
  311. try
  312. {
  313. array=Regex.Split(strText,strSplitter);
  314. //return array;
  315. if(array[0].ToLower()==strTag.ToLower())
  316. return RemoveQuote(array[1].Trim());
  317. else
  318. return null;
  319. }
  320. catch
  321. {return null;}*/
  322. }
  323. /// <summary>
  324. /// Change text encoding
  325. /// </summary>
  326. /// <param name="strText">Source encoded text</param>
  327. /// <param name="strCharset">New charset</param>
  328. /// <returns>Encoded text with new charset</returns>
  329. public static string Change(string strText,string strCharset)
  330. {
  331. if (strCharset==null || strCharset=="")
  332. return strText;
  333. byte[] b=Encoding.Default.GetBytes(strText);
  334. return new string(Encoding.GetEncoding(strCharset).GetChars(b));
  335. }
  336. /// <summary>
  337. /// Remove non-standard base 64 characters
  338. /// </summary>
  339. /// <param name="strText">Source text</param>
  340. /// <returns>standard base 64 text</returns>
  341. public static string RemoveNonB64(string strText)
  342. {
  343. return strText.Replace("","");
  344. }
  345. /// <summary>
  346. /// Remove white blank characters
  347. /// </summary>
  348. /// <param name="strText">Source text</param>
  349. /// <returns>Text with white blanks</returns>
  350. public static string RemoveWhiteBlanks(string strText)
  351. {
  352. return strText.Replace("","").Replace("rn","");
  353. }
  354. /// <summary>
  355. /// Remove quotes
  356. /// </summary>
  357. /// <param name="strText">Text with quotes</param>
  358. /// <returns>Text without quotes</returns>
  359. public static string RemoveQuote(string strText)
  360. {
  361. string strRet=strText;
  362.             //strText可能有空格,要去空格(还未修改)
  363. if(strRet.StartsWith("""))
  364. strRet=strRet.Substring(1);
  365. if(strRet.EndsWith("""))
  366. strRet=strRet.Substring(0,strRet.Length-1);
  367. return strRet;
  368. }
  369. /// <summary>
  370. /// Decode one line of text
  371. /// </summary>
  372. /// <param name="strText">Encoded text</param>
  373. /// <returns>Decoded text</returns>
  374. public static string DecodeLine(string strText)
  375. {
  376. return DecodeText(RemoveWhiteBlanks(strText));
  377. }
  378. /// <summary>
  379. /// Verifies wether the text is a valid MIME Text or not
  380. /// </summary>
  381. /// <param name="strText">Text to be verified</param>
  382. /// <returns>True if MIME text, false if not</returns>
  383. private static bool IsValidMIMEText(string strText)
  384. {
  385. int intPos=strText.IndexOf("=?");
  386. return (intPos!=-1&&strText.IndexOf("?=",intPos+6)!=-1&&strText.Length>7);
  387. }
  388. /// <summary>
  389. /// Decode text
  390. /// </summary>
  391. /// <param name="strText">Source text</param>
  392. /// <returns>Decoded text</returns>
  393. public static string DecodeText(string strText)
  394. {
  395.             /*try
  396.             {
  397.                 string strRet="";
  398.                 string strBody="";
  399.                 MatchCollection mc=Regex.Matches(strText,@"=?(?<Charset>S+)?(?<Encoding>w)?(?<Content>S+)?=");
  400.                                                          
  401.                 for(int i=0;i<mc.Count;i++)
  402.                 {
  403.                     if(mc[i].Success)
  404.                     {
  405.                         strBody=mc[i].Groups["Content"].Value;
  406.                         switch(mc[i].Groups["Encoding"].Value.ToUpper())
  407.                         {
  408.                             case "B":
  409.                                 strBody=deCodeB64s(strBody,mc[i].Groups["Charset"].Value);
  410.                                 break;
  411.                             case "Q":
  412.                                 strBody=DecodeQP.ConvertHexContent(strBody);//, m.Groups["Charset"].Value);
  413.                                 break;
  414.                             default:
  415.                                 break;
  416.                         }
  417.                         strRet+=strBody;
  418.                     }
  419.                     else
  420.                     {
  421.                         strRet+=mc[i].Value;
  422.                     }
  423.                 }
  424.                 return strRet;
  425.             }
  426.             catch
  427.             {return strText;}*/
  428.             try
  429. {
  430.                 
  431. string strRet="";
  432. string[] strParts=Regex.Split(strText,"rn");
  433. string strBody="";
  434. const string strRegEx=@"=?(?<Charset>S+)?(?<Encoding>w)?(?<Content>S+)?=";
  435. Match m=null;
  436. for(int i=0;i<strParts.Length;i++)
  437. {
  438.                     m = Regex.Match(strParts[i], strRegEx);
  439.                     //-------------start by shine---------------------------------//
  440.                     MatchCollection m1 = null;                    
  441.                     m1 = Regex.Matches(strParts[i], strRegEx);                    
  442. if(m.Success)
  443. {
  444.                         
  445.                         //strBody=m.Groups["Content"].Value;
  446.                        
  447.                         //switch (m.Groups["Encoding"].Value.ToUpper())
  448.                         //{
  449.                         //    case "B":
  450.                         //        strBody = deCodeB64s(strBody, m.Groups["Charset"].Value);
  451.                         //        break;
  452.                         //    case "Q":
  453.                         //        strBody = DecodeQP.ConvertHexContent(strBody);//, m.Groups["Charset"].Value);
  454.                         //        break;
  455.                         //    default:
  456.                         //        break;
  457.                         //}
  458.                         //strRet += strBody;
  459.                         IEnumerator ie = m1.GetEnumerator();
  460.                         string temp = string.Empty;
  461.                         while (ie.MoveNext())
  462.                         {
  463.                             
  464.                             string str = (string)ie.Current.ToString();
  465.                             m = Regex.Match(str, strRegEx);
  466.                             strBody = m.Groups["Content"].Value;
  467.                             switch (m.Groups["Encoding"].Value.ToUpper())
  468.                             {
  469.                                 case "B":
  470.                                     strBody = deCodeB64s(strBody, m.Groups["Charset"].Value);
  471.                                     break;
  472.                                 case "Q":
  473.                                     strBody = DecodeQP.ConvertHexContent(strBody);//, m.Groups["Charset"].Value);
  474.                                     break;
  475.                                 default:
  476.                                     break;
  477.                             }
  478.                             strRet += strBody;
  479.                         }
  480. }
  481.                     //---------------end by shine---------------------------------//
  482. else
  483. {
  484. if(!IsValidMIMEText(strParts[i]))
  485. strRet+=strParts[i];
  486. else
  487. {
  488. //blank text
  489. }
  490. }
  491. }
  492. return strRet;
  493. }
  494. catch
  495. {return strText;}
  496. /*
  497. {
  498. try
  499. {
  500. if(strText!=null&&strText!="")
  501. {
  502. if(IsValidMIMEText(strText))
  503. {
  504. //position at the end of charset
  505. int intPos=strText.IndexOf("=?");
  506. int intPos2=strText.IndexOf("?",intPos+2);
  507. if(intPos2>3)
  508. {
  509. string strCharset=strText.Substring(2,intPos2-2);
  510. string strEncoding=strText.Substring(intPos2+1,1);
  511. int intPos3=strText.IndexOf("?=",intPos2+3);
  512. string strBody=strText.Substring(intPos2+3,intPos3-intPos2-3);
  513. string strHead="";
  514. if(intPos>0)
  515. {
  516. strHead=strText.Substring(0,intPos-1);
  517. }
  518. string strEnd="";
  519. if(intPos3<strText.Length-2)
  520. {
  521. strEnd=strText.Substring(intPos3+2);
  522. }
  523. switch(strEncoding.ToUpper())
  524. {
  525. case "B":
  526. strBody=deCodeB64s(strBody);
  527. break;
  528. case "Q":
  529. strBody=DecodeQP.ConvertHexContent(strBody);
  530. break;
  531. default:
  532. break;
  533. }
  534. strText=strHead+strBody+strEnd;
  535. if(IsValidMIMEText(strText))
  536. return DecodeText(strText);
  537. else
  538. return strText;
  539. }
  540. else
  541. {return strText;}
  542. }
  543. else
  544. {return strText;}
  545. }
  546. else
  547. {return strText;}
  548. }
  549. catch
  550. {return strText;}*/
  551. }
  552. /// <summary>
  553. /// 
  554. /// </summary>
  555. /// <param name="strText"></param>
  556. /// <returns></returns>
  557. public static string deCodeB64s(string strText)
  558. {
  559. return Encoding.Default.GetString(deCodeB64(strText));
  560. }
  561. public static string deCodeB64s(string strText,string strEncoding)
  562. {
  563. try
  564. {
  565. if(strEncoding.ToLower()=="ISO-8859-1".ToLower())
  566. return deCodeB64s(strText);
  567. else
  568. return Encoding.GetEncoding(strEncoding).GetString(deCodeB64(strText));
  569. }
  570. catch
  571. {
  572. return deCodeB64s(strText);
  573. }
  574. }
  575. private static byte []deCodeB64(string strText)
  576. {
  577. byte[] by=null;
  578. try
  579. if(strText!="")
  580. {
  581. by=Convert.FromBase64String(strText); 
  582. //strText=Encoding.Default.GetString(by);
  583. }
  584. catch(Exception e) 
  585. {
  586.                 for (int i = 0; i < strText.Length; i++)
  587.                 {
  588.                     by[i] = Convert.ToByte(strText.Substring(i));
  589.                 }
  590. LogError("deCodeB64():"+e.Message);
  591. }
  592. return by;
  593. }
  594. /// <summary>
  595. /// Turns file logging on and off.
  596. /// </summary>
  597. /// <remarks>Comming soon.</remarks>
  598. public static bool Log
  599. {
  600. get
  601. {
  602. return m_blnLog;
  603. }
  604. set
  605. {
  606. m_blnLog = value;
  607. }
  608. }
  609. internal static void LogError(string strText) 
  610. {
  611. //Log=true;
  612. if(Log)
  613. {
  614. FileInfo file = null;
  615. FileStream fs = null;
  616. StreamWriter sw = null;
  617. try
  618. {
  619. file = new FileInfo(m_strLogFile);
  620. sw = file.AppendText();
  621. //fs = new FileStream(m_strLogFile, FileMode.OpenOrCreate, FileAccess.Write);
  622. //sw = new StreamWriter(fs);
  623. sw.WriteLine(DateTime.Now);
  624. sw.WriteLine(strText);
  625. sw.WriteLine("rn");
  626. sw.Flush();
  627. }
  628. finally
  629. {
  630. if(sw != null)
  631. {
  632. sw.Close();
  633. sw = null;
  634. }
  635. if(fs != null)
  636. {
  637. fs.Close();
  638. fs = null;
  639. }
  640. }
  641. }
  642. }
  643. public static bool IsQuotedPrintable(string strText)
  644. {
  645. if(strText!=null)
  646. return (strText.ToLower()=="quoted-printable".ToLower());
  647. else
  648. return false;
  649. }
  650. public static bool IsBase64(string strText)
  651. {
  652. if(strText!=null)
  653. return (strText.ToLower()=="base64".ToLower());
  654. else
  655. return false;
  656. }
  657. public static string[] SplitOnSemiColon(string strText)
  658. {
  659. if(strText==null)
  660. throw new ArgumentNullException("strText","Argument was null");
  661. string []array=null;
  662. int indexOfColon=strText.IndexOf(";");
  663. if(indexOfColon<0)
  664. {
  665. array=new string[1];
  666. array[0]=strText;
  667. return array;
  668. }
  669. else
  670. {
  671. array=new string[2];
  672. }
  673. try
  674. {
  675. array[0]=strText.Substring(0,indexOfColon).Trim();
  676. array[1]=strText.Substring(indexOfColon+1).Trim();
  677. }
  678. catch(Exception){}
  679. return array;
  680. }
  681. public static bool IsNotNullText(string strText)
  682. {
  683. try
  684. {
  685. return (strText!=null&&strText!="");
  686. }
  687. catch
  688. {
  689. return false;
  690. }
  691. }
  692. public static bool IsNotNullTextEx(string strText)
  693. {
  694. try
  695. {
  696. return (strText!=null&&strText.Trim()!="");
  697. }
  698. catch
  699. {
  700. return false;
  701. }
  702. }
  703. public static bool IsOrNullTextEx(string strText)
  704. {
  705. try
  706. {
  707. return (strText==null||strText.Trim()=="");
  708. }
  709. catch
  710. {
  711. return false;
  712. }
  713. }
  714. }
  715. }