⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsmtp.cpp

📁 一个非常有用的开源代码
💻 CPP
字号:
#include "GSmtp.h"#include "../GClasses/GQueue.h"#include "../GClasses/GMacros.h"#include "../GClasses/GSocket.h"#include "../GClasses/GThread.h"#include <time.h>GSmtp::GSmtp(const char* szTo, const char* szFrom, const char* szSubject, const char* szMessage, const char* szSMPTServer){	m_pReceiveBuffer = new GQueue(256);	m_pSocket = NULL;	m_szFrom = szFrom;	m_szTo = szTo;	m_szSubject = szSubject;	m_szMessage = szMessage;	m_szSMPTServer = szSMPTServer;	m_eState = SS_Init;}GSmtp::~GSmtp(){	delete m_pSocket;	delete m_pReceiveBuffer;}void GSmtp::Send(){	m_pSocket = GSocketClient::ConnectToTCPSocket(m_szSMPTServer, 25);	if(!m_pSocket)		ThrowError(L"Failed to connect to %s on port %d", m_szSMPTServer, 25);	int nMessageSize;	unsigned char* pMessage;	time_t tStart, t;	time(&tStart);	while(true)	{		while(m_pSocket->GetMessageCount() > 0)		{			pMessage = m_pSocket->GetNextMessage(&nMessageSize);			Receive((const char*)pMessage, nMessageSize);		}		if(m_eState == SS_Close)			break;		time(&t);		if(t - tStart > 30)			ThrowError(L"Timed out");		GThread::sleep(100);	}}/*static*/ void GSmtp::SendEmail(const char* szTo, const char* szFrom, const char* szSubject, const char* szMessage, const char* szSMPTServer){	GSmtp* pSmtp = new GSmtp(szTo, szFrom, szSubject, szMessage, szSMPTServer);	pSmtp->Send();}// SMTP is a line-based protocol, so receive until we have a full linevoid GSmtp::Receive(const char* pBuff, int nLen){	int n;	int i = -1;	for(n = 0; n < nLen; n++)	{		if(pBuff[n] == '\n')			i = n;	}	if(i >= 0)	{		for(n = 0; n <= i; n++)			m_pReceiveBuffer->Push(pBuff[n]);		char* pLine = m_pReceiveBuffer->DumpToString();		ReceiveLine(pLine);		delete(pLine);		Receive(pBuff + i + 1, nLen - (i + 1));	}	else	{		for(n = 0; n < nLen; n++)			m_pReceiveBuffer->Push(pBuff[n]);	}}void GSmtp::ReceiveLine(const char* szLine){	char szBuff[1024];	if (m_eState == SS_Init && szLine[0] == '2')	{		strcpy(szBuff, "HELO there\r\n");		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));        	m_eState = SS_Mail;	}	else if (m_eState == SS_Mail && szLine[0] == '2')	{		strcpy(szBuff, "MAIL FROM:");		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		strcpy(szBuff, m_szFrom);		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		strcpy(szBuff, "\r\n");		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));        	m_eState = SS_Rcpt;	}	else if (m_eState == SS_Rcpt && szLine[0] == '2')	{		strcpy(szBuff, "RCPT TO:");		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		strcpy(szBuff, m_szTo);		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		strcpy(szBuff, "\r\n");		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		m_eState = SS_Data;	}	else if (m_eState == SS_Data && szLine[0] == '2')	{		strcpy(szBuff, "DATA\r\n");		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		m_eState = SS_Body;	}	else if (m_eState == SS_Body && szLine[0] == '3')	{		strcpy(szBuff, "From: ");		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		strcpy(szBuff, m_szFrom);		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		strcpy(szBuff, "\nTo: ");		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		strcpy(szBuff, m_szTo);		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		strcpy(szBuff, "\nSubject: ");		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		strcpy(szBuff, m_szSubject);		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		strcpy(szBuff, "\n\n");		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		m_pSocket->Send((unsigned char*)m_szMessage, strlen(m_szMessage));		strcpy(szBuff, "\n.\n");		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		m_eState = SS_Quit;	}	else if (m_eState == SS_Quit && szLine[0] == '2')	{		strcpy(szBuff, "QUIT\r\n");		m_pSocket->Send((unsigned char*)szBuff, strlen(szBuff));		m_eState = SS_Close;	}	else	{		ThrowError(L"Something's broken.  The SMTP server said %s", szLine);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -