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

📄 inetserverdlg.cpp

📁 一个SMTP邮件发送的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// InetServerDlg.cpp : implementation file
//

//This is InetServ. :-)

//Under development by Bruce Peresky (1999/2000)
//Origional Design by Thomas Kuiper
//MAPI support by Mohamed Yasin
//DNS Lookup based on the code of David Lawlor

//NO WARRANTY!
//
//BECAUSE THE PROGRAM AND SOURCE IS FREE OF CHARGE, THERE IS NO WARRANTY
//FOR THIS, THE PROGRAM AND SOURCE IS PROVIDED "AS IS" WITHOUT
//WARRANTY OF ANY KIND, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
//THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
//SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
//SERVICING, REPAIR OR CORRECTION.
//INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY
//TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
//RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE
//OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR
//OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
//

#include "stdafx.h"
#include "InetServer.h"
#include "InetServerDlg.h"
#include "Pop2cmc.h"   //- MAPI forwarder by yasin
#include "wrap2cmc.h"   //- MAPI cmc wrapper include
#include <direct.h> //used for mkdir
#include "dnsmx.h" 
#include "tools.h"
#include "mapicfg.h"
#include "base64str.h"

#define CURVER "3.1.1" //increment here
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern Wrap2CMC CMCObject ;  //- MAPI CMC wrapper object

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
#define WM_MY_TRAY_NOTIFICATION WM_USER+0 //this is for the cool little icon
#define WM_ADDLOG WM_USER+1 //and this is for logging of the smtp sender thread
#define WM_CLOSEWEB WM_USER+2

static CString statLogStr; //for logging



class CAboutDlg : public CDialog
{
public:
	CAboutDlg();
	CInetServerDlg* m_pDoc;
	// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	CStatic	mc_about;
	CButton	mc_ok;
	CString	m_ver;
	//}}AFX_DATA
	
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL
	
	// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	afx_msg void OnOk();
	afx_msg void OnReg();
	virtual BOOL OnInitDialog();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	m_ver = _T("");
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	DDX_Control(pDX, IDC_ABOUT, mc_about);
	DDX_Control(pDX, IDOK, mc_ok);
	DDX_Text(pDX, IDC_S, m_ver);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
ON_BN_CLICKED(IDOK, OnOk)
ON_BN_CLICKED(IDC_REG, OnReg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//global exchange via threads:

static int SMTPtodo = 0;
static int SMTPbusy = 0;
CArray<SMTPForwardInfo,SMTPForwardInfo> SMTPForwardList;
static HANDLE pop3threadhandle[20];

static unsigned long POP3ThreadID[20];
static char pop3fname[20][255];
static CClientSocket *pop3pSocket[20];
static int pop3threadcount = 0;


int SendSmtpMail(int litem);
int SendPop3Mail(int num);
int SendErrorMail(int curitem);

int SendPop3Mail(int num)
{
	BOOL doabort = FALSE;

	if (num >= 100)
	{
		doabort = TRUE;
		num = num -100;

	}
	
	FILE *outmail;
	char outstr[255];
	int err = 0;
	
	if( (outmail= fopen(pop3fname[num], "rb" )) != NULL )
	{
		
		while (!feof(outmail))
		{
			
			fgets(outstr,254,outmail);
			outstr[strlen(outstr)-2] = '\n';
			outstr[strlen(outstr)-1] = '\0';
			
			if (!feof(outmail))
			{	
				
				pop3pSocket[num]->Send (outstr,strlen(outstr),0);
				err = GetLastError();
				
				if(err == WSAEWOULDBLOCK)
				{
					while(err == WSAEWOULDBLOCK)
					{
						pop3pSocket[num]->Send (outstr,strlen(outstr),0);
						err = GetLastError();
					}
					
					
				}
				
				if(err == WSANOTINITIALISED   ){ break;}
				if(err == WSAENETDOWN   ) {break;}
				if(err == WSAEACCES   ){ break;}
				if(err == WSAEINPROGRESS   ){ break;}
				if(err == WSAEFAULT   ){ break;}
				if(err == WSAENETRESET   ) {break;}
				if(err == WSAENOBUFS   ){ break;}
				if(err == WSAENOTCONN   ) {break;}
				if(err == WSAENOTSOCK   ) {break;}
				if(err == WSAEOPNOTSUPP   ){ break;}
				if(err == WSAESHUTDOWN   ){ break;}
				if(err == WSAEMSGSIZE   ){ break;}
				if(err == WSAEINVAL   ){ break;}
				if(err == WSAECONNABORTED   ){ break;}
				if(err == WSAECONNRESET   ) {break;}
				
			}
		}
		fclose(outmail);
		
	}						
	
	if (doabort == TRUE)
	{
	
		SendMessage(AfxGetMainWnd()->m_hWnd,WM_CLOSEWEB,num,0);
				
	}


	pop3threadcount--;
	CloseHandle(pop3threadhandle[num]);
	return 0;
}

void SmtpSender()
{
	time_t the_time;
	char temps[255];
	char tempstr1[255];
	int curitem = -1;
	for (;;)
	{
		
		
		Sleep(1000); //zzz, every second we check if we should send a mail
		
		
		
		
		sprintf(tempstr1,"%s",GetReg("Software\\InetServ","RelayType"));
		if (atoi(tempstr1) != -1)
		{
			
			
			
			
			if(SMTPForwardList.GetSize()>0)
			{
				
				
				for (int li= 0;li<=SMTPForwardList.GetSize()-1;li++)
				{
					
					
					
					
					
					curitem = li;
					if (SMTPForwardList[curitem].error == 0)
					{
						
						SMTPForwardList[curitem].sendnr = 0;
						statLogStr = "Trying to send mail (" + SMTPForwardList[curitem].Rcpt +")"; 
						SendMessage(AfxGetMainWnd()->m_hWnd,WM_ADDLOG,0,0);
						
						if (SendSmtpMail(curitem) == 0)
						{
							DeleteFile(SMTPForwardList[curitem].Fname);
							statLogStr = "Successfull SMTP mail send (" + SMTPForwardList[curitem].Rcpt +")"; 
							SendMessage(AfxGetMainWnd()->m_hWnd,WM_ADDLOG,0,0);
							SMTPForwardList.RemoveAt(curitem);
							break;
						}
						else
						{
							statLogStr = "Sending of SMTP mail (" + SMTPForwardList[curitem].Rcpt +") failed the first time."; 
							SendMessage(AfxGetMainWnd()->m_hWnd,WM_ADDLOG,0,0);
							time(&the_time);
							SMTPForwardList[curitem].timestamp = the_time;
							SMTPForwardList[curitem].error= 1;
							SMTPForwardList[curitem].sendnr++;
						}
						
						
						
						
					}
					else
					{
						
						sprintf(temps,"%s",GetReg("Software\\InetServ","RelaySMTPMaxtries"));
						if ((atoi(temps)) < SMTPForwardList[curitem].sendnr)
						{
							statLogStr = "Send mail (" + SMTPForwardList[curitem].Rcpt +") not possible after maximum tries.";
							SendMessage(AfxGetMainWnd()->m_hWnd,WM_ADDLOG,0,0);
							SendErrorMail(curitem);
							DeleteFile(SMTPForwardList[curitem].Fname);
							SMTPForwardList.RemoveAt(curitem);
							break;
						}
						
						time(&the_time);
						
						double tx = atof(GetReg("Software\\InetServ","RelaySMTPTryTime"));
						
						
						if (difftime(the_time,SMTPForwardList[curitem].timestamp) > tx*60)
						{
							statLogStr = "Trying to send failed mail again (" + SMTPForwardList[curitem].Rcpt +")"; 
							SendMessage(AfxGetMainWnd()->m_hWnd,WM_ADDLOG,0,0);
							
							SMTPForwardList[curitem].error = 0;
							
							if (SendSmtpMail(curitem) == 0)
							{
								statLogStr = "Successfull SMTP mail send (" + SMTPForwardList[curitem].Rcpt +")"; 
								SendMessage(AfxGetMainWnd()->m_hWnd,WM_ADDLOG,0,0);
								DeleteFile(SMTPForwardList[curitem].Fname);
								SMTPForwardList.RemoveAt(curitem);
								break;
							}
							else
							{
								time(&the_time);
								SMTPForwardList[curitem].timestamp = the_time;
								SMTPForwardList[curitem].error= 1;
								SMTPForwardList[curitem].sendnr++;
								statLogStr = "Could not send " + SMTPForwardList[curitem].Rcpt; 
								SendMessage(AfxGetMainWnd()->m_hWnd,WM_ADDLOG,0,0);
								
								
							}
							
						}
						
						
					}
					
					
					
					
				}
			}
		}
		
	}
}


int SendSmtpMail(int litem) //relay
{
	
	SOCKET         hServer;
	char           szBuffer[4096];
	SOCKADDR_IN    SockAddr;
	
	WSADATA        WSData;
	
	
	LPHOSTENT      lpHostEntry;
	int            iProtocolPort;
	char           ServerName[255];
	sprintf(ServerName,"%s",GetReg("Software\\InetServ","RelaySMTPName"));
	
	
	if ( WSAStartup(MAKEWORD(1, 1), &WSData) ) 
	{
		return 1;
	}
	
	lpHostEntry = gethostbyname(ServerName );
	if (lpHostEntry == NULL) 
	{
		WSACleanup();return 1;
		
	}
	
	hServer = socket( PF_INET, SOCK_STREAM, 0); 
	if (hServer == INVALID_SOCKET) 
	{
		closesocket( hServer );	WSACleanup();return 1;
		
	}
	
	
	
	
	
	
	
	
	iProtocolPort = htons(25);
	
	SockAddr.sin_family = AF_INET;
	SockAddr.sin_port = iProtocolPort;
	SockAddr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
	
	
	
	int stimeout = 60000;
	int rtimeout = 60000;
	
	int err;
	
	if (stimeout != 0) 
	{
		err = setsockopt(  hServer ,      SOL_SOCKET,     SO_SNDTIMEO,
			(char *)&stimeout,  sizeof(stimeout));
		if (err != NO_ERROR) 
		{
			closesocket( hServer );	WSACleanup();return 1;
			return 1;
		}
		
	}
	
	if (rtimeout != 0) 
	{
		err = setsockopt(  hServer ,      SOL_SOCKET,     SO_RCVTIMEO,
			(char *)&rtimeout,  sizeof(rtimeout));
		
		if (err != NO_ERROR) 
		{
			closesocket( hServer );	WSACleanup();return 1;
			
		}
		
	}
	if (connect( hServer, (PSOCKADDR) &SockAddr, sizeof(SockAddr)))
	{
		closesocket( hServer );	WSACleanup();return 1;
		
	}
	
	//AskError();
	
	
	int cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
	
	if (cnt == SOCKET_ERROR){ 	closesocket( hServer );	WSACleanup();return 1;}
	
	if (szBuffer[0] != '2') 
	{
		closesocket( hServer );	WSACleanup();return 1;
		
	}
	
	
	char sendstr[255];
	
	
	
	sprintf(sendstr,"HELO %s\r\n",GetReg("Software\\InetServ","SMTPHeloName"));
	cnt = send( hServer, sendstr, strlen(sendstr), 0);
	
	if (cnt == SOCKET_ERROR){ 	closesocket( hServer );	WSACleanup();return 1;}
	
	cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
	
	if (cnt == SOCKET_ERROR){ 	closesocket( hServer );	WSACleanup();return 1;}
	
	if (szBuffer[0] != '2') 
	{
		closesocket( hServer );	WSACleanup();return 1;
		
	}
	
	
	sprintf(sendstr,"%s",SMTPForwardList[litem].Sender);
	cnt = send( hServer, sendstr, strlen(sendstr), 0);
	
	if (cnt == SOCKET_ERROR){ 	closesocket( hServer );	WSACleanup();return 1;}
	
	cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
	
	if (cnt == SOCKET_ERROR){ 	closesocket( hServer );	WSACleanup();return 1;}
	
	if (szBuffer[0] != '2') 
	{
		closesocket( hServer );	WSACleanup();
		return 1;
	}
	
	
	
	sprintf(sendstr,"%s\r\n",SMTPForwardList[litem].Rcpt);
	cnt = send( hServer, sendstr, strlen(sendstr), 0);
	
	if (cnt == SOCKET_ERROR){ 	closesocket( hServer );	WSACleanup();return 1;}
	
	cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
	
	if (cnt == SOCKET_ERROR){ 	closesocket( hServer );	WSACleanup();return 1;}
	
	if (szBuffer[0] != '2') 
	{
		closesocket( hServer );	WSACleanup();
		return 1;
	}
	
	
	sprintf(sendstr,"DATA\r\n");
	
	cnt = send( hServer, sendstr, strlen(sendstr), 0);
	
	if (cnt == SOCKET_ERROR){ 	closesocket( hServer );	WSACleanup();return 1;}
	
	cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
	
	if (cnt == SOCKET_ERROR){ 	closesocket( hServer );	WSACleanup();return 1;}
	
	if (szBuffer[0] != '3')
	{
		closesocket( hServer );	WSACleanup();
		return 1;
	}
	
	
	
	FILE *fp = fopen(SMTPForwardList[litem].Fname,"rb");
	
	if (fp == NULL) {closesocket( hServer );	WSACleanup();return 1;}
	char tempstr[255];
	while(!feof(fp))
	{
		fgets(tempstr,255,fp);
		tempstr[strlen(tempstr)-2] = '\n';
		tempstr[strlen(tempstr)-1] = '\0';
		
		if (!feof(fp))
		{
			
			cnt = send( hServer, tempstr, strlen(tempstr), 0);
			if (cnt == SOCKET_ERROR){ fclose(fp);	closesocket( hServer );	WSACleanup();return 1;}
			
		}
		
	}
	fclose(fp);
	
	cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
	
	if (cnt == SOCKET_ERROR){ 	closesocket( hServer );	WSACleanup();return 1;}
	if (szBuffer[0] != '2')
	{
		closesocket( hServer );	WSACleanup();
		
		return 1;
	}
	
	
	
	sprintf(sendstr,"QUIT\r\n");
	
	cnt = send( hServer, sendstr, strlen(sendstr), 0);
	
	if (cnt == SOCKET_ERROR){ 	closesocket( hServer );	WSACleanup();return 1;}
	
	cnt = recv( hServer, szBuffer, sizeof(szBuffer), 0);
	

⌨️ 快捷键说明

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