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 erreichbarIch 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