QQ登录

只需一步,快速开始

上位机MFC SMTP协议封装类

[ 复制链接 ]
当前帖子贴出的代码实现电子邮件发送协议SMTP的封装。
代码如下:

  1. //////////////////////////////////////////////////////////////////////
  2. // SMTP.h: interface for the CSMTP class.
  3. //
  4. //////////////////////////////////////////////////////////////////////

  5. #if !defined(AFX_SMTP_H__617F7E82_7F4D_11D1_88A0_00001C302581__INCLUDED_)
  6. #define AFX_SMTP_H__617F7E82_7F4D_11D1_88A0_00001C302581__INCLUDED_

  7. #if _MSC_VER >= 1000
  8. #pragma once
  9. #endif // _MSC_VER >= 1000

  10. #define CONNECTION_CHECK 0
  11. #define HELLO_CHECK 1
  12. #define MAIL_CHECK 2
  13. #define RCPT_CHECK 3
  14. #define DATA_START_CHECK 4
  15. #define DATA_END_CHECK 5
  16. #define QUIT_CHECK 6
  17. #define DATA_CHECK 7


  18. class CSMTP
  19. {
  20. public:
  21.         BOOL Mail(); //
  22.         CString GetErrorMessage();
  23.         BOOL Data(CString Subject, CString Body);
  24.         CString GetTo();
  25.         BOOL SetTo(CString to);
  26.         CString GetFrom();
  27.         void SetFrom(CString from);
  28.         BOOL Mail(CString from);
  29.         BOOL Disconnect();
  30.         CString GetHost();
  31.         void SetHost(CString Host);
  32.         BOOL Connect(CString Host, CString Me);
  33.         BOOL Connect();
  34.         CSMTP();
  35.         virtual ~CSMTP();
  36.         
  37. private:
  38.         CString GetError(CString Response);
  39.         CString m_ErrorMessage;
  40.         BOOL CheckResponse(int Type);
  41.         int m_NoOfTo;
  42.         CStringArray m_To;
  43.         CString m_From;
  44.         CSocket m_SMTPServer;
  45.         CString m_Host;
  46.    };

  47. #endif // !defined(AFX_SMTP_H__617F7E82_7F4D_11D1_88A0_00001C302581__INCLUDED_)


  48. //////////////////////////////////////////////////////////////////////////
  49. // SMTP.cpp: implementation of the CSMTP class.
  50. //
  51. //////////////////////////////////////////////////////////////////////

  52. #include "stdafx.h"
  53. #include "MailSend.h"
  54. #include "SMTP.h"

  55. #ifdef _DEBUG
  56. #undef THIS_FILE
  57. static char THIS_FILE[]=__FILE__;
  58. #define new DEBUG_NEW
  59. #endif

  60. //////////////////////////////////////////////////////////////////////
  61. // Construction/Destruction
  62. //////////////////////////////////////////////////////////////////////

  63. CSMTP::CSMTP()
  64. {
  65.         m_NoOfTo = 0;
  66.         m_SMTPServer.Create();
  67. }

  68. CSMTP::~CSMTP()
  69. {
  70.         m_SMTPServer.Close();
  71. }

  72. // Connect to the SMTP Server
  73. BOOL CSMTP::Connect()
  74. {
  75.         return Connect(m_Host,m_From);
  76. }

  77. // Connect to the SMTP Server
  78. BOOL CSMTP::Connect(CString Host,CString From)
  79. {
  80.         if (!m_SMTPServer.Connect(Host,25)) // 25 for SMTP Port
  81.         {
  82.                 m_ErrorMessage = _T("Server cannot be connected");
  83.                 return FALSE;
  84.         }
  85.         else
  86.         {
  87.                 if(CheckResponse(CONNECTION_CHECK)==FALSE)
  88.                         return FALSE;
  89.                
  90.                 char buf [512];
  91.                
  92.                 wsprintf (buf, "HELO %s\r\n", (LPCSTR) From);
  93.                 m_SMTPServer.Send(buf, strlen (buf));
  94.                 if (CheckResponse(HELLO_CHECK)==FALSE)
  95.                         return FALSE;
  96.                 else
  97.                         return TRUE;
  98.                
  99.                 return TRUE;
  100.         }
  101. }

  102. // Setting the Host String
  103. void CSMTP::SetHost(CString Host)
  104. {
  105.         m_Host = Host;
  106. }

  107. // Returing the Host String
  108. CString CSMTP::GetHost()
  109. {
  110.         return m_Host;
  111. }

  112. // Sending the "QUIT" command to the SMTP Server
  113. BOOL CSMTP::Disconnect()
  114. {
  115.         char buf[256];
  116.         
  117.         wsprintf (buf, "QUIT \r\n");
  118.         m_SMTPServer.Send(buf, strlen (buf));
  119.         if (CheckResponse(QUIT_CHECK)==FALSE)
  120.                 return FALSE;
  121.         else
  122.                 return TRUE;
  123. }

  124. // Sending the "MAIL" command to the SMTP Server
  125. BOOL CSMTP::Mail(CString from)
  126. {
  127.         char buf[256];
  128.         
  129.         wsprintf (buf, "MAIL From:<%s>\r\n", (LPCSTR) from);
  130.         m_SMTPServer.Send(buf, strlen (buf));
  131.         if (CheckResponse(MAIL_CHECK)==FALSE)
  132.                 return FALSE;
  133.         else
  134.                 return TRUE;
  135. }

  136. // Setting the From string
  137. void CSMTP::SetFrom(CString from)
  138. {
  139.         m_From = from;
  140. }

  141. // Returing the From string
  142. CString CSMTP::GetFrom()
  143. {
  144.         return m_From;
  145. }

  146. // Setting the TO string
  147. BOOL CSMTP::SetTo(CString to)
  148. {
  149.         char buf[256];
  150.         m_To.Add(to); // Saving vale of to
  151.         
  152.         wsprintf (buf, "RCPT TO:<%s>\r\n", (LPCSTR) to);
  153.         m_SMTPServer.Send(buf, strlen (buf));
  154.         if (CheckResponse(RCPT_CHECK)==FALSE)
  155.                 return FALSE;
  156.         else
  157.                 return TRUE;
  158.         
  159. }

  160. // Returing the TO string
  161. CString CSMTP::GetTo()
  162. {
  163.         if(m_To.GetSize()>=m_NoOfTo)
  164.         {
  165.                 m_NoOfTo++;
  166.                 return m_To[m_NoOfTo-1];
  167.         }
  168.         else
  169.                 return _T("No more To available");
  170. }

  171. // Sending the "DATA" command to the SMTP Server
  172. BOOL CSMTP::Data(CString Subject, CString Body)
  173. {
  174.         char buf[256];
  175.         
  176.         wsprintf (buf, "DATA\r\n");
  177.         
  178.         m_SMTPServer.Send(buf, strlen (buf));
  179.         if (CheckResponse(DATA_CHECK)==FALSE)
  180.                 return FALSE;
  181.         else
  182.         {
  183.                 wsprintf (buf, "SUBJECT:%s\r\n", (LPCSTR) Subject);
  184.                 m_SMTPServer.Send(buf, strlen (buf));
  185.                
  186.                 wsprintf (buf, "%s\r\n", (LPCSTR) Body);
  187.                 m_SMTPServer.Send(buf, strlen (buf));
  188.                
  189.                 wsprintf (buf, ".\r\n");
  190.                 m_SMTPServer.Send(buf, strlen (buf));
  191.                
  192.                 return TRUE;
  193.         }
  194. }

  195. // This methods checks the response from the
  196. // Server
  197. BOOL CSMTP::CheckResponse(int Type)
  198. {
  199.         char buf [1000];
  200.         char temp[3];
  201.         
  202.         for (int i=0;i < 512;i++)
  203.                 buf[i]='\0';
  204.         
  205.         // Receive the data from Server
  206.         m_SMTPServer.Receive(buf, sizeof(buf));
  207.         strncpy(temp,buf,3);
  208.         int temp2 = atoi(temp);
  209.         switch (Type)
  210.         {
  211.         case CONNECTION_CHECK:
  212.                 if (temp2 != 220)
  213.                 {
  214.                         m_ErrorMessage = GetError((LPCTSTR)buf);
  215.                         return FALSE;
  216.                 }
  217.                 break;
  218.                
  219.         case HELLO_CHECK:
  220.                 if (temp2 != 250)
  221.                 {
  222.                         m_ErrorMessage = GetError((LPCTSTR)buf);
  223.                         return FALSE;
  224.                 }
  225.                 break;
  226.         case MAIL_CHECK:
  227.                 if (temp2 != 250)
  228.                 {
  229.                         m_ErrorMessage = GetError((LPCTSTR)buf);
  230.                         return FALSE;
  231.                 }
  232.                 break;
  233.         case RCPT_CHECK:
  234.                 if (temp2 != 250)
  235.                 {
  236.                         m_ErrorMessage = GetError((LPCTSTR)buf);
  237.                         return FALSE;
  238.                 }
  239.                 break;
  240.         case DATA_START_CHECK:
  241.                 if (temp2 != 354)
  242.                 {
  243.                         m_ErrorMessage = GetError((LPCTSTR)buf);
  244.                         return FALSE;
  245.                 }
  246.                 break;
  247.         case DATA_END_CHECK:
  248.                 if (temp2 != 250)
  249.                 {
  250.                         m_ErrorMessage = GetError((LPCTSTR)buf);
  251.                         return FALSE;
  252.                 }
  253.                 break;
  254.         case QUIT_CHECK:
  255.                 if (temp2 != 221)
  256.                 {
  257.                         m_ErrorMessage = GetError((LPCTSTR)buf);
  258.                         return FALSE;
  259.                 }
  260.                 break;
  261.         case DATA_CHECK:
  262.                 if (temp2 != 354)
  263.                 {
  264.                         m_ErrorMessage = GetError((LPCTSTR)buf);
  265.                         return FALSE;
  266.                 }
  267.                 break;
  268.                
  269.         }
  270.         return TRUE;
  271. }

  272. // Returing the Error Message
  273. CString CSMTP::GetErrorMessage()
  274. {
  275.         return m_ErrorMessage;
  276. }

  277. // Preparing the Error Message according to
  278. // Error Number
  279. CString CSMTP::GetError(CString Response)
  280. {
  281.         if(Response.Find("211"))
  282.                 return _T("System status or system help reply");
  283.         if(Response.Find("214"))
  284.                 return _T("Help Message");
  285.         if(Response.Find("220"))
  286.                 return _T("Service is ready");
  287.         if(Response.Find("221"))
  288.                 return _T("Service closing transmission channel");
  289.         if(Response.Find("250"))
  290.                 return _T("Requested mail action okay, completed");
  291.         if(Response.Find("251"))
  292.                 return _T("user not local: will forward to forward path");
  293.         if(Response.Find("354"))
  294.                 return _T("Start mail input; end with <CRLF>.<CRLF>");
  295.         
  296.         return _T("No Error Number is matched with ")+Response;
  297. }
  298. // Just overloading of the Mail method
  299. BOOL CSMTP::Mail()
  300. {
  301.         return Mail(m_From);
  302. }
复制代码

下面是该类的使用举例:
CSMTP m_smtp;
m_smtp.Connect("khi.compol.com","aasif@khi.compol.com");
m_smtp.Mail("aasif@khi.compol.com");
m_smtp.SetTo("zafir@home.com");
m_smtp.Data("test message","This is a test message ... ");
m_smtp.Disconnect();
回复

使用道具 举报

快速回复 返回列表 客服中心 搜索