MailMessage.cpp
上传用户:xmpantheon
上传日期:2016-10-20
资源大小:7502k
文件大小:4k
源码类别:

Email服务器

开发平台:

Visual C++

  1. // MailMessage.cpp: implementation of the CMailMessage class.
  2. // Copyright (c) 1998, Wes Clyburn
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "MailMessage.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. //////////////////////////////////////////////////////////////////////
  12. // Construction/Destruction
  13. //////////////////////////////////////////////////////////////////////
  14. CMailMessage::CMailMessage()
  15. {
  16. m_sMailerName = _T( "WC Mail" );
  17. SetCharsPerLine( 76 );
  18. }
  19. CMailMessage::~CMailMessage()
  20. {
  21. }
  22. BOOL CMailMessage::AddRecipient( LPCTSTR szEmailAddress, LPCTSTR szFriendlyName)
  23. {
  24. ASSERT( szEmailAddress != NULL );
  25. ASSERT( szFriendlyName != NULL );
  26. CRecipient to;
  27. to.m_sEmailAddress = szEmailAddress;
  28. to.m_sFriendlyName = szFriendlyName;
  29. m_Recipients.Add( to );
  30. return TRUE;
  31. }
  32. // sEmailAddress and sFriendlyName are OUTPUT parameters.
  33. // If the function fails, it will return FALSE, and the OUTPUT
  34. // parameters will not be touched.
  35. BOOL CMailMessage::GetRecipient(CString & sEmailAddress, CString & sFriendlyName, int nIndex)
  36. {
  37. CRecipient to;
  38. if( nIndex < 0 || nIndex > m_Recipients.GetUpperBound() )
  39. return FALSE;
  40. to = m_Recipients[ nIndex ];
  41. sEmailAddress = to.m_sEmailAddress;
  42. sFriendlyName = to.m_sFriendlyName;
  43. return TRUE;
  44. }
  45. int CMailMessage::GetNumRecipients()
  46. {
  47. return m_Recipients.GetSize();
  48. }
  49. BOOL CMailMessage::AddMultipleRecipients(LPCTSTR szRecipients )
  50. {
  51. TCHAR* buf;
  52. UINT pos;
  53. UINT start;
  54. CString sTemp;
  55. CString sEmail;
  56. CString sFriendly;
  57. UINT length;
  58. int nMark;
  59. int nMark2;
  60. ASSERT( szRecipients != NULL );
  61. // Add Recipients
  62. //
  63. length = strlen( szRecipients );
  64. buf = new TCHAR[ length + 1 ]; // Allocate a work area (don't touch parameter itself)
  65. strcpy( buf, szRecipients );
  66. for( pos = 0, start = 0; pos <= length; pos++ )
  67. {
  68. if( buf[ pos ] == ';' ||
  69. buf[ pos ] == 0 )
  70. {
  71. // First, pick apart the sub-strings (separated by ';')
  72. //  Store it in sTemp.
  73. //
  74. buf[ pos ] = 0; // Redundant when at the end of string, but who cares.
  75. sTemp = &buf[ start ];
  76. // Now divide the substring into friendly names and e-mail addresses.
  77. //
  78. nMark = sTemp.Find( '<' );
  79. if( nMark >= 0 )
  80. {
  81. sFriendly = sTemp.Left( nMark );
  82. nMark2 = sTemp.Find( '>' );
  83. if( nMark2 < nMark )
  84. {
  85. delete[] buf;
  86. return FALSE;
  87. }
  88. // End of mark at closing bracket or end of string
  89. nMark2 > -1 ? nMark2 = nMark2 : nMark2 = sTemp.GetLength() - 1;
  90. sEmail = sTemp.Mid( nMark + 1, nMark2 - (nMark + 1) );
  91. }
  92. else
  93. {
  94. sEmail = sTemp;
  95. sFriendly = _T( "" );
  96. }
  97. AddRecipient( sEmail, sFriendly );
  98. start = pos + 1;
  99. }
  100. }
  101. delete[] buf;
  102. return TRUE;
  103. }
  104. void CMailMessage::FormatMessage()
  105. {
  106. start_header();
  107. prepare_header();
  108. end_header();
  109. prepare_body();
  110. }
  111. void CMailMessage::SetCharsPerLine(UINT nCharsPerLine)
  112. {
  113. m_nCharsPerLine = nCharsPerLine;
  114. }
  115. UINT CMailMessage::GetCharsPerLine()
  116. {
  117. return m_nCharsPerLine;
  118. }
  119. // Create header as per RFC 822
  120. //
  121. void CMailMessage::prepare_header()
  122. {
  123. CString sTemp;
  124. sTemp = _T( "" );
  125. // From:
  126. sTemp = _T( "From: " ) + m_sFrom;
  127. add_header_line( (LPCTSTR)sTemp );
  128. // To:
  129. sTemp = _T( "To: " );
  130. CString sEmail = _T( "" );
  131. CString sFriendly = _T( "" );
  132. for( int i = 0; i < GetNumRecipients(); i++ )
  133. {
  134. GetRecipient( sEmail, sFriendly, i );
  135. sTemp += ( i > 0 ? _T( "," ) : _T( "" ) );
  136. sTemp += sFriendly;
  137. sTemp += _T( "<" );
  138. sTemp += sEmail;
  139. sTemp += _T( ">" );
  140. }
  141. add_header_line( (LPCTSTR)sTemp );
  142. // Date:
  143. m_tDateTime = m_tDateTime.GetCurrentTime();
  144. // Format: Mon, 01 Jun 98 01:10:30 GMT
  145. sTemp = _T( "Date: " );
  146. sTemp += m_tDateTime.Format( "%a, %d %b %y %H:%M:%S %Z" );
  147. add_header_line( (LPCTSTR)sTemp );
  148. // Subject:
  149. sTemp = _T( "Subject: " ) + m_sSubject;
  150. add_header_line( (LPCTSTR)sTemp );
  151. // X-Mailer
  152. sTemp = _T( "X-Mailer: " ) + m_sMailerName;
  153. add_header_line( (LPCTSTR)sTemp );
  154. }
  155. void CMailMessage::prepare_body()
  156. {
  157. // Append a CR/LF to body if necessary.
  158. if( m_sBody.Right( 2 ) != _T( "rn" ) )
  159. m_sBody += _T( "rn" );
  160. }
  161. void CMailMessage::start_header()
  162. {
  163. m_sHeader = _T( "" );
  164. }
  165. void CMailMessage::end_header()
  166. {
  167. m_sHeader += _T( "rn" );
  168. }
  169. void CMailMessage::add_header_line(LPCTSTR szHeaderLine)
  170. {
  171. CString sTemp;
  172. sTemp.Format( _T( "%srn" ), szHeaderLine );
  173. m_sHeader += sTemp;
  174. }