Mailen mit C/C++???



  • Hy Leute,

    ich möchte ein c-Programm schreiben, was verschiedene Dateien im Anhang
    versenden kann. Um nicht wieder direkt was ins Forum zu posten habe ich
    mich mal über verschiedene Bibliotheken informiert, aber ich habe keine
    passende gefunden. Es gibt zum beispiel die Bibliothek smtp.h, doch hier
    gibt es immer verschiedene und da passt überhaupt nichts von zusammen. Hat
    vielleicht schon mal einer von Euch so ein Programm geschrieben und kennt
    bestimmte Bibliotheken die funktionieren?

    Danke schon mal für Eure Hilfe!

    Lippy



  • hi!
    nimm winapi, dann kommst du zur lösung like that:

    #include <windows.h>   
    #include <winsock.h> 
    
    #pragma comment (lib, "wsock32.lib") 
    
    #define HELO_MAX    4 
    
    BOOL    fHeloSenden (SOCKET) ; 
    BOOL    fBodySenden (SOCKET) ; 
    BOOL    fQuitSenden (SOCKET) ; 
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){   
        struct sockaddr_in        server ; 
        SOCKET                    sock ; 
        char                    command[200], 
                                buff[100], 
                                szHost[] = "mail.gmx.net" ; 
        unsigned int            iFor, 
                                iEmpfangen ; 
        short                    wVersionRequested ; 
        WSADATA                    wsaData ; 
        struct hostent            *he ; 
        ZeroMemory (&server, sizeof (sockaddr_in)) ; 
        wVersionRequested = MAKEWORD (1, 1) ; 
        WSAStartup (wVersionRequested, &wsaData) ; 
        if (!(he = gethostbyname (szHost))){ 
            MessageBox (NULL, "gethostbyname", "Fehler", NULL) ; 
            return 1 ; 
        } 
        if (he->h_addrtype != AF_INET){ 
            MessageBox (NULL, "AF_INET", "Fehler", NULL) ; 
            return 2 ; 
        } 
        if (!he->h_addr_list[0]){ 
            MessageBox (NULL, "he->h_addr_list[0]", "Fehler", NULL) ; 
            return 3 ; 
        }   
        server.sin_family = AF_INET ; 
        server.sin_port = htons (25) ; 
        server.sin_addr   = *(struct in_addr*) he->h_addr_list[0] ; 
        if ((sock = socket (PF_INET, SOCK_STREAM, 0)) == -1){ 
            MessageBox (NULL, "socket", "Fehler", NULL) ; 
            return 4 ; 
        } 
        if (connect (sock, (struct sockaddr*) &server, sizeof (struct sockaddr)) < 0){ 
            MessageBox (NULL, "connect", "Fehler", NULL) ; 
            return 5 ; 
        } 
        fHeloSenden (sock) ; 
        fBodySenden (sock) ; 
        fQuitSenden (sock) ; 
        closesocket (sock) ; 
        WSACleanup () ; 
        return 0 ; 
    } 
    
    BOOL fHeloSenden (SOCKET sock){ 
        char            *smtp[] = { 
                                    "HELO tescik\r\n", 
                                    "MAIL FROM: <email@email.de>\r\n", 
                                    "RCPT TO: <email@email.de>\r\n", 
                                    "DATA\r\n", 
                                    "From: ich\r\nTo: ich\r\nSubject: Test\r\n"} ; 
        char            command[100], 
                        buff[100] ; 
        unsigned int    iEmpfangen = 0, 
                        iFor = 0 ; 
        for(iFor = 0; iFor <= HELO_MAX; iFor++){ 
            strcpy (command, smtp[iFor]) ; 
            send (sock, command, lstrlen (command), 0) ; 
            if (iFor != HELO_MAX){ 
                iEmpfangen = recv (sock, buff, sizeof (buff), 0) ; 
                buff[iEmpfangen] = '\0' ; 
                MessageBox (NULL, (LPTSTR) buff, "empfang", NULL) ; 
            } 
        } 
        return 0 ; 
    } 
    
    BOOL fBodySenden (SOCKET sock){ 
        char            *smtp[] = { 
                                    "Mime-Version: 1.0\r\n", 
                                    "Content-Type: multipart/mixed; boundary=\"IstEineID\"\r\n\r\n", 
                                    "--IstEineID\r\n", 
                                    "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n", 
                                    "Content-Transfer-Encoding: 7bit\r\n\r\n", 
                                    "Teil 1 der email\r\n", 
                                    "--IstEineID\r\n", 
                                    "Content-Type: text/plain; charset=\"US-ASCII\"\r\n\r\n", 
                                    "Teil 2 der email (so zu sagen anhang... hehehe)\r\n", 
                                    "--IstEineID--"} ; 
        char            command[100], 
                        buff[100] ; 
        unsigned int    iEmpfangen = 0, 
                        iFor = 0 ; 
        for(iFor = 0; iFor <= 9; iFor++){ 
            strcpy (command, smtp[iFor]) ; 
            send (sock, command, lstrlen (command), 0) ; 
        } 
        return 0 ; 
    } 
    
    BOOL fQuitSenden (SOCKET sock){ 
        char            *smtp[] = { 
                                "\r\n.\r\n", 
                                "QUIT\r\n", 
                                "QUIT\r\n"} ; 
        char            command[100], 
                        buff[100] ; 
        unsigned int    iEmpfangen = 0, 
                        iFor = 0 ; 
        for(iFor = 0; iFor <= 2; iFor++){ 
            strcpy (command, smtp[iFor]) ; 
            send (sock, command, lstrlen (command), 0) ; 
            iEmpfangen = recv (sock, buff, sizeof (buff), 0) ; 
            buff[iEmpfangen] = '\0' ; 
            MessageBox (NULL, (LPTSTR)buff, "empfang", NULL) ; 
        } 
        return 0 ; 
    }
    

    bitte lies hier nach:
    http://www.c-plusplus.net/forum/viewtopic.php?t=59537&highlight=email+versenden

    oder da:
    http://www.c-plusplus.net/forum/search.php?mode=results

    see u!



  • Danke für die Antwort, aber diese Lösung läuft nur unter Windows und nicht Plattform unabhängig. Gibt es eine Möglichkeit ein Programm zu schreiben was nicht von dem Betriebssystem abhängig ist???

    Danke für Eure Mitarbeit!



  • @lippy, Sockets sind nun mal Platform abhängig. Jedoch kann man den Code von blacky relativ einfach nach Linux/Unix portieren. Unter www.ecst.csuchico.edu/~beej/guide/net/ findest du die dazu notwendigen Informationen. Außer der Initialisierung mit WSAStartup, welche nur unter Windows benötigt wird, ändert sich nicht viel.



  • Hy Leute,

    ich hab' keine Ahnung warum sich das Programm nicht compilieren lässt. Aber es kommen immer Linker-Errors beim compilieren.

    Lippy



  • wichtig wäre, zu wissen, welchen compiler du fährst.

    wenn du eine ide nimmst, achte darauf, daß du ein WIN32 projekt anlegst, keine win32 konsoelenapplikation.
    der einsprung ist eine win_main 😉

    das programm läuft so einwandfrei unter windows.



  • Hy elise,

    ich benutze den Bloodsheet Dev C++. Welchen Compiler benutzt du den???

    Lippy



  • Hallo,
    Also unter Unix würde ich auf alle Fälle den bereits installierten MTA des Systems verwenden; kein Grund das Rad neu zu erfinden!



  • Hy,

    ich versuche ja unter Windows zu programmieren und da ich bisher immer nur so billig Programme geschrieben habe weiss ich jetzt nicht genau wie das funktioniert.

    Lippy



  • hab ein problem mit dem programm oben

    und zwar sagt er bei der empfänger email danach unimplemented....aber warum?!
    der rest des programmes funktioniert...un die email etc auch, wenn ichs manuel eintipp...

    woran könnte das liegen?


Anmelden zum Antworten