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\n

    TIPP
    les dir die RFC zu SMTP durch!
    --> http://www.faqs.org/rfcs/rfc821.html

    MfG 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


Anmelden zum Antworten