E-Mail senden funktioniert nicht...warum?



  • Hallo an alle,

    ich habe volgendes bei mir ausprobiert um eine E-Mail zu versenden....

    #include "stdafx.h"
    #include <cstdio> 
    #include <windows.h> 
    #include <mapi.h> 
    #include <tchar.h> 
    #include <iostream> 
    
    using namespace std;
    
    // #define NUM_ELEMENTS(x)  (sizeof((x)) / sizeof((x)[0]))										// Für automatische Erkennung
    
    int _tmain(void)																			//
    {																							//
       LPMAPISENDMAIL pfnSendMail;																//
       MapiRecipDesc  rdOriginator;																//
       MapiRecipDesc  rdRecipient[1];															// Anzahl der Empfänger
       LPMAPILOGOFF   pfnLogoff;																//
       LPMAPILOGON    pfnLogon;																	//
       MapiMessage    mapimsg;																	//
       HINSTANCE      hDll;																		//
       LHANDLE        lHnd;																		//
    //   MapiFileDesc   mapifiledesc[1];															// Fileangaben
    
       if(NULL == (hDll = LoadLibrary(TEXT("MAPI32.DLL"))))	{									// Test ob DLL vorhanden
           _tprintf(TEXT("could not load mapi32.dll, ErrorCode: %u"), GetLastError());			//
           return(0);																			//
       }																						//
    
       pfnLogon    = (LPMAPILOGON)GetProcAddress(hDll, "MAPILogon");							// Die Funktionen aus der DLL holen
       pfnLogoff   = (LPMAPILOGOFF)GetProcAddress(hDll, "MAPILogoff");							//
       pfnSendMail = (LPMAPISENDMAIL)GetProcAddress(hDll, "MAPISendMail");						//
    
       pfnLogon(0, NULL, NULL, 0, 0, &lHnd);													// Einloggen
    
       mapimsg.ulReserved			= 0;														//
       mapimsg.lpszSubject			= "Subject";												//
       mapimsg.lpszNoteText			= "Warnmeldung Speicherauslastung!\n";			// E-Mailtext
       mapimsg.lpszMessageType		= NULL;														//
       mapimsg.lpszDateReceived		= NULL;														//
       mapimsg.lpszConversationID	= NULL;														//
       mapimsg.flFlags				= 0;														//
    //   mapimsg.lpOriginator			= &rdOriginator;											// Für die mit zu sendenden Dateien
    //   mapimsg.nRecipCount			= NUM_ELEMENTS(rdRecipient);								// 
    //   mapimsg.lpRecips				= rdRecipient;												//
    //   mapimsg.nFileCount			= 0;														// 0 Dateien anhängen
    //   mapimsg.lpFiles				= &mapifiledesc[0];											//
    
       rdOriginator.ulReserved		= 0;														// Daten zum Sender
       rdOriginator.ulRecipClass	= MAPI_ORIG;												//
       rdOriginator.lpszName		= "Server";													// Sendername
       rdOriginator.lpszAddress		= "glassfish@server.de";											// Senderadresse
       rdOriginator.ulEIDSize		= 0;														//
       rdOriginator.lpEntryID		= NULL;														//
    
       rdRecipient[0].ulReserved	= 0;														// Daten zum EMpfänger
       rdRecipient[0].ulRecipClass	= MAPI_TO;													//
       rdRecipient[0].lpszName		= "Fill";												// Empfängername
       rdRecipient[0].lpszAddress	= "pkohlerer@gmx.de";						// Empfängeradresse
       rdRecipient[0].ulEIDSize		= 0;														//
       rdRecipient[0].lpEntryID		= NULL;														//
    //** Für Dateien versenden hier erweitern
       pfnSendMail(lHnd, NULL, &mapimsg, 0, 0);													// Das eigentliche Versenden der E-Mail
       pfnLogoff(lHnd, 0, 0, 0);																// Ausloggen
    
       FreeLibrary(hDll);																		// Aus dem Speicher entfernen
    
       return(0);
    }
    

    Die intension hierfür ist, dass ich diese Funktion nachher benutzen möchte um mir automatisch eine Message zukommen zu lassen, sollte die Speicherauslastung meines Servers im ROten bereich sein.

    Es Debuggen und Compilieren super...aber es kommt nichts an!?!?

    Woran könnte das liegen? Mache ich etwas falsch?
    Weiß jm weiter?

    Über Message würde ich mich super freuen

    grüße FIll



  • Hallo, das kann verschiedene Gründe habe.

    - Email Header ist inkorrekt
    - Die Funktion zum Email versenden ist fehlerhaft. (Ich sehe gerade das du anscheind eine MFC Funktion benutzt da sind dann vielleicht die Parameter falsch bzw. Struktur falsch initialisiert.)
    - Server ist nicht erreichbar

    Ich hab mal vor einer Zeit ein Programm zum Email versenden geschrieben. Ich hab da alles direkt mit Sockets gemacht.

    Ich hab dir mal einen Request gebaut den musste halt noch etwas anpassen und denn kannst du dann versenden an den Server. (Manche Server akzeptieren kein Standard SMTP soweit ich weiss)

    string Request[]= {
    "EHLO mypc\r\n",
    "AUTH LOGIN\r\n",
    "UserNameInBase64Codiert\r\n",
    "PasswortInBase64Codiert\r\n",
    "MAIL FROM:<example@example.com>\r\n",
    "RCPT TO:<example@example.com>\r\n" ,
    "DATA\r\n",
    "From: <example@example.com>\n"
    "To: <example@example.com>\n"
    "Subject: Test mail\n"
    "Date: Tue, 3 Sep 2012 14:45:00\n"
    "\r\n"
    "hallo das ist ein test\n"
    "\r\n.\r\n",
    "QUIT\r\n"
    };
    

    Les dir das hier einfachmal durch:
    http://de.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol
    und schau auch mal in die RFC´s. (Die sind in dem Artikel ganz unten)

    Außerdem lad dir Wireshark runter, ich mein du hast da ja schon was zusammengebaut schau doch einfach mal mit Wireshark was da wirklich versendet wird.

    pfnSendMail <-- Ist das aus der MFC? Falls du das mit der MFC realisieren willst da hab ich das hier gefunden: (Ich selbst hab kp von der MFC)

    http://www.codeguru.com/cpp/i-n/internet/email/article.php/c3421/SMTP-MFC-Classes.htm

    Base64 Encoder (Ist nicht von mir):

    #include <iostream>
    
    static const std::string base64_chars = 
                 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                 "abcdefghijklmnopqrstuvwxyz"
                 "0123456789+/";
    
    std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
      std::string ret;
      int i = 0;
      int j = 0;
      unsigned char char_array_3[3];
      unsigned char char_array_4[4];
    
      while (in_len--) {
        char_array_3[i++] = *(bytes_to_encode++);
        if (i == 3) {
          char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
          char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
          char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
          char_array_4[3] = char_array_3[2] & 0x3f;
    
          for(i = 0; (i <4) ; i++)
            ret += base64_chars[char_array_4[i]];
          i = 0;
        }
      }
    
      if (i)
      {
        for(j = i; j < 3; j++)
          char_array_3[j] = '\0';
    
        char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
        char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
        char_array_4[3] = char_array_3[2] & 0x3f;
    
        for (j = 0; (j < i + 1); j++)
          ret += base64_chars[char_array_4[j]];
    
        while((i++ < 3))
          ret += '=';
    
      }
      return ret;
    }
    


  • Hey und danke,

    hatte mir auch lange überlegt das über ein socket zu machen, aber da bin ich ein voller Blindfisch was die thematik angeht.

    Daher dachte ich ich dann das geschicht in c++ mit dem mapi machen...

    na daran hätte ich auch denken können mal mein wireshark an zu werfen:) den habe ich schon wieder fast vergessen


Anmelden zum Antworten