MIMEMessage.cpp
上传用户:weimei12
上传日期:2022-08-11
资源大小:185k
文件大小:5k
源码类别:

Email客户端

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "MailMessage.h"
  3. #include "MIMEContentAgent.h"
  4. #include "MIMEMessage.h"
  5. #include "TextPlain.h"
  6. #include "AppOctetStream.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. // Static Member Initializers
  13. CMIMEMessage::CMIMETypeManager CMIMEMessage::m_MIMETypeManager;
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. CMIMEMessage::CMIMEMessage()
  18. {
  19. m_strMIMEContentType = _T("multipart/mixed");
  20. m_strPartBoundary = _T("LX_MAIL_NEXT_PART_10242007");
  21. m_strNoMIMEText = _T("This is a multi-part message in MIME format.");
  22. // Register the MIME types handled by this class
  23. CMIMEContentAgent* pType;
  24. // These objects are deleted by CMIMTypeManager's destructor
  25. pType = new CTextPlain(TEXT_PLAIN, GetCharsPerLine());
  26. RegisterMimeType(pType);
  27. pType = new CAppOctetStream(APPLICATION_OCTETSTREAM);
  28. RegisterMimeType(pType);
  29. }
  30. CMIMEMessage::~CMIMEMessage()
  31. {
  32. }
  33. ///<summary>
  34. ///   add the part to the part-list used to build the body.
  35. ///</summary>
  36. BOOL CMIMEMessage::AddMIMEPart(LPCTSTR szContent,
  37.    int nContentType, 
  38.    LPCTSTR szParameters, 
  39.    int nEncoding, 
  40.    BOOL bPath)
  41. {
  42. CMIMEPart part;
  43. part.m_nContentType = nContentType;
  44. part.m_strParameters = szParameters;
  45. part.m_nEncoding = nEncoding;
  46. part.m_bPath = bPath;
  47. part.m_strContent = szContent;
  48. part.m_strContent.TrimLeft();
  49. part.m_strContent.TrimRight();
  50. if(TEXT_PLAIN == nContentType)
  51. {
  52. m_MIMEPartList.AddHead(part);
  53. }
  54. else
  55. {
  56. m_MIMEPartList.AddTail(part);
  57. }
  58. return TRUE;
  59. }
  60. ///<summary>
  61. ///   format the pure header 
  62. ///</summary>
  63. void CMIMEMessage::PrepareHeader()
  64. {
  65. // Let the base class add its headers
  66. CMailMessage::PrepareHeader();
  67. CString sTemp;
  68. AddHeaderLine(_T("MIME-Version: 1.0"));
  69. sTemp.Format(_T("Content-Type: %s; boundary=%s"), m_strMIMEContentType, m_strPartBoundary);
  70. AddHeaderLine(sTemp);
  71. }
  72. ///<summary>
  73. ///   do some jobs if necessary
  74. ///</summary>
  75. void CMIMEMessage::PrepareBody()
  76. {
  77. // Class user may have assigned body text directly.
  78. // Convert it to just another MIME part to be processed.
  79. // If this default Content-Type isn't good enough for the
  80. // class user, he or she should have used AddMIMEPart() instead.
  81. if(m_strBody != _T(""))
  82. AddMIMEPart((LPCTSTR)m_strBody, TEXT_PLAIN, "", _7BIT, FALSE);
  83. // Initialize the body (replace current contents).
  84. m_strBody = m_strNoMIMEText;
  85. m_strBody += _T("rnrn");
  86. AppendMimeParts();
  87. InsertMessageEnd(m_strBody);
  88. CMailMessage::PrepareBody();
  89. }
  90. ///<summary>
  91. ///   Insert the boundary part at the end
  92. ///</summary>
  93. void CMIMEMessage::InsertMessageEnd(CString& strText)
  94. {
  95. CString strTemp;
  96. if(strText.Right(2) != _T("rn"))
  97. strText += _T("rn");
  98. strTemp.Format(_T("--%s--rn"), m_strPartBoundary);
  99. strText += strTemp;
  100. }
  101. ///<summary>
  102. ///   Insert the boundary part
  103. ///</summary>
  104. void CMIMEMessage::InsertBoundary(CString& strText)
  105. {
  106. CString strTemp;
  107. if(strText.Right(2) != _T("rn"))
  108. strText += _T("rn");
  109. strTemp.Format(_T("--%srn"), m_strPartBoundary);
  110. strText += strTemp;
  111. }
  112. ///<summary>
  113. ///   register one mime type content into the manager
  114. ///</summary>
  115. void CMIMEMessage::RegisterMimeType(CMIMEContentAgent* pMIMEType)
  116. {
  117. ASSERT(pMIMEType != NULL);
  118. if(NULL == pMIMEType)
  119. return;
  120. m_MIMETypeManager.RegisterMIMEType(pMIMEType);
  121. }
  122. ///<summary>
  123. ///   Append each mime part to the body
  124. ///</summary>
  125. void CMIMEMessage::AppendMimeParts()
  126. {
  127. POSITION partPosition;
  128. CMIMEPart* pMIMEPart = NULL;
  129. CMIMEContentAgent* pMIMEType = NULL;
  130. // Get each part from the list, append them to the body
  131. partPosition = m_MIMEPartList.GetHeadPosition();
  132. while(partPosition != NULL)
  133. {
  134. pMIMEPart = &m_MIMEPartList.GetNext(partPosition);
  135. pMIMEType = m_MIMETypeManager.GetHandler(pMIMEPart->m_nContentType);
  136. if(pMIMEType != NULL)
  137. {
  138. InsertBoundary(m_strBody);
  139. pMIMEType->AppendPart(pMIMEPart->m_strContent,
  140.   pMIMEPart->m_strParameters,
  141.   pMIMEPart->m_nEncoding,
  142.   pMIMEPart->m_bPath,
  143.   m_strBody);
  144. }
  145. }
  146. }
  147. //////////////////////////////////////////////////////////////////////
  148. // CMIMETypeManager Implementation
  149. //////////////////////////////////////////////////////////////////////
  150. CMIMEMessage::CMIMETypeManager::CMIMETypeManager()
  151. {
  152. }
  153. CMIMEMessage::CMIMETypeManager::~CMIMETypeManager()
  154. {
  155. POSITION pos;
  156. CMIMEContentAgent* p;
  157.   m_csAccess.Lock();
  158. pos = m_MIMETypeList.GetHeadPosition();
  159. while(pos != NULL)
  160. {
  161. p = m_MIMETypeList.GetNext(pos);
  162. delete p;
  163. }
  164. m_csAccess.Unlock();
  165. }
  166. ///<summary>
  167. ///   register one mime type content into the manager
  168. ///</summary>
  169. void CMIMEMessage::CMIMETypeManager::RegisterMIMEType(CMIMEContentAgent *pMIMEType)
  170. {
  171. ASSERT(pMIMEType != NULL);
  172. if(pMIMEType == NULL)
  173. return;
  174. m_csAccess.Lock();
  175. m_MIMETypeList.AddTail( pMIMEType );
  176. m_csAccess.Unlock();
  177. }
  178. ///<summary>
  179. ///   Get the specified type handler
  180. ///</summary>
  181. CMIMEContentAgent* CMIMEMessage::CMIMETypeManager::GetHandler(int nContentType)
  182. {
  183. POSITION pos;
  184. CMIMEContentAgent* pType = NULL;
  185. m_csAccess.Lock();
  186. pos = m_MIMETypeList.GetHeadPosition();
  187. while(pos != NULL)
  188. {
  189. pType = m_MIMETypeList.GetNext(pos);
  190. if(pType->QueryType(nContentType) == TRUE)
  191. break;
  192. }
  193. m_csAccess.Unlock();
  194. return pType;
  195. }