E-Mail aus Anwendung schicken



  • Frage1 schrieb:

    Warum braucht man eigentlich immer einen SMTP Server, um Mails zu versenden? Kann man nicht direkt mit dem Zielserver kommunizieren? Kennt ihr eine lib? Wenn möglich für C/C++ und PHP.

    Sich direkt mit dem Ziel-SMTP-Server zu verbinden und die eMail dort abzuliefern hat mehrere Probleme, z.B.:
    - Sehr viele Mailserver blockieren dynamische IP-Adressen, akzeptieren keine eMails von dynamischen IPs oder sortieren die eMails direkt in den Spam-Ordner
    - Mailversand kann wegen Techniken wie Greylisting fehlschlagen

    -------

    Beim Weg über MAPI gibt es bei codeproject recht viel:
    http://www.codeproject.com/KB/IP/#MAPI



  • Sorry, ich meinte eigentlich, von einem dedicated server mit fixer IP aus eine Mail zu versenden.
    Da trifft das dann ja nicht zu?
    Weil wozu sollte main auf einem ded. server einen SMTP Server laufen lassen, nur weil man eine Mail verschicken will?



  • Hier ist die von mir gefundende Lösung (das meiste abgeschrieben):

    #include <windows.h>
    #include <mapi.h>
    
        LPMAPILOGON     lpfnMapiLogon;
        LPMAPISENDMAIL  lpfnMapiSendMail;
        LPMAPILOGOFF    lpfnMapiLogoff;
        HANDLE          hMAPILib;
        ULONG           ulLogon;
        ULONG           ulLogoff;
        ULONG           ulSendMail;
        LHANDLE         lhSession;
        char            email[]     = "SMTP:xxxxxx@xxxxxx.xxx";
        char            subject[60] = "";  // Betreffzeile
        char            note[512]   = "";  // Test der E-Mail
    
    //  .. MAPI-Struktur Empfaenger
        MapiRecipDesc recipient =
        {
           0,            // ulReserved
           MAPI_TO,      // ulRecipClass
           "",           // lpszName
           email,        // lpszAddress = Adresse des Empfaengers 
           0,            // ulEIDSize
           NULL          // lpEntryID
        };
    //  .. MAPI-Struktur Inhalte der E-Mail
        MapiMessage message =
        {
           0,            // reserved
           subject,      // lpszSubject  = Text des Betreffs 
           note,         // lpszNoteText = Text der E-Mail
           NULL,         // lpszMessageType
           NULL,         // lpszDateReceived
           NULL,         // lpszConersationID
           0,            // flFlags
           NULL,
           1,            // nRecipCount  = nur 1 Empfaenger
           &recipient,   // lpRecips     = Struktur des Empfaengers
           0,            // nFileCount
           NULL          // lpFiles
        };
    
    //  .. MAPI-Lib laden
           hMAPILib = LoadLibrary("MAPI32.DLL");
    
    //  .. email vervollständigen (kann bei Bedarf durch Benutzereingaben erfolgen) 
           strcpy(subject,"Betreff: Test E-Mail aus einem Programm senden");
           strcpy(note,"Hallo, hier ist eine Testmail\n\nViele liebe Grüsse)";
    
    //  .. MAPI-Adressen holen
           lpfnMapiLogon    = (LPMAPILOGON)GetProcAddress(hMAPILib,"MAPILogon");
           lpfnMapiSendMail = (LPMAPISENDMAIL)GetProcAddress(hMAPILib,"MAPISendMail");
           lpfnMapiLogoff   = (LPMAPILOGOFF)GetProcAddress(hMAPILib,"MAPILogoff");
    
    //  .. MAPI-Funktionen aufrufen (return-Werte ggfs. zur Kontrolle)
           ulLogon    = (*lpfnMapiLogon)(0,NULL,NULL,0,0,&lhSession);
           ulSendMail = (*lpfnMapiSendMail)(lhSession,0,&message,0,0);
           ulLogoff   = (*lpfnMapiLogoff)(lhSession,0,0,0);
    
    //  .. MAPI-Lib freigeben
           FreeLibrary(hMAPILib);
    

    Klar, betrachten E-Mail-Server das als verdächtig, sowohl auf der Seite des Senders als auch auf der Seite des Empfängers. Mit dem Anmeckern muss und kann man leben, auch wenn es im Spam-Ordner ankommt. Für den vorgesehen Zweck reicht es!


Anmelden zum Antworten