Problem beim versenden einer Email



  • Hallo,

    Ich habe folgenden Code:

    #include <iostream>
    #include <windows.h>
    #include "winsock2.h"
    
    using namespace std;
    
    int main()
    {
      //----------------------
      // Initialize Winsock
      WSADATA wsaData;
      int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
      if (iResult != NO_ERROR)
        cout << "Konnte Winsock nicht initialisieren" << endl;
    
      //----------------------
      // Create a SOCKET for connecting to server
      SOCKET ConnectSocket;
      ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      if (ConnectSocket == INVALID_SOCKET) {
        cout << "Konnte Socket nicht erstellen!" << endl;
        WSACleanup();
        return 0;
      }
    
      //----------------------
      // The sockaddr_in structure specifies the address family,
      // IP address, and port of the server to be connected to.
      sockaddr_in clientService; 
      clientService.sin_family = AF_INET;
      clientService.sin_addr.s_addr = inet_addr("213.203.xxx.xxx");
      clientService.sin_port = htons(25);
    
      //----------------------
      // Connect to server.
      if (connect(ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
        cout << "Konnte Verbindung nicht herstellen" << endl;
        WSACleanup();
        return 0;
      }
    
      cout << "Verbind zum Server steht!" << endl;
      //WSACleanup();
    
      char sendData[1024] = "HELO bla\n";
      send(ConnectSocket, sendData, strlen(sendData), 0);
      cout << "Folgendes wurde gesendet: \"" << sendData << "\".";
    
      Sleep(500);
    
      char sendData0[1024] = "MAIL FROM:<board@nuxxxx.de>\n";
      send(ConnectSocket, sendData0, strlen(sendData0), 0);
      cout << "Folgendes wurde gesendet: \"" << sendData0 << "\".";
    
      Sleep(500);
    
      char sendData1[1024] = "RCPT TO:<webmaster@nuxxxx.de>\n";
      send(ConnectSocket, sendData1, strlen(sendData1), 0);
      cout << "Folgendes wurde gesendet: \"" << sendData1 << "\".";
    
      Sleep(500);
    
      char sendData2[1024] = "DATA\n";
      send(ConnectSocket, sendData2, strlen(sendData2), 0);
      cout << "Folgendes wurde gesendet: \"" << sendData2 << "\".";
    
      Sleep(500);
    
      char sendData3[1024] = "Blah blah blah...\n";
      send(ConnectSocket, sendData3, strlen(sendData3), 0);
      cout << "Folgendes wurde gesendet: \"" << sendData3 << "\".";
    
      Sleep(500);
    
      char sendData4[1024] = ".\n";
      send(ConnectSocket, sendData4, strlen(sendData4), 0);
      cout << "Folgendes wurde gesendet: \"" << sendData4 << "\".";
    
      return 0;
    }
    

    Ist aus der MSDN kopiert!

    Er öffnet eine verbindung zu STMP und verschickt ne mail!

    Geht aber nicht! Hier:

    Jul 11 18:22:45 viper1 sendmail[21512]: i6BGMhVQ021512: from=board@nuxxxx.de, size=0, class=0, nrcpts=1, proto=SMTP, d
    aemon=MTA, relay=pD958xxxx.dip.t-dialin.net [217.88.xxx.xxx]

    Wenn ich exakt die selben befehle per Telnet eingebe erhalte ich folgendes:

    Jul 11 18:18:02 viper1 sendmail[21435]: i6BGGUVR021423: to=webmaster@nuxxxx.de, ctladdr=board@nuxxxx.de (645/10
    2), delay=00:00:01, xdelay=00:00:00, mailer=local, pri=30403, dsn=2.0.0, stat=Sent

    Kann mir bitte jemand helfen?



  • Hallo,

    Habe mal nen lokalen SMTP eingerichtet, da gehts auch nicht 😞 Nur wenn ichs direkt per Telnet tippe 😞



  • Ich kenne mich mitm SMT-Protokoll nicht aus aber du könntest ja sicherheitshalber erst mal alle allokierten Speicher mit ZeroMemory() säubern bevor du sendest.

    PS: Anstatt 5 mal 1 KB zu allokieren kannst du einmal das char-array von 1 kb allokieren und vor jedem send() mit ZeroMemory() zuerst säubern und dann mit lstrcpy() füllen.

    MfG Tolga.



  • Was passiert denn, wenn Du die Strings mit "\r\n" abschließt?

    Laut RFC821: SMTP soll man <CRLF> als Abschluß senden... Du sendest nur <LF>.



  • Hallo,

    Vielen Dank! Es geht! War wegen dem \n! Habe es mal mit \r\n gemacht!

    Auf UNIX systemen muss ich aber doch nur \n machen oder?



  • Viperb0y schrieb:

    Auf UNIX systemen muss ich aber doch nur \n machen oder?

    Der Mailserver wird wahrscheinlich unter Unix laufen... 🙄

    Schau dir doch mal Hepis Link an. Im RFC ist das Mailprotokoll genau spezifiert.



  • Hallo,

    Es geht um den Client 🙄

    Und: Das RFC kenne ich zugenüge, den wagenrücklauf sollte man verwenden wenn man windoof --> linux, bsd usw... macht



  • Viperb0y schrieb:

    Es geht um den Client 🙄

    send() verändert die Daten nicht, deswegen ist nur der Server entscheidend. 🙂



  • Hallo,

    Aber NUR mit \n ging es nicht 😉



  • Ja, es ging nicht WEIL es der Server so verlangt. Also mit '\n\r' am Ende.
    So stehts ja im Protokoll. Das sollte eigentlich von der OS-Plattform unabhängig sein.

    PS: Aber du hast sicher nciht ganz Unrecht. Die sache mitm Linux/Windows-Unterschied was das verlangen nach '\n\r' angeht ist mir auhc bekannt.

    Ich glaube ich ahbe das mal in einem Winsock-Tutorial gelesen... 🙄

    Einer wirds gleich bestimmt klären.



  • Tolga schrieb:

    PS: Aber du hast sicher nciht ganz Unrecht. Die sache mitm Linux/Windows-Unterschied was das verlangen nach '\n\r' angeht ist mir auhc bekannt.

    <erbsenzähl>Nimm lieber '\r\n', es sei denn du hast einen Mac. 🙂 </>

    Das mit den unterschiedlichen Zeilenumbrüchen ist nur bei ASCII-Text-Dateien entscheidend. Die werden, wenn der Editor unfähig ist, auf einem anderen System als dem erzeugenden falsch dargestellt.
    Deswegen gibt es z.B bei FTP den Text-Modus zum Übertragen von Dateien. Dabei sagt der Client, welche Umbrüche er gerne hätte, und der Server kümmert sich dann ums konvertieren.

    Bei allgemein anerkannten Protokollen wie SMTP wäre es aber etwas umständlich und fehleranfällig, wenn ein Server alle Arten von Zeilenumbrüchen akzeptieren und konvertieren müsste. Deswegen hat man sich halt auf '\r\n' geeinigt.



  • In der RFC steht ganz klar "\r\n", vollkommen egal welches OS.

    Jeder SMTP-Server, der sich nicht an die RFC821 hält, ist entweder von Microsoft oder kein SMTP-Server.

    Basta. 😃



  • Hy Leute,

    ich habe versucht den Quelltext zu ompilieren, aber ich bekomme immer irgendwelche Linker-Errors.

    Hier sind die Meldungen:

    Compiler: Default compiler
    Führt g++.exe... aus
    g++.exe "C:\Dokumente und Einstellungen\Lippy\Desktop\mail.cpp" -o "C:\Dokumente und Einstellungen\Lippy\Desktop\mail.exe" -I"C:\Dev-Cpp\include\c++\3.3.1" -I"C:\Dev-Cpp\include\c++\3.3.1\mingw32" -I"C:\Dev-Cpp\include\c++\3.3.1\backward" -I"C:\Dev-Cpp\lib\gcc-lib\mingw32\3.3.1\include" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib"
    C:\DOKUME1\Lippy\LOKALE1\Temp/ccg9baaa.o(.text+0x191f):mail.cpp: undefined reference to WSAStartup@8' C:\\DOKUME~1\\Lippy\\LOKALE~1\\Temp/ccg9baaa.o(.text+0x1971):mail.cpp: undefined reference tosocket@12'
    C:\DOKUME1\Lippy\LOKALE1\Temp/ccg9baaa.o(.text+0x19ac):mail.cpp: undefined reference to WSACleanup@0' C:\\DOKUME~1\\Lippy\\LOKALE~1\\Temp/ccg9baaa.o(.text+0x19d0):mail.cpp: undefined reference toinet_addr@4'
    C:\DOKUME1\Lippy\LOKALE1\Temp/ccg9baaa.o(.text+0x19e5):mail.cpp: undefined reference to htons@4' C:\\DOKUME~1\\Lippy\\LOKALE~1\\Temp/ccg9baaa.o(.text+0x1a0f):mail.cpp: undefined reference toconnect@12'
    C:\DOKUME1\Lippy\LOKALE1\Temp/ccg9baaa.o(.text+0x1a40):mail.cpp: undefined reference to WSACleanup@0' C:\\DOKUME~1\\Lippy\\LOKALE~1\\Temp/ccg9baaa.o(.text+0x1ad9):mail.cpp: undefined reference tosend@16'

    C:\DOKUME1\Lippy\LOKALE1\Temp/ccg9baaa.o(.text+0x1bbf):mail.cpp: undefined reference to send@16' C:\\DOKUME~1\\Lippy\\LOKALE~1\\Temp/ccg9baaa.o(.text+0x1c5e):mail.cpp: undefined reference tosend@16'
    C:\DOKUME1\Lippy\LOKALE1\Temp/ccg9baaa.o(.text+0x1d03):mail.cpp: undefined reference to send@16' C:\\DOKUME~1\\Lippy\\LOKALE~1\\Temp/ccg9baaa.o(.text+0x1dd6):mail.cpp: undefined reference tosend@16'
    C:\DOKUME1\Lippy\LOKALE1\Temp/ccg9baaa.o(.text+0x1e7d):mail.cpp: more undefined references to `send@16' follow

    Ausführung beendet

    Können die Fehler vielleicht auch an einer header Datei liegen???

    Lippy



  • Du hast vermutlich vergessen ws2_32.lib zu linken.



  • Hy Leute,

    wie linkt man den diese Bibliothek???

    Etwa so: #pragma comment (lib, "ws2_32.lib") ???

    Lippy



  • lippy schrieb:

    Hy Leute,

    wie linkt man den diese Bibliothek???

    Etwa so: #pragma comment (lib, "ws2_32.lib") ???

    Lippy

    Ja.

    Wenn du das einfach ausprobiert hättest, hätte sich deine Frage erübrigt. 🙄 😡



  • lippy schrieb:

    Hy Leute,

    wie linkt man den diese Bibliothek???

    Etwa so: #pragma comment (lib, "ws2_32.lib") ???

    Lippy

    Das Visual Studio kann das so, ja.

    Ob Dein Compiler das auch so versteht, weiß ich nicht. Das wird die Dokumentation Deines Compilers sicherlich klären können.



  • Hier ist mein Quellcode:

    #include <iostream> 
    #include <windows.h> 
    #include "winsock2.h"
    
    #pragma comment (lib, "ws2_32.lib")
    
    using namespace std; 
    
    int main() 
    { 
      //---------------------- 
      // Initialize Winsock 
      WSADATA wsaData; 
      int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 
      if (iResult != NO_ERROR) 
        cout << "Konnte Winsock nicht initialisieren" << endl; 
    
      //---------------------- 
      // Create a SOCKET for connecting to server 
      SOCKET ConnectSocket; 
      ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
      if (ConnectSocket == INVALID_SOCKET) { 
        cout << "Konnte Socket nicht erstellen!" << endl; 
        WSACleanup(); 
        return 0; 
      } 
    
      //---------------------- 
      // The sockaddr_in structure specifies the address family, 
      // IP address, and port of the server to be connected to. 
      sockaddr_in clientService; 
      clientService.sin_family = AF_INET; 
      clientService.sin_addr.s_addr = inet_addr("213.203.xxx.xxx"); 
      clientService.sin_port = htons(25); 
    
      //---------------------- 
      // Connect to server. 
      if (connect(ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) { 
        cout << "Konnte Verbindung nicht herstellen" << endl; 
        WSACleanup(); 
        return 0; 
      } 
    
      cout << "Verbind zum Server steht!" << endl; 
      //WSACleanup(); 
    
      char sendData[1024] = "HELO bla\n"; 
      send(ConnectSocket, sendData, strlen(sendData), 0); 
      cout << "Folgendes wurde gesendet: \"" << sendData << "\"."; 
    
      Sleep(500); 
    
      char sendData0[1024] = "MAIL FROM:<board@nuxxxx.de>\n"; 
      send(ConnectSocket, sendData0, strlen(sendData0), 0); 
      cout << "Folgendes wurde gesendet: \"" << sendData0 << "\"."; 
    
      Sleep(500); 
    
      char sendData1[1024] = "RCPT TO:<webmaster@nuxxxx.de>\n"; 
      send(ConnectSocket, sendData1, strlen(sendData1), 0); 
      cout << "Folgendes wurde gesendet: \"" << sendData1 << "\"."; 
    
      Sleep(500); 
    
      char sendData2[1024] = "DATA\n"; 
      send(ConnectSocket, sendData2, strlen(sendData2), 0); 
      cout << "Folgendes wurde gesendet: \"" << sendData2 << "\"."; 
    
      Sleep(500); 
    
      char sendData3[1024] = "Blah blah blah...\n"; 
      send(ConnectSocket, sendData3, strlen(sendData3), 0); 
      cout << "Folgendes wurde gesendet: \"" << sendData3 << "\"."; 
    
      Sleep(500); 
    
      char sendData4[1024] = ".\n"; 
      send(ConnectSocket, sendData4, strlen(sendData4), 0); 
      cout << "Folgendes wurde gesendet: \"" << sendData4 << "\"."; 
    
      return 0; 
    }
    

    Ich benutze den Bloodsheet Dev C++!

    Aber die Fehlermeldungen lauten bei den verschiedensten Programmen die was mit mailen zu tun haben:

    Compiler: Default compiler
    Führt g++.exe... aus
    g++.exe "C:\Dokumente und Einstellungen\Lippy\Desktop\mail.cpp" -o "C:\Dokumente und Einstellungen\Lippy\Desktop\mail.exe" -I"C:\Dev-Cpp\include\c++\3.3.1" -I"C:\Dev-Cpp\include\c++\3.3.1\mingw32" -I"C:\Dev-Cpp\include\c++\3.3.1\backward" -I"C:\Dev-Cpp\lib\gcc-lib\mingw32\3.3.1\include" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib"
    C:\DOKUME1\Lippy\LOKALE1\Temp/ccyIbaaa.o(.text+0x191f):mail.cpp: undefined reference to WSAStartup@8' C:\\DOKUME~1\\Lippy\\LOKALE~1\\Temp/ccyIbaaa.o(.text+0x1971):mail.cpp: undefined reference tosocket@12'
    C:\DOKUME1\Lippy\LOKALE1\Temp/ccyIbaaa.o(.text+0x19ac):mail.cpp: undefined reference to WSACleanup@0' C:\\DOKUME~1\\Lippy\\LOKALE~1\\Temp/ccyIbaaa.o(.text+0x19d0):mail.cpp: undefined reference toinet_addr@4'
    C:\DOKUME1\Lippy\LOKALE1\Temp/ccyIbaaa.o(.text+0x19e5):mail.cpp: undefined reference to htons@4' C:\\DOKUME~1\\Lippy\\LOKALE~1\\Temp/ccyIbaaa.o(.text+0x1a0f):mail.cpp: undefined reference toconnect@12'
    C:\DOKUME1\Lippy\LOKALE1\Temp/ccyIbaaa.o(.text+0x1a40):mail.cpp: undefined reference to WSACleanup@0' C:\\DOKUME~1\\Lippy\\LOKALE~1\\Temp/ccyIbaaa.o(.text+0x1ad9):mail.cpp: undefined reference tosend@16'

    C:\DOKUME1\Lippy\LOKALE1\Temp/ccyIbaaa.o(.text+0x1bbf):mail.cpp: undefined reference to send@16' C:\\DOKUME~1\\Lippy\\LOKALE~1\\Temp/ccyIbaaa.o(.text+0x1c5e):mail.cpp: undefined reference tosend@16'
    C:\DOKUME1\Lippy\LOKALE1\Temp/ccyIbaaa.o(.text+0x1d03):mail.cpp: undefined reference to send@16' C:\\DOKUME~1\\Lippy\\LOKALE~1\\Temp/ccyIbaaa.o(.text+0x1dd6):mail.cpp: undefined reference tosend@16'
    C:\DOKUME1\Lippy\LOKALE1\Temp/ccyIbaaa.o(.text+0x1e7d):mail.cpp: more undefined references to `send@16' follow

    Ausführung beendet

    Ich bin echt am verzweifeln!

    Lippy



  • Beim g++ kann man IIRC auf der Kommandozeile -lws2_32 angeben. Aber ich nehme stark an, dass deine IDE dafür eine Einstellung anbietet.

    -> Andere Compiler.



  • Dieser Thread wurde von Moderator/in cd9000 aus dem Forum WinAPI in das Forum Andere Compiler verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten