Netzwerkprogrammierung Smtp
-
Hi Leute,
seit paar tagen schau ich mich hier immer um und ich muss sagen, dass forum ist echt top
& da ich schon seit ner weile das problem hab, das ich zwar weiß, wie ich reintheoretisch mit einem mailserver kommunizieren kann, aber irgendwie keine rückmeldung von dem server kommt, wollte ich des mal hier fragen..mein ziel ist es:
eine email mit meinem c-programm zu verschickenmeine idee:
http://www.elektronik-kompendium.de/sites/net/0903081.htm
<= die befehle von dort einzusetzen
& alles über socketprogrammierung zu erledigen..mein problem:
bekomm jeweils nur die meldung: "Welcome at blablabla-server"
und sonst bekomm ich keine antwort.sonstiges:
programmier unter linux/ubuntumein quellcode:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> #include<unistd.h> int main(void) { int sock; struct sockaddr_in server; struct hostent *dns; char ip[15], rec[256]; unsigned long addr; sock = socket(AF_INET, SOCK_STREAM, 0); //Grundbau: if(sock < 0) { printf("Fehler beim Socket erstellen.."); return 1; } //Hostname in Ip umwandeln: dns = gethostbyname("smtp.1und1.de"); sprintf(ip, "%u.%u.%u.%u", (unsigned char) dns->h_addr_list[0][0], (unsigned char) dns->h_addr_list[0][1], (unsigned char) dns->h_addr_list[0][2], (unsigned char) dns->h_addr_list[0][3]); //Server Verbindung aufbauen: memset(&server, 0, sizeof(server)); //Alles erstmal null setzen addr = inet_addr(ip); memcpy((char*)&server.sin_addr, &addr, sizeof(addr)); server.sin_family = AF_INET; //Adressfamily server.sin_port = htons(25); //Port if(connect(sock, (struct sockaddr*)&server, sizeof(server)) <0) { printf("Fehler beim verbinden.."); return 1; } //+++++++++ //Email: //SMTP-Sitzung starten: if(send(sock, "HELO", 256, 0) < 0) { printf("(1)Fehler beim SMTP-Sitzung starten.."); return 1; } printf("HELO\n"); if(recv(sock, rec, 256, 0) < 0) { printf("(2)Fehler beim SMTP-Sitzung starten.."); return 1; } printf("Antwort: %s\n", rec); //Mailübertragung einleiten: if(send(sock, "MAIL FROM: absender@postfach.de", 256, 0) < 0) { printf("(1)Fehler bei der FROM-Adresse.."); return 1; } printf("MAIL FROM: absender@postfach.de\n"); if(recv(sock, rec, 256, 0) < 0) { printf("(2)Fehler bei der FROM-Adresse.."); return 1; } printf("Antwort: %s\n", rec); //Empfänger-Adresse: if(send(sock, "RCPT TO: empfaenger@postfach.de", 256, 0) < 0) { printf("(1)Fehler bei der Empfaenger-Adresse.."); return 1; } printf("RCPT TO: empfaenger@postfach.de\n"); if(recv(sock, rec, 256, 0) < 0) { printf("(2)Fehler bei der Empfaenger-Adresse.."); return 1; } printf("Antwort: %s\n", rec); //Daten-Übermittlung: if(send(sock, "DATA", 256, 0) < 0) { printf("(1)Fehler bei DATA.."); return 1; } printf("DATA\n"); if(recv(sock, rec, 256, 0) < 0) { printf("(2)Fehler bei DATA.."); return 1; } printf("Antwort: %s\n", rec); //Verbindung schließen: if(send(sock, "QUIT", 256, 0) < 0) { printf("(1)Fehler bei DATA.."); return 1; } printf("QUIT\n"); if(recv(sock, rec, 256, 0) < 0) { printf("(2)Fehler bei DATA.."); return 1; } printf("Antwort: %s\n", rec); close(sock); }
was mach ich falsch?
Grüße
Tjmper92ps: ich will des unbedingt in c auch können, hab davor csharp und java programmiert und würde jetzt gern c machen
-
Zunächst: Setz dir zum Testen deinen eigenen, lokalen Mailserver auf. Dann hast du die Log-Dateien und die Möglichkeit, ihn so lax einzustellen, wie du willst. Du wirst feststellen, dass aus Spam-Bekämpfungsgründen öffentlich erreichbare Mailserver teilweise sehr streng mit den RFCs umgehen; wenn du dich nicht strikt an SMTP hältst und deine Domain samt PTR-Records richtig eingerichtet hast, wirst du da häufig kein Glück haben, und Graylisting gibt es auch noch zu bedenken (will sagen, du musst temporäre Fehlercodes abfangen und behandeln). Konkret bei smtp.1und1.de ist ferner zu erwarten, dass du dich ausweisen musst, weil dieser scheinbar direkt zur Benutzung durch Endanwender gedacht ist. Wenn du im SMTP-Protokoll unsicher bist, kannst du auf diese Weise schnell auf Blacklists landen.
Dass der Server in diesem Fall die Verbindung praktisch sofort abbricht, wird damit zusammenhängen, dass du hinter HELO weder Hostnamen noch \r\n sendest, so dass der Server am anderen Ende auf den Rest des Kommandos wartet.
Bist du sicher, dass du das alles von Hand machen willst? Bei der Umsetzung von Netzwerkprotokollen ist große Sorgfalt vonnöten, von daher ist das eigentlich nichts, worauf man sich als Anfänger gleich stürzen sollte. Ich lasse mal einen Link zu libESMTP hier.
-
schonmal danke seldon
des mit dem mailserver hab ich mir vorm pennengehen noch überlegt und probiers heute mal aus.
erstmal so mit den befehlen, dann mal mit der lib.
wenn ich die lösung hab post ichs mal hier, würde bestimmt noch andere interessieren.
wie die befehle geschrieben werden, schau ich mal bei wireshark, da werden se normal angezeigt.
mir ist es halt wichtig es zu checken und viel per hand zu machen.
Grüße
Tjmper92
-
Ein ganz einfaches Beispiel einer Mail-Session findest du auf Wikipedia. Eine ausführliche Beschreibung findet sich in RFC 5321, der derzeit relevanten SMTP-Spezifikation.
Auf EXPN und VRFY kannst du dich nach RFC 2505 nicht stützen (die Missbrauchsgefahr durch Spammer ist zu groß), SEND, SOML und SAML sind obsolete Überreste aus ARPAnet-Zeiten. Ich vermute, dass NOOP, RSET und TURN und HELP für dich nicht von Interesse sind, also bleiben am Ende HELO bzw. EHLO, MAIL, RCPT, DATA und QUIT, die du wirklich verstehen musst. Außerdem wirst du, um mit smtp.1und1.de reden zu können, vermutlich einen Blick in RFC 4954 werfen müssen; dort ist das AUTH-Kommando zur Authentifikation via SASL beschrieben. Base64 ist dir ein Begriff, oder?
Die eigentliche Arbeit liegt natürlich darin, die Fehlercodes des Servers zu prüfen und zu behandeln (eine Aufstellung selbiger findest du in RFC 5321, Abschnitt 4.3.2). Insbesondere, wenn du einen 4xx-Code kriegst, ist das ziemlicher Aufwand, weil du die Mail dann spoolen musst (d.h. aufbewahren und später noch mal probieren); das passiert vor allem, wenn der Server einen Graylisting-Filter benutzt.
Naja, ich hab dich gewarnt. Die RFCs zu SMTP sind nicht umsonst so zahl- und umfangreich.
-
Vielleicht hilft dir das ja weiter:
http://www.codeproject.com/search.aspx?q=smtp&x=10&y=7&sbo=kw