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

Email客户端

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "MailMessage.h"
  3. #ifdef _DEBUG
  4. #undef THIS_FILE
  5. static char THIS_FILE[]=__FILE__;
  6. #define new DEBUG_NEW
  7. #endif
  8. //////////////////////////////////////////////////////////////////////
  9. // Construction/Destruction
  10. //////////////////////////////////////////////////////////////////////
  11. CMailMessage::CMailMessage()
  12. {
  13. SetCharsPerLine(MAIL_CHARS_PER_LINE);
  14. }
  15. CMailMessage::~CMailMessage()
  16. {
  17. }
  18. ///<summary>
  19. ///   Add a recipient's information
  20. ///</summary>
  21. BOOL CMailMessage::AddRecipient(const CString& strEmailAddress, const CString& strFriendlyName, RECIPIENTS_TYPE type)
  22. {
  23. CRecipient to;
  24. to.m_strEmailAddress = strEmailAddress;
  25. to.m_strFriendlyName = strFriendlyName;
  26.     switch(type)
  27. {
  28. case TO: 
  29. m_Recipients.Add(to);    
  30. break;
  31. case CC: 
  32. m_CCRecipients.Add(to);
  33. break;
  34.     case BCC:
  35. m_BCCRecipients.Add(to); 
  36. break;
  37. default:
  38. ASSERT(FALSE);
  39. return FALSE;
  40. }
  41.    return TRUE;
  42. }
  43. ///<summary>
  44. ///   Get a recipient's information
  45. ///</summary>
  46. BOOL CMailMessage::GetRecipient(CString& strEmailAddress, CString& strFriendlyName, int nIndex, RECIPIENTS_TYPE type)
  47. {
  48. if(nIndex < 0)
  49. {
  50. return FALSE;
  51. }
  52. int nMax = (int)max(m_Recipients.GetUpperBound(), m_CCRecipients.GetUpperBound());
  53. if (nIndex > max(nMax, m_BCCRecipients.GetUpperBound()))
  54. {
  55. return FALSE;
  56. }
  57. CRecipient to;
  58. switch(type)
  59. {
  60. case TO:
  61. to = m_Recipients[nIndex];
  62. break;
  63. case CC:
  64. to = m_CCRecipients[nIndex];
  65. break;
  66. case BCC: 
  67. to = m_BCCRecipients[nIndex];
  68. break;
  69. default:
  70. ASSERT(FALSE);
  71. return FALSE;
  72. }
  73. strEmailAddress = to.m_strEmailAddress;
  74. strFriendlyName = to.m_strFriendlyName;
  75. return TRUE;
  76. }
  77. ///<summary>
  78. ///   Get the count of recipients
  79. ///</summary>
  80. int CMailMessage::GetNumRecipients(RECIPIENTS_TYPE type)
  81. {
  82. int nNumber = 0;
  83. switch(type)
  84.     {
  85. case TO:  
  86. nNumber = (int)m_Recipients.GetSize();
  87. break;
  88.          case CC:
  89.  nNumber = (int)m_CCRecipients.GetSize();
  90.  break;
  91.          case BCC:
  92.  nNumber = (int)m_BCCRecipients.GetSize();
  93.  break;
  94.  default:
  95.  ASSERT(FALSE);
  96.  return 0;
  97.     }
  98.     return nNumber;
  99. }
  100. ///<summary>
  101. ///   Add multiple recipient's information
  102. ///</summary>
  103. BOOL CMailMessage::AddMultipleRecipients(LPCTSTR szRecipients, RECIPIENTS_TYPE type)
  104. {
  105. ASSERT(szRecipients != NULL);
  106. if (NULL == szRecipients)
  107. {
  108. return FALSE;
  109. }
  110. TCHAR* pszBuf = NULL;
  111. UINT nPos = 0;
  112. UINT nStart = 0;
  113. CString strTemp;
  114. CString strEmail;
  115. CString strFriendly;
  116. UINT nLength = 0;
  117. int nMark = -1;
  118. int nMark2 = -1;
  119. // Add Recipients one by one
  120. nLength = (int)_tcslen(szRecipients);
  121. pszBuf = new TCHAR[nLength + 1]; // Allocate a temporary area for operating
  122. _tcscpy_s(pszBuf, nLength + 1, szRecipients);
  123. for(; nPos <= nLength; nPos++)
  124. {
  125. if(pszBuf[nPos] == ';' || pszBuf[nPos] == 0)
  126. {
  127. // First, pick apart the sub-strings (separated by ';') and store it in strTemp.
  128. pszBuf[nPos] = 0;
  129. strTemp = &pszBuf[nStart];
  130. // Now divide the substring into friendly names and email addresses.
  131. nMark = strTemp.Find('<');
  132. if(nMark >= 0)
  133. {
  134. strFriendly = strTemp.Left(nMark);
  135. nMark2 = strTemp.Find('>');
  136. if(nMark2 < nMark)
  137. {
  138. delete[] pszBuf;
  139. pszBuf = NULL;
  140. return FALSE;
  141. }
  142. // End of mark at closing bracket or end of string
  143. strEmail = strTemp.Mid(nMark + 1, nMark2 - (nMark + 1));
  144. }
  145. else
  146. {
  147. strEmail = strTemp;
  148. strFriendly = _T( "" );
  149. }
  150. AddRecipient(strEmail, strFriendly, type);
  151. nStart = nPos + 1;
  152. }
  153. }
  154. delete[] pszBuf;
  155. pszBuf = NULL;
  156. return TRUE;
  157. }
  158. ///<summary>
  159. ///   get and set chars per line
  160. ///</summary>
  161. void CMailMessage::SetCharsPerLine(UINT nCharsPerLine)
  162. {
  163. m_nCharsPerLine = nCharsPerLine;
  164. }
  165. UINT CMailMessage::GetCharsPerLine()
  166. {
  167. return m_nCharsPerLine;
  168. }
  169. ///<summary>
  170. ///   set the related inforamtion
  171. ///</summary>
  172. void CMailMessage::SetInfo(const CString& strFrom, const CString& strSubject, const CString& strBody, 
  173.    const CString& strUsername, const CString& strPassword)
  174. {
  175. m_strFrom = strFrom;
  176. m_strSubject = strSubject;
  177. m_strBody = strBody;
  178. m_strUsername = strUsername;
  179. m_strPassword = strPassword;
  180. }
  181. ///<summary>
  182. ///   get the mail's body
  183. ///</summary>
  184. CString CMailMessage::GetMailBody()
  185. {
  186. return m_strBody;
  187. }
  188. ///<summary>
  189. ///   get the mail's header
  190. ///</summary>
  191. CString CMailMessage::GetMailHeader()
  192. {
  193. return m_strHeader;
  194. }
  195. ///<summary>
  196. ///   format the mail' header without any encoding mechanism 
  197. ///</summary>
  198. void CMailMessage::FormatMessage()
  199. {
  200. m_strHeader = _T("");
  201. PrepareHeader();
  202. m_strHeader += _T("rn");
  203. PrepareBody();
  204. }
  205. ///<summary>
  206. ///   format the pure header 
  207. ///</summary>
  208. void CMailMessage::PrepareHeader()
  209. {
  210. CString strTemp;
  211. // Date:
  212. m_tDateTime = m_tDateTime.GetCurrentTime();
  213. // Format: Mon, 01 Jun 98 01:10:30 GMT
  214. strTemp = _T("Date: ");
  215. strTemp += m_tDateTime.Format("%a, %d %b %Y %H:%M:%S %Z");
  216. AddHeaderLine(strTemp);
  217. // From:
  218. strTemp = _T("From: ") + m_strFrom;
  219. AddHeaderLine((LPCTSTR)strTemp);
  220. // Subject:
  221. strTemp = _T("Subject: ") + m_strSubject;
  222. AddHeaderLine(strTemp);
  223. // To:
  224. strTemp = _T("To: ");
  225. CString strEmail;
  226. CString strFriendly;
  227. int i = 0;
  228. for(; i < GetNumRecipients(); i++)
  229. {
  230. GetRecipient(strEmail, strFriendly, i);
  231. strTemp += (i > 0 ? _T(",") : _T(""));
  232. strTemp += strFriendly;
  233. strTemp += _T("<");
  234. strTemp += strEmail;
  235. strTemp += _T(">");
  236. }
  237. AddHeaderLine(strTemp);
  238.    strTemp = _T("Cc: ");
  239.    strEmail.Empty();
  240.    strFriendly.Empty();
  241.    for(i = 0; i < GetNumRecipients(CC); i++)
  242.    {
  243.    GetRecipient(strEmail, strFriendly, i, CC);
  244.    strTemp += (i > 0 ? _T(",") : _T(""));
  245.    strTemp += strFriendly;
  246.    strTemp += _T("<");
  247.    strTemp += strEmail;
  248.    strTemp += _T(">");
  249.    }
  250.    AddHeaderLine(strTemp);
  251. }
  252. ///<summary>
  253. ///   do some jobs if necessary
  254. ///</summary>
  255. void CMailMessage::PrepareBody()
  256. {
  257. // Append a CR/LF to body if necessary.
  258. if(m_strBody.Right(2) != _T("rn"))
  259. m_strBody += _T("rn");
  260. }
  261. ///<summary>
  262. ///   add a line into the mail's header
  263. ///</summary>
  264. void CMailMessage::AddHeaderLine(const CString& strHeaderLine)
  265. {
  266. CString strTemp;
  267. strTemp.Format(_T( "%srn"), strHeaderLine);
  268. m_strHeader += strTemp;
  269. }