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

Email服务器

开发平台:

Visual C++

  1. // MIMEMessage.cpp: implementation of the CMIMEMessage class.
  2. // Author: Wes Clyburn (clyburnw@enmu.edu)
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "MIMEMessage.h"
  6. #include "TextPlain.h"
  7. #include "AppOctetStream.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. // Static Member Initializers
  14. CMIMEMessage::CMIMETypeManager CMIMEMessage::m_MIMETypeManager;
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. CMIMEMessage::CMIMEMessage()
  19. {
  20. m_sMIMEContentType = _T( "multipart/mixed" );
  21. m_sPartBoundary = _T( "WC_MAIL_PaRt_BoUnDaRy_05151998" );
  22. m_sNoMIMEText = _T( "This is a multi-part message in MIME format." );
  23. // Register the MIME types handled by this class
  24. //
  25. CMIMEContentAgent* pType;
  26. // These objects are deleted by CMIMTypeManager's destructor
  27. pType = new CTextPlain( TEXT_PLAIN, GetCharsPerLine() );
  28. register_mime_type( pType );
  29. pType = new CAppOctetStream( APPLICATION_OCTETSTREAM );
  30. register_mime_type( pType );
  31. }
  32. CMIMEMessage::~CMIMEMessage()
  33. {
  34. }
  35. // This implementation adds the part to the part-list used
  36. //  to build the body.
  37. BOOL CMIMEMessage::AddMIMEPart(LPCTSTR szContent,
  38.    int nContentType, 
  39.    LPCTSTR szParameters, 
  40.    int nEncoding, 
  41.    BOOL bPath )
  42. {
  43. CMIMEPart part;
  44. part.m_nContentType = nContentType;
  45. part.m_sParameters = szParameters;
  46. part.m_nEncoding = nEncoding;
  47. part.m_bPath = bPath;
  48. part.m_sContent = szContent;
  49. part.m_sContent.TrimLeft();
  50. part.m_sContent.TrimRight();
  51. if( nContentType == TEXT_PLAIN )
  52. m_MIMEPartList.AddHead( part );
  53. else
  54. m_MIMEPartList.AddTail( part );
  55. return TRUE;
  56. }
  57. void CMIMEMessage::prepare_header()
  58. {
  59. CString sTemp;
  60. // Let the base class add its headers
  61. CMailMessage::prepare_header();
  62. add_header_line( _T( "MIME-Version: 1.0" ) );
  63. sTemp.Format( _T( "Content-Type: %s; boundary=%s" ),
  64.   (LPCTSTR)m_sMIMEContentType,
  65.   (LPCTSTR)m_sPartBoundary );
  66. add_header_line( (LPCTSTR)sTemp );
  67. }
  68. void CMIMEMessage::prepare_body()
  69. {
  70. // Class user may have assigned body text directly.
  71. // Convert it to just another MIME part to be processed.
  72. // If this default Content-Type isn't good enough for the
  73. // class user, he or she should have used AddMIMEPart() instead.
  74. if( m_sBody != _T( "" ) )
  75. AddMIMEPart( (LPCTSTR)m_sBody, TEXT_PLAIN, "", _7BIT, FALSE );
  76. // Initialize the body (replace current contents).
  77. m_sBody = m_sNoMIMEText;
  78. m_sBody += _T( "rnrn" );
  79. append_mime_parts();
  80. insert_message_end( m_sBody );
  81. // Let the base class take me to Funky Town
  82. CMailMessage::prepare_body();
  83. }
  84. void CMIMEMessage::insert_boundary( CString& sText )
  85. {
  86. CString sTemp;
  87. if( sText.Right( 2 ) != _T( "rn" ) )
  88. sText += _T( "rn" );
  89. sTemp.Format( _T( "--%srn" ), (LPCTSTR)m_sPartBoundary );
  90. sText += sTemp;
  91. }
  92. void CMIMEMessage::insert_message_end( CString& sText )
  93. {
  94. CString sTemp;
  95. if( sText.Right( 2 ) != _T( "rn" ) )
  96. sText += _T( "rn" );
  97. sTemp.Format( _T( "--%s--rn" ), (LPCTSTR)m_sPartBoundary );
  98. sText += sTemp;
  99. }
  100. void CMIMEMessage::register_mime_type(CMIMEContentAgent* pMIMEType)
  101. {
  102. ASSERT( pMIMEType != NULL );
  103. if( pMIMEType == NULL )
  104. return;
  105. m_MIMETypeManager.RegisterMIMEType( pMIMEType );
  106. }
  107. void CMIMEMessage::append_mime_parts()
  108. {
  109. POSITION part_position;
  110. CMIMEPart* pMIMEPart = NULL;
  111. CMIMEContentAgent* pMIMEType = NULL;
  112. part_position = m_MIMEPartList.GetHeadPosition();
  113. // Get each part from the list, retrieve a handler for it,
  114. //  and let the handler do its thing.
  115. while( part_position != NULL )
  116. {
  117. pMIMEPart = & m_MIMEPartList.GetNext( part_position );
  118. pMIMEType = m_MIMETypeManager.GetHandler( pMIMEPart->m_nContentType );
  119. if( pMIMEType != NULL )
  120. {
  121. insert_boundary( m_sBody );
  122. pMIMEType->AppendPart( pMIMEPart->m_sContent,
  123.    pMIMEPart->m_sParameters,
  124.    pMIMEPart->m_nEncoding,
  125.    pMIMEPart->m_bPath,
  126.    m_sBody );
  127. }
  128. }
  129. }
  130. //////////////////////////////////////////////////////////////////////
  131. // CMIMETypeManager Implementation
  132. //////////////////////////////////////////////////////////////////////
  133. CMIMEMessage::CMIMETypeManager::CMIMETypeManager()
  134. {
  135. }
  136. CMIMEMessage::CMIMETypeManager::~CMIMETypeManager()
  137. {
  138. POSITION pos;
  139. CMIMEContentAgent* p;
  140. m_csAccess.Lock();
  141. pos = m_MIMETypeList.GetHeadPosition();
  142. while( pos != NULL )
  143. {
  144. p = m_MIMETypeList.GetNext( pos );
  145. delete p;
  146. }
  147. }
  148. void CMIMEMessage::CMIMETypeManager::RegisterMIMEType(CMIMEContentAgent *pMIMEType)
  149. {
  150. ASSERT( pMIMEType != NULL );
  151. if( pMIMEType == NULL )
  152. return;
  153. m_csAccess.Lock();
  154. m_MIMETypeList.AddTail( pMIMEType );
  155. }
  156. CMIMEContentAgent* CMIMEMessage::CMIMETypeManager::GetHandler(int nContentType)
  157. {
  158. POSITION pos;
  159. CMIMEContentAgent* pType = NULL;
  160. m_csAccess.Lock();
  161. pos = m_MIMETypeList.GetHeadPosition();
  162. while( pos != NULL )
  163. {
  164. pType = m_MIMETypeList.GetNext( pos );
  165. if( pType->QueryType( nContentType ) == TRUE )
  166. break;
  167. }
  168. return pType;
  169. }