?? inetserverdlg.cpp.bak
字號:
// 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" //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,255,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);
if (cnt == SOCKET_ERROR){ closesocket( hServer ); WSACleanup();return 1;}
if (szBuffer[0] != '2')
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -