C++ 使用smtp協議傳送郵件的簡單實現
阿新 • • 發佈:2019-01-07
心血來潮,簡單實現一個傳送郵件的小程式,
首先實現一個簡單的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郵箱
效果圖