1. 程式人生 > >C++ 使用smtp協議傳送郵件的簡單實現

C++ 使用smtp協議傳送郵件的簡單實現

心血來潮,簡單實現一個傳送郵件的小程式,

首先實現一個簡單的socket類

標頭檔案

#ifndef _CSOCKET_H_
#define _CSOCKET_H_

#include <sys/socket.h>
#include <arpa/inet.h>

#define BUFF_LEN 256

class CSocket
{
public:
   CSocket();
   ~CSocket();
   bool initialize(const char* ip, const int port);
   bool sendSocketMessage(const char* mesg);
   bool reviceSocketMessage();
   char* getReviceMessage();
private:
   int m_sockfd;
   char m_reciveBuff[BUFF_LEN];
   struct sockaddr_in m_add;
};

#endif //_CSOCKET_H_
類的實現
#include <unistd.h>
#include <string.h>
#include <memory.h>

#include <iostream>

#include "CSocket.h"

using namespace std;

CSocket::CSocket()
 :m_sockfd(-1)
{
   
}

CSocket::~CSocket()
{
   if(-1 != m_sockfd)
   {
      close(m_sockfd);
   }
}

bool CSocket::initialize(const char* ip, const int port)
{
   m_sockfd = socket(AF_INET, SOCK_STREAM, 0);
   if(-1 == m_sockfd)
   {
      cerr<<__FUNCTION__<<endl;
      return false;
   }

   m_add.sin_family = AF_INET;
   m_add.sin_port = htons(port);
   int retPton = inet_aton(ip, &m_add.sin_addr);
   if(-1 == retPton)
   {
      cerr<<__FUNCTION__<<endl;
   }

   int retConn = connect(m_sockfd, (struct sockaddr*)&m_add, sizeof(m_add));
   if(-1 == retConn)
   {
      cerr<<__FUNCTION__<<"connect error"<<endl;
   }
}

bool CSocket::sendSocketMessage(const char* mesg)
{
   int ret = send(m_sockfd, mesg, strlen(mesg), 0);
   if(-1 == ret)
   {
      cerr<<__FUNCTION__<<"send message error"<<endl;
      return false;
   }
   
   return true;
}

bool CSocket::reviceSocketMessage()
{
   memset(m_reciveBuff, 0x00, BUFF_LEN);
   int ret = recv(m_sockfd, m_reciveBuff, BUFF_LEN, 0);
   if(-1 == ret)
   {
      cerr<<__FUNCTION__<<"recv error"<<endl;
      return false;
   }

   cout<<"recv len"<<ret<<endl;
   return true;
}

char* CSocket::getReviceMessage()
{
   return m_reciveBuff;
}

main函式中通過smtp協議傳送郵件
#include "CSocket.h"
#include <iostream>
using namespace std;

int main()
{
   CSocket sock;
   sock.initialize("220.181.12.15", 25);
   sock.reviceSocketMessage();
   cout<<sock.getReviceMessage()<<endl;
   sock.sendSocketMessage("EHLO xxxxx\r\n");
   sock.reviceSocketMessage();
   cout<<sock.getReviceMessage()<<endl;
   sock.sendSocketMessage("auth login\r\n");
   sock.reviceSocketMessage();
   cout<<sock.getReviceMessage()<<endl;
   sock.sendSocketMessage("base64username");
   sock.sendSocketMessage("\r\n");
   sock.reviceSocketMessage();
   cout<<sock.getReviceMessage()<<endl;
   sock.sendSocketMessage("base64password");
   sock.sendSocketMessage("\r\n");
   sock.reviceSocketMessage();
   cout<<sock.getReviceMessage()<<endl;
   
   cout<<"*******************************"<<endl;
   sock.sendSocketMessage("mail from: <"); 
   sock.sendSocketMessage("
[email protected]
"); sock.sendSocketMessage(">"); sock.sendSocketMessage("\r\n"); sock.reviceSocketMessage(); cout<<sock.getReviceMessage()<<endl; sock.sendSocketMessage("rcpt to: <"); sock.sendSocketMessage("[email protected]"); sock.sendSocketMessage(">"); sock.sendSocketMessage("\r\n"); sock.reviceSocketMessage(); cout<<sock.getReviceMessage()<<endl; sock.sendSocketMessage("data\r\n"); sock.reviceSocketMessage(); cout<<sock.getReviceMessage()<<endl; cout<<"*********************"<<endl; sock.sendSocketMessage("subject:怎能錯過半隱路燈下的街景\r\n\rn"); sock.sendSocketMessage("怎能錯過半隱路燈下的街景"); sock.sendSocketMessage("\r\n.\r\n"); sock.reviceSocketMessage(); cout<<sock.getReviceMessage()<<endl; sock.sendSocketMessage("quit\r\n"); sock.reviceSocketMessage(); cout<<sock.getReviceMessage()<<endl; }
執行結果輸出

[email protected]:~/smtp$ g++ main.cpp CSocket.cpp -o t -g
[email protected]:~/smtp$ ./t
recv len65
220 163.com Anti-spam GT for Coremail System (163com[20141201])


recv len185
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFHfoShUCa0xDrUUUUj
250-STARTTLS
250 8BITMIME


recv len18
334 xxxxxxx


recv len18
334 xxxxxx


recv len31
235 Authentication successful


*******************************
recv len13
250 Mail OK


recv len13
250 Mail OK


recv len37
354 End data with <CR><LF>.<CR><LF>


*********************
recv len74
250 Mail OK queued as smtp11,D8CowADXL+YQlxtXwXBzBA--.38230S2 1461425936


recv len9
221 Bye

郵箱使用的163郵箱

效果圖