MailMessage.cpp
上传用户:yh_company
上传日期:2013-04-25
资源大小:19k
文件大小:7k
源码类别:

Email客户端

开发平台:

Visual C++

  1. // MailMessage.cpp: implementation of the CMailMessage class.
  2. // Copyright (c) 1998, Wes Clyburn
  3. //
  4. // Modified to have Header and Body handling in this class rather than in any
  5. // class that uses instances of CMailMessage.
  6. // Copyright (c) 1998 Michael Krebs
  7. //////////////////////////////////////////////////////////////////////
  8. #include "stdafx.h"
  9. #include "MailMessage.h"
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[]=__FILE__;
  13. #define new DEBUG_NEW
  14. #endif
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. CMailMessage::CMailMessage()
  19. {
  20. m_sBody=_T("");
  21. m_sHeader=_T("");
  22. }
  23. CMailMessage::~CMailMessage()
  24. {
  25. }
  26. BOOL CMailMessage::AddRecipient( LPCTSTR szEmailAddress, LPCTSTR szFriendlyName)
  27. {
  28. ASSERT( szEmailAddress != NULL );
  29. ASSERT( szFriendlyName != NULL );
  30. CRecipient to;
  31. to.m_sEmailAddress = szEmailAddress;
  32. to.m_sFriendlyName = szFriendlyName;
  33. m_Recipients.Add( to );
  34. return TRUE;
  35. }
  36. // sEmailAddress and sFriendlyName are OUTPUT parameters.
  37. // If the function fails, it will return FALSE, and the OUTPUT
  38. // parameters will not be touched.
  39. BOOL CMailMessage::GetRecipient(CString & sEmailAddress, CString & sFriendlyName, int nIndex)
  40. {
  41. CRecipient to;
  42. if( nIndex < 0 || nIndex > m_Recipients.GetUpperBound() )
  43. return FALSE;
  44. to = m_Recipients[ nIndex ];
  45. sEmailAddress = to.m_sEmailAddress;
  46. sFriendlyName = to.m_sFriendlyName;
  47. return TRUE;
  48. }
  49. int CMailMessage::GetNumRecipients()
  50. {
  51. return m_Recipients.GetSize();
  52. }
  53. BOOL CMailMessage::AddMultipleRecipients(LPCTSTR szRecipients )
  54. {
  55. TCHAR* buf;
  56. UINT pos;
  57. UINT start;
  58. CString sTemp;
  59. CString sEmail;
  60. CString sFriendly;
  61. UINT length;
  62. int nMark;
  63. int nMark2;
  64. ASSERT( szRecipients != NULL );
  65. // Add Recipients
  66. //
  67. length = strlen( szRecipients );
  68. buf = new TCHAR[ length + 1 ]; // Allocate a work area (don't touch parameter itself)
  69. strcpy( buf, szRecipients );
  70. for( pos = 0, start = 0; pos <= length; pos++ )
  71. {
  72. if( buf[ pos ] == ';' ||
  73. buf[ pos ] == 0 )
  74. {
  75. // First, pick apart the sub-strings (separated by ';')
  76. //  Store it in sTemp.
  77. //
  78. buf[ pos ] = 0; // Redundant when at the end of string, but who cares.
  79. sTemp = &buf[ start ];
  80. // Now divide the substring into friendly names and e-mail addresses.
  81. //
  82. nMark = sTemp.Find( '<' );
  83. if( nMark >= 0 )
  84. {
  85. sFriendly = sTemp.Left( nMark );
  86. nMark2 = sTemp.Find( '>' );
  87. if( nMark2 < nMark )
  88. {
  89. delete[] buf;
  90. return FALSE;
  91. }
  92. // End of mark at closing bracket or end of string
  93. nMark2 > -1 ? nMark2 = nMark2 : nMark2 = sTemp.GetLength() - 1;
  94. sEmail = sTemp.Mid( nMark + 1, nMark2 - (nMark + 1) );
  95. }
  96. else
  97. {
  98. sEmail = sTemp;
  99. sFriendly = "";
  100. }
  101. AddRecipient( sEmail, sFriendly );
  102. start = pos + 1;
  103. }
  104. }
  105. delete[] buf;
  106. return TRUE;
  107. }
  108. BOOL CMailMessage::EncodeHeader()
  109. {
  110. CString sTo;
  111. CString sDate;
  112. if( GetNumRecipients() <= 0 )
  113. return FALSE;
  114. m_sHeader = ""; // Clear it
  115. // Get the recipients into a single string
  116. sTo = "";
  117. CString sEmail = "";
  118. CString sFriendly = "";
  119. for( int i = 0; i < GetNumRecipients(); i++ )
  120. {
  121. GetRecipient( sEmail, sFriendly, i );
  122. sTo += ( i > 0 ? "," : "" );
  123. sTo += sFriendly;
  124. sTo += "<";
  125. sTo += sEmail;
  126. sTo += ">";
  127. }
  128. m_tDateTime = m_tDateTime.GetCurrentTime();
  129. // Format: Mon, 01 Jun 98 01:10:30 GMT
  130. sDate = m_tDateTime.Format( "%a, %d %b %y %H:%M:%S %Z" );
  131. m_sHeader.Format( "Date: %srn"
  132. "From: %srn"
  133. "To: %srn"
  134. "Subject: %srn",
  135. // Include other extension lines if desired
  136. (LPCTSTR)sDate,
  137. (LPCTSTR)m_sFrom,
  138. (LPCTSTR)sTo,
  139. (LPCTSTR)m_sSubject);
  140. return TRUE;
  141. }
  142. BOOL CMailMessage::DecodeHeader()
  143. {
  144. int startpos, endpos;
  145. CString sSearchFor;
  146. //We can assume that there's a CR/LF before each of the tags, as the servers insert
  147. //Received: lines on top of the mail while transporting the mail
  148. sSearchFor="rnFrom: ";
  149. startpos=m_sHeader.Find(sSearchFor);
  150. if (startpos<0) return FALSE;
  151. endpos=m_sHeader.Mid(startpos+sSearchFor.GetLength()).Find("rn");
  152. m_sFrom=m_sHeader.Mid(startpos+sSearchFor.GetLength(),endpos);
  153. sSearchFor="rnTo: ";
  154. startpos=m_sHeader.Find(sSearchFor);
  155. if (startpos<0) return FALSE;
  156. endpos=m_sHeader.Mid(startpos+sSearchFor.GetLength()).Find("rn");
  157. AddMultipleRecipients(m_sHeader.Mid(startpos+sSearchFor.GetLength(),endpos));
  158. sSearchFor="rnDate: ";
  159. startpos=m_sHeader.Find(sSearchFor);
  160. if (startpos<0) return FALSE;
  161. endpos = m_sHeader.Mid(startpos+sSearchFor.GetLength()).Find("rn");
  162. //DATE=m_sHeader.Mid(startpos+sSearchFor.GetLength(),endpos));
  163. //This is incorrect ! We have to parse the Date: line !!!
  164. //Anyone likes to write a parser for the different formats a date string may have ?
  165. m_tDateTime = m_tDateTime.GetCurrentTime();
  166. sSearchFor="rnSubject: ";
  167. startpos=m_sHeader.Find(sSearchFor);
  168. if (startpos<0) return FALSE;
  169. endpos=m_sHeader.Mid(startpos+sSearchFor.GetLength()).Find("rn");
  170. m_sSubject=m_sHeader.Mid(startpos+sSearchFor.GetLength(),endpos);
  171. //ATTENTION: Cc parsing won't work, if Cc is split up in multiple lines
  172. // Cc: recipient1 <rec1@ab.cd>,
  173. //    recipient2 <rec2@ab.cd>,
  174. //    recipient3 <rec3@ab.cd>
  175. // won't work !!!
  176. sSearchFor="rnCc: ";
  177. startpos=m_sHeader.Find(sSearchFor);
  178. if (startpos>=0) //no error if there's no Cc
  179. {
  180. endpos=m_sHeader.Mid(startpos+sSearchFor.GetLength()).Find("rn");
  181. AddMultipleRecipients(m_sHeader.Mid(startpos+sSearchFor.GetLength(),endpos));
  182. }
  183. return TRUE;
  184. }
  185. void CMailMessage::EncodeBody()
  186. {
  187. CString sCooked = "";
  188. LPTSTR szBad = "rn.rn";
  189. LPTSTR szGood = "rn..rn";
  190. int nPos;
  191. int nBadLength = strlen( szBad );
  192. if( m_sBody.Left( 3 ) == ".rn" )
  193. m_sBody = "." + m_sBody;
  194. //
  195. // This is a little inefficient because it beings a search
  196. // at the beginning of the string each time. This was
  197. // the only thing I could think of that handled ALL variations.
  198. // In particular, the sequence "rn.rn.rn" is troublesome. 
  199. // (Even CStringEx's FindReplace wouldn't handle that situation
  200. // with the global flag set.)
  201. //
  202. while( (nPos = m_sBody.Find( szBad )) > -1 )
  203. {
  204. sCooked = m_sBody.Mid( 0, nPos );
  205. sCooked += szGood;
  206. m_sBody = sCooked + m_sBody.Right( m_sBody.GetLength() - (nPos + nBadLength) );
  207. }
  208. }
  209. void CMailMessage::DecodeBody()
  210. {
  211. CString sCooked = "";
  212. LPTSTR szBad = "rn..rn";
  213. LPTSTR szGood = "rn.rn";
  214. int nPos;
  215. int nBadLength = strlen( szBad );
  216. if( m_sBody.Left( 4 ) == "..rn" )
  217. m_sBody = m_sBody.Mid(1);
  218. //
  219. // This is a little inefficient because it beings a search
  220. // at the beginning of the string each time. This was
  221. // the only thing I could think of that handled ALL variations.
  222. // In particular, the sequence "rn.rn.rn" is troublesome. 
  223. // (Even CStringEx's FindReplace wouldn't handle that situation
  224. // with the global flag set.)
  225. //
  226. while( (nPos = m_sBody.Find( szBad )) > -1 )
  227. {
  228. sCooked = m_sBody.Mid( 0, nPos );
  229. sCooked += szGood;
  230. m_sBody = sCooked + m_sBody.Right( m_sBody.GetLength() - (nPos + nBadLength) );
  231. }
  232. }