E-Mail aus Anwendung schicken



  • Die beste Variante ist wohl einfach ein Skript (z.B. PHP) auf einem Webserver aufzurufen?!



  • Ist schon die beste, und gängigste Variante. Doch ein extra Webserver für ein kleines Programm, ich weis nicht. Wenn man all den aufwand vergleicht...hilst du Dir am besten die Account infos vom User.
    Den aufwand wäre von mir aus gesehen zu hoch. Wenn man den bei allem von 0 anfängt.

    Webserver :
    hardening
    firewall
    domain name alt. ddns
    script , cgi
    authorisierung beim webserver, da sonnst missbrauch oder andrrwertige attk's
    möglich sind.
    Und da musst Du die Credentials auch im Programm unterbringen..Somit Auch wieder Angreifbar, ausser mit asymmetrischer krypto... doch dann ist der Aufwand gross!
    Also alles in allem ein riesen Aufwand.



  • @highbyte: wirst du deine library für alle öffentlich zur verfügung stellen oder nur für berniebutt?



  • magicbyte schrieb:

    @highbyte: wirst du deine library für alle öffentlich zur verfügung stellen oder nur für berniebutt?

    Werde sie auf vpn23.homelinux.org veröffentlichen sowie die pop3 library die ich parallel dazu entwckelt habe. Beide stehen unter der LGPL V3.
    Wenn ich dazukomme werde ich sie spät in der Nacht Online stellen ansonsten im verlaufe Nächste Woche.



  • 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.



  • 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.

    🙄



  • Es besteht auch die Möglichkeit das "Neue E-Mail" Fenster des Standard-EMail Programms aufzurufen, um die Mail einfach über die Adresse des Benutzers zu verschicken. Wenn es dir in deinem Programm nur um eine simple Feedback Funktion geht wäre dies wohl dann der beste Ansatz. Hier noch ein paar Infos zur Implementierung: http://stackoverflow.com/questions/1820489/creating-a-new-email-message-using-the-default-email-program



  • player424 schrieb:

    Es besteht auch die Möglichkeit das "Neue E-Mail" Fenster des Standard-EMail Programms aufzurufen, um die Mail einfach über die Adresse des Benutzers zu verschicken. Wenn es dir in deinem Programm nur um eine simple Feedback Funktion geht wäre dies wohl dann der beste Ansatz. Hier noch ein paar Infos zur Implementierung: http://stackoverflow.com/questions/1820489/creating-a-new-email-message-using-the-default-email-program

    Und wenn der User kein Standard Mail Programm hat?



  • Und wenn der Benutzer keinen Computer hat kann er das Programm gar nicht erst ausführen 😉 .
    Ne Spass beiseite. Die Frage ist durchaus berechtigt. Allerdings, wenn dies wirklich nur ein kleines Projekt werden soll und die Mail-Funktion nur ein optionaler Bestandteil ist finde ich persönlich die Lösung immer noch am elegantesten.
    Ein extra Account für das Programm zu erstellen um sich mit nem SMTP Server zu "unterhalten" ist, meiner Meinung nach, keine gute Idee, wg. bereits genanten Punkten. Da würd ich lieber das Risiko mit dem EMail-Programm eingehen 😃 . Notfalls kann man die EMail-Adresse auch in eine Readonly-Textbox packen, sodass der Nutzer sie dann in sein Web-Frontend einfügen kann.
    Wenn der Benutzer auch keine EMail-Adresse hat, denke ich, wird er auch nicht unbedingt in der Lage sein die Funktion zu nutzen da er evt. eine Antwort erhält/erhalten sollte.
    Aber solange wir den genauen Sinn der Funktion nicht kennen kann man hier auch keine genaue Aussage treffen. Ich wollte meinen Vorschlag nur mal in die Runde geworfen haben.

    Grüsse
    player424



  • -lowbyte- schrieb:

    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.

    🙄

    😕



  • player424 schrieb:

    Aber solange wir den genauen Sinn der Funktion nicht kennen kann man hier auch keine genaue Aussage treffen.

    Ganz einfacher Sinn: Ich schmeisse online ein Programm unters Volk und erhoffe Rückantworten der Benutzer. Hierzu soll es quasi ein Kontaktformular als Dialog geben. Wenn der Benutzer den Button 'Senden' klickt, soll sein Text an meine E-Mail-Adresse gehen ohne diese explizit anzugeben.

    Zur Information: Inzwischen läuft der erste Versuch mit MAPI32.DLL einwandfrei. Die Texte 'subject' und 'message' müssen mit Linefeed \n abgeschlossen werden. Das hatte ich übersehen. Den Rest kriege ich auch noch auf die Reihe.

    Danke für alle Antworten. Das Thema scheint allgemein interessant zu sein.



  • Hallo, warum benutzt du nicht einfach WinSock? So habe ich es früher mal gemacht schau dir mal diese Links an:

    http://de.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol

    Du kannst dir auch mit www.wireshark.org mal anschauen was z.b. Outlook da so macht. (Das hat mir früher auch geholfen Benutzername und Passwort werden in Base64 kodiert, das heißt wenn z.b. ein Benutzer eingibt example@example.com dann muss das example@example.com in Base64 kodiert werden.)

    Hier ein Base64 kodierer [nicht von mir]:

    #include "base64.h"
    #include <iostream>
    
    static const std::string base64_chars = 
                 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                 "abcdefghijklmnopqrstuvwxyz"
                 "0123456789+/";
    
    static inline bool is_base64(unsigned char c)
    {
     // return (isalnum(c) || (c == '+') || (c == '/')   );
    }
    
    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;
    }
    

    base64.h

    #include <string>
    
    std::string base64_encode(unsigned char const* , unsigned int len);
    

    Und nicht das \n vergessen. (Ja ich weiss das Datum hier ist falsch, GetLocalTime wäre dort wohl besser...)

    string send_mail ="From: <example@example.com>\n";
           send_mail+="To: <example@example.com>>\n";
           send_mail+="Subject: hallo ich bin der betreff\n";
           send_mail+="Date: We, 9 Jun 2010 12:10:00\n";
    
           send_mail+="Ich bin Text Zeile 1 der email \n";
    
           send_mail+="\n";  // <-- so macht man einen Zeilenumbruch in der Email
    
           send_mail+="Ich bin Text Zeile 2 der email\n";
           send_mail+=".\n";
    


  • Ich glaube man kann den Thread schliessen, das gespame von kiddies muss nich sein!



  • laberte er schrieb:

    Ich glaube man kann den Thread schliessen, das gespame von kiddies muss nich sein!

    Richtig: Den Thread kann man schliessen, weil auf verschiedene Weise auch für nicht-kiddies ohne Spam-Absichten lösbar. Über den Sinn und Zweck kann man reden! :p



  • Nein, denn ich bin noch offen.



  • 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