📄 gsmtp.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 + -