E-Mail Client - bekommt keine Daten
-
Hallo!
Ich muss einen E-Mail Client schreiben. Eigentlich funktionierts ja, allerdings bekomme ich nie etwas vom Server zurückgesendet bzw empfange ich es nicht. Bei SMTP macht ja das noch nicht soviel aus. Ich sende die Befehle zum Senden einer E-Mail an den Server und er sendet sich auch tatsächlich.
Allerdings kommt keine Bestätigung zurück oder sonst irgendwas.
Bei SMTP brauch ich das nicht unbedingt, beim E-Mails abrufen (POP3) wirds dann schon schwieriger ohne Rückgabewerte.
Könnt ihr vielleicht irgendwas im Code entdecken, was falsch ist?#include "stdafx.h" #include <winsock.h> #include <stdio.h> #pragma comment(lib, "ws2_32.lib") SOCKET ss; WSADATA wsaData; struct sockaddr_in sa; //Daten vom SOCKET holen int holen(char * buf){ char buffer[4096] = ""; recv(ss,buffer,strlen(buffer),0); strcpy(buf,buffer); return 0; } //zum senden (bissl umstaendlich, aber is nur mal zum testen) int senden(){ //Socket senden char text[255] =""; strcpy(text, "HELO"); strcat(text, "\r\n"); return send(ss,text,strlen(text),0); } int senden1(){ //Socket senden char text1[255] =""; strcpy(text1, "MAIL FROM: nikolaus@szu.at"); strcat(text1, "\r\n"); return send(ss,text1,strlen(text1),0); } int senden2(){ //Socket senden char text2[255] =""; strcpy(text2, "RCPT TO: projekt@rek.at"); strcat(text2, "\r\n"); return send(ss,text2,strlen(text2),0); } int senden3(){ //Socket senden char text3[255] =""; strcpy(text3, "DATA"); strcat(text3, "\n"); strcat(text3, "blaba"); strcat(text3, "\n"); strcat(text3, "."); strcat(text3, "\r\n"); return send(ss,text3,strlen(text3),0); } //Diese Methode initialisiert einmal die WinSock.dll //(ist vor dem gebrauch von sockets unbedingt erforderlich) void winsockini(void){ WORD wVersionReg = MAKEWORD(1, 1); if (int err = WSAStartup(wVersionReg, &wsaData) != 0) { printf("Fehler: Initialisieren - WinSock.dll!"); } }; int wconnect(char* IP, int Port){ ss = INVALID_SOCKET; sa.sin_family = AF_INET; sa.sin_addr.s_addr = inet_addr(IP); sa.sin_port = htons(Port); winsockini(); //<---- ich rufe die funktion zum initialisieren hier auf ss = socket(AF_INET,SOCK_STREAM,0); if(connect(ss,(struct sockaddr *) &sa,sizeof(sa)) == SOCKET_ERROR){ return SOCKET_ERROR; }; return 1; }; int _tmain(int argc, _TCHAR* argv[]) { char eingabe[200] = ""; char rbuffer[200] = ""; if(wconnect("80.86.187.192",25) != SOCKET_ERROR){ printf("Verbunden\n"); senden(); while(!strlen(rbuffer)) { holen(rbuffer); } printf("%s", rbuffer); //senden("DATA test.at\r\n"); senden1(); senden2(); senden3(); while(!strlen(rbuffer)) { holen(rbuffer); } printf("%s", rbuffer); }else{ return 1; } printf("Bitte geben sie die Emailadresse ein:\n"); //scanf("%d", &eingabe); //senden(eingabe); getchar(); getchar(); return 0; system("PAUSE"); }Danke für eure Hilfe, lg
-
Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
du holst die daten nur 2mal ab...im prinzip musst du das immer nach dem senden eines befehls machen, da der server ja darauf immer antwortet und jeweils anders reagiert (was du dann natürlich auch machen musst). könnte auch sein das die daten die du sendest fehlerhaft sind oder der server authentifikationen benötigt.
wenn du absolut keine nachrichten empfangen kannst, müsst ich mir den code nochmal genauer anschaun, bin nurmal drübergeflogen.
[edit 1]
dein fehler ist hier:int holen(char * buf){ char buffer[4096] = ""; recv(ss,buffer,strlen(buffer),0); strcpy(buf,buffer); return 0; }so muss das heissen: recv(ss,buffer,sizeof(buffer),0);
sonst wird als länge 0 übergeben und nichts wird ausm puffer geholt und in deinen geschrieben
[edit 2]
int senden3(){ //Socket senden char text3[255] =""; strcpy(text3, "DATA"); strcat(text3, "\n"); strcat(text3, "blaba"); strcat(text3, "\n"); strcat(text3, "."); strcat(text3, "\r\n"); return send(ss,text3,strlen(text3),0); }ein datenblock wird mit \r\n.\r\n abgeschlossen, nicht wie in deinem code!
normale zeilenumbrüche sind immer \r\nTIPP
les dir die RFC zu SMTP durch!
--> http://www.faqs.org/rfcs/rfc821.htmlMfG RadiatioN
-
Wäre es möglich, wenn du alle Code hier reinsetzten würdest, damit andere auch was davon haben?
-
was willst du nach noch mehr? das ist doch schon alles, der rest steht in rfc's und lässt sich leicht umsetzen.
zum spam verschicken reicht das für dich doch sicherlich aus *spaß*
aber finde mal nen server der kein AUTH braucht, da gibt es kaum welche mehr 
sobald man als absender was anderes angibt als man ist kommt die mail sowieso nie an -> hab zig server probiert und keiner ging bisher nach der RFC-Standard STMP methode.
MfG RadiatioN
-
Ich ahbe aber nicht das hier -> #pragma comment(lib, "ws2_32.lib") und das warscheinlich auch nicht:stdafx.h
-
Danke Radiation2K5! Du hast mir grad eine positive Note gesichert

Hab schon die Hoffnung aufgegeben, dass hier wer schreibt und um halb eins musst ich das abgeben und um 12:25 hab ichs ca. gesehn
Hab das ganze jetzt auch noch mit POP3 und schönem Menü und so gemacht

Der Fehler war halt das strlen statt sizeof

Also danke nochmal

lg
-
nur bräucht ich jetzt auch noch gute noten (in BWL, *bäh*)

oh wäre das schön wenn wir sowas in berufschule machen würden, aber nein da machen wir klassen grundlagen und datenbanken in access

@frager:
du könntest genausogut die header für winsock includen das geht genauso, bzw. dann die libs in den compiler optionen hinzufügen.
und "stdafx.h" wirste wohl vermutlich nur beim VC++ brauchen
das sind vorkompilieret header und M$ compiler spezifisch (soweit ich das kenn)
bei anderen compilern gibt es das bestimmt auch, nur kenn ich keine anderen und dementsprechend auch nicht wie es dort ist
btw: man kann in der msdn nachschaun wie die header dazu heissen, immer diese faulheit

MfG RadiatioN