心血来潮,简单实现一个发送邮件的小程序,
首先实现一个简单的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("xxxxx@163.com");
sock.sendSocketMessage(">");
sock.sendSocketMessage("\r\n");
sock.reviceSocketMessage();
cout<<sock.getReviceMessage()<<endl;
sock.sendSocketMessage("rcpt to: <");
sock.sendSocketMessage("xxxxxx@163.com");
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;
}
nap@nap-HP-431-Notebook-PC:~/smtp$ g++ main.cpp CSocket.cpp -o t -g
nap@nap-HP-431-Notebook-PC:~/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邮箱
效果图