Verbindung mit SMTP-Server

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Verbindung mit SMTP-Server

    Hallo!

    Hab da ein kleines Problem.
    Ich brauche ein kleines Programm das mir eine Verbindung zu einem SMTP Server herstellt. Nun hab ich mir etwas gebastelt was soweit funktioniert - nur bei dem Punkt wo ich eine Mail mittels DATA versenden will klappts nicht mehr - ich denke es bleibt in Zeile 59 stehen und wartet auf eine Rückmeldung vom Server - die gibt es aber hier nicht.
    Hat jemand eine Idee wie ich das Problem lösen kann?

    Bin für jeden Vorschlag dankbar!
    lg

    Hier mein Code:

    Quellcode

    1. #include <sys/types.h>
    2. #include <sys/socket.h>
    3. #include <netinet/in.h>
    4. #include <arpa/inet.h>
    5. #include <unistd.h>
    6. #include <stdlib.h>
    7. #include <stdio.h>
    8. #include <string.h>
    9. #define BUF 1024
    10. int main (int argc, char **argv) {
    11. int sock;
    12. char *buffer = malloc (BUF);
    13. struct sockaddr_in address;
    14. int size;
    15. int port;
    16. int con;
    17. // Überprüfung der Programmparameter
    18. if( argc < 3 ){
    19. printf("Usage: %s <address> <port>", *argv);
    20. exit(EXIT_FAILURE);
    21. }
    22. //Socket erzeugen
    23. printf("create socket...");
    24. sock = socket(AF_INET, SOCK_STREAM, 0);
    25. if(sock > 0)
    26. printf("OK\n");
    27. else{
    28. printf("failed\n");
    29. exit(0);
    30. }
    31. //zweites Argument in Integer konvertieren
    32. port = strtol(argv[2], NULL, 10);
    33. address.sin_family = AF_INET;
    34. address.sin_port = htons (port);
    35. inet_aton (argv[1], &address.sin_addr);
    36. // Verbindung zum Server herstellen
    37. printf("connect...");
    38. con = connect ( sock, (struct sockaddr *) &address, sizeof 45(address));
    39. if(con == 0){
    40. printf("OK\n");
    41. printf ("connected to %s on port %d \n\n", inet_ntoa 49(address.sin_addr), port);
    42. }
    43. else{
    44. printf("failed\n");
    45. exit(0);
    46. }
    47. do {
    48. //Ausgabe der Servernachricht
    49. size = recv(sock, buffer, BUF-1, 0);
    50. if( size > 0)
    51. buffer[size] = '\0';
    52. printf ("%s\n", buffer);
    53. //--------
    54. //Eingabe zum Server senden
    55. if (strcmp (buffer, "quit\n")) {
    56. printf ("> ");
    57. fgets (buffer, BUF, stdin);
    58. send(sock, buffer, strlen (buffer), 0);
    59. //--------
    60. }
    61. } while (strcmp (buffer, "quit\n") != 0);
    62. close (sock);
    63. return EXIT_SUCCESS;
    64. }
    Alles anzeigen
  • Hi,

    naja, nach dem senden von DATA an den SMTP-Server sollte ich die Nachricht eingeben können und anschliessend mit . beenden.
    Aber genau das klappt dann nicht mehr.

    So schauts aus:

    root@ubuntu:/home/ente# ./test xxx.xxx.xxx.xxx 25
    create socket...OK
    connect...OK
    connected to xxx.xxx.xxx.xxx on port 25

    >> 220 xxxxxxxxxxxxxxx ESMTP server (InterMail vM.6.01.04.04 201-2131-118-104-20050224) ready Sat, 27 May 2006 18:48:47 +0200

    > helo irgendeinedomain
    250 vxxxxxxxxxxxx.at

    > mail from:ipaddress@xxxxxx.at
    250 Sender <ipaddress@xxxxxx.at> Ok

    > rcpt to:ipaddress@xxxxxx.at
    250 Recipient <ipaddress@xxxxxx.at> Ok

    > data
    354 Ok Send data ending with <CRLF>.<CRLF>

    > nachricht
    hier sollte mein "promt" > wieder erscheinen - tut es aber nicht.
    Somit nimmt es den . auch nicht mehr entgegen.
    Habe ein paar printf's gesetzt und herausgefunden, das Programm bleibt in Zeile 70 einfach stehen.

    Wenn ich Zeile 58 - 64 auskommentiere funktioniert es - dann arbeite ich aber sozusagen blind da ich keine Ausgabe vom Sever mehr bekomme.
  • Danke für deine Hilfe!

    Leider bin ich bis jetzt noch nicht weitergekommen.

    Aber das Ganze hängt an Zeile 58-64 - denn wenn ich diese auskommentiere klappts - bis auf das das ich dann keine Antwort mehr vom Server bekomme.

    Mit Telnet würde das alles ja wunderbar funktionieren, leider ist der verfügbare Speicher auf dem Geräte wo das am Ende laufen sollte ziemlich begrenzt.

    lg
  • Hi wenn du hilfe bei Sockets brauchst

    Schau einfach mal auf <admin_edit /> nach
    Da gibts nen paar Leute die dir bestimmt helfen können mit deinem Socket problem

    "Forenadmin" schrieb:

    Hinweis: Direkte Werbung für andere Foren ist nicht erlaubt. Wenn dort das gleiche Problem bereits geklärt wäre, dann könntest du vielleicht einen Direktlink posten. Aber für einen ersten Beitrag dennoch unüblich.
  • das Problem liegt an fgets. dieses liest eine Anzahl von Zeichen ein, oder bis ein newline oder eof erreicht wird. wenn du die enter taste drückst wird ein newline geschickt. der smtp server schickt aber keine antwort auf deinen DATA string, da er auf ein "\r\n\x2e\r\n" oder "\n\x2e\n" wartet, damit DATA abgeschlossen werden kann.

    http://www.cplusplus.com/ref/cstdio/fgets.html

    deine Do Schleife berüchsichtigt dieses nicht...es wird hier eine Antwort vom Server erwartet (recv), welche natürlich nicht kommt da dieses nicht erwartet wird.