kostenloser Webspace werbefrei: lima-city


WinSock-Programmierung

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    sw1tch

    Kostenloser Webspace von sw1tch, auf Homepage erstellen warten

    sw1tch hat kostenlosen Webspace.

    Es ist wieder soweit. Ich bin mal wieder überfragt und meine letzte Hilfe seid nun ihr... :biggrin:

    Mein Ziel ist es mittels WinSocket-Programmierung eine E-Mail von einem registrierten Konto bei lavabit.com zu einer EMail-Adresse bei GoogleMail zu schicken. Inhalt und "Subject" usw. möchte bzw. kann ich auch schon selber bestimmen. Nun bin ich inzwischen dazu genötigt, der EMail einen Datei-Anhang zu spendieren, doch leider konnte ich nicht in Erfahrung bringen, wie sich das anstellen lässt.


    Der Code ist nen bißchen "schlank", da ich nicht RECV zum Empfangen der Server-Replies einsetze.
    Ansonsten funktioniert der Code super....

    Hier mein bisheriger Code, ohne den Dateianhang.
    int transfer::StreamClient(char *szServer, short nPort) {
    
    	int nRet;
    	char EHLO[32] = "EHLO lavabit.com\r\n";
    	char AUTH[32] = "AUTH LOGIN\r\n";
    	char USER[64] = "BASE64_ENCODED_USER\r\n";
    	char PASS[64] = "BASE64_ENCODED_PW\r\n";
    	char MAIL[64] = "MAIL FROM:<XXXXXXXX@lavabit.com>\r\n";
    	char RCPT[64] = "RCPT TO:<XXXXXXXX@googlemail.com>\r\n";
    	char DATA[64] = "DATA\r\n";
    	char FROM[64] = "From: XXXXXXX@lavabit.com\r\n";
    	char TOME[64] = "To: Mein NickName\r\n";
    	char SUBJ[64] = "Subject: Mein Betreff\r\n";
    	char DATE[64] = "Date:\r\n";
    	char TEXT[64] = "Eine Nachricht\r\n";
    	char ENDS[16] = ".\r\n";
    	char QUIT[16] = "QUIT\r\n";
    	//
    	//		Find the Server
    	//
    	LPHOSTENT lpHostEntry;
     
    	lpHostEntry = gethostbyname(szServer);
    	if (lpHostEntry == NULL) {
            	return 1;
    	}
     
    	//
    	//		Create a TCP/IP Stream Socket
    	//
    	SOCKET	theSocket;
     
    	theSocket = socket(AF_INET,
    					   SOCK_STREAM,
    					   IPPROTO_TCP);
    	if (theSocket == INVALID_SOCKET)
    	{
    		return 1;
    	}
    
    	//
    	//		Fill in Address-Structure 
    	//
    	SOCKADDR_IN saServer;
     
    	saServer.sin_family = AF_INET;
    	saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
    
    	saServer.sin_port = htons(nPort);
     
    	//
    	//		Establish Connection
    	//
     
    	nRet = connect(theSocket,
    				   (LPSOCKADDR)&saServer,
    				   sizeof(struct sockaddr));
    
    	if (nRet == SOCKET_ERROR)
    	{
    		closesocket(theSocket);
    		return 1;
    	}
     
    	//
    	//		Greetings to the Server
    	//
    	nRet = send(theSocket,
    				EHLO,
    				strlen(EHLO),
    				0);
    
    	//
    	//		Methode: Base64-AUTH-LOGIN
    	//
    	nRet = send(theSocket,
    				AUTH,
    				strlen(AUTH),
    				0);
    
    	//
    	//		Send Base64-Encoded User
    	//
    	nRet = send(theSocket,
    				USER,
    				strlen(USER),
    				0);
    
    	//
    	//		Send Base64-Encoded Password
    	//
    	nRet = send(theSocket,
    				PASS,
    				strlen(PASS),
    				0);
    
    	//
    	//		Submit MailAddress
    	//
    	nRet = send(theSocket,
    				MAIL,
    				strlen(MAIL),
    				0);
    
    	//
    	//		Submit Recipient
    	//
    	nRet = send(theSocket,
    				RCPT,
    				strlen(RCPT),
    				0);
    
    	//
    	//		Start DATA-Section
    	//
    	nRet = send(theSocket,
    				DATA,
    				strlen(DATA),
    				0);
    
    	//
    	//		Send Infos
    	//
    	nRet = send(theSocket,
    				FROM,
    				strlen(FROM),
    				0);
    	nRet = send(theSocket,
    				TOME,
    				strlen(TOME),
    				0);
    	nRet = send(theSocket,
    				SUBJ,
    				strlen(SUBJ),
    				0);
    	nRet = send(theSocket,
    				DATE,
    				strlen(DATE),
    				0);
    
    	//
    	//		Send Text
    	//
    	nRet = send(theSocket,
    				TEXT,
    				strlen(TEXT),
    				0);
    
    	//
    	//		Send End.
    	//
    	nRet = send(theSocket,
    				ENDS,
    				strlen(ENDS),
    				0);
    
    	//
    	//		Quit Connection
    	//
    	nRet = send(theSocket,
    				QUIT,
    				strlen(QUIT),
    				0);
    
    	//
    	//		Close Socket and Return
    	//
    	closesocket(theSocket);
    	return 0;
    }


    Beitrag zuletzt geändert: 24.10.2009 22:05:26 von sw1tch
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. c****s

    Ich würde dir sehr gerne helfen, aber was ist deine Frage?
    Ist die Frage, wie du einen Anhang beifügst? Das ist in der RFC 2183 geregölt und die Zauberwörter sind MIME und Content-Disposition. http://tools.ietf.org/html/rfc2183

    Ein Anhang ist ein Multipartteil wie jeder andere, nur das er als "Content-Disposition: attachment;" getaggt ist.

    Beitrag zuletzt geändert: 24.10.2009 23:59:04 von census
  4. Autor dieses Themas

    sw1tch

    Kostenloser Webspace von sw1tch, auf Homepage erstellen warten

    sw1tch hat kostenlosen Webspace.

    Auf eine Antwort von dir hab ich ja schon heimlich gehofft :wink:
    Ja, du hast mich schon richtig verstanden, ich möchte wissen, wie ich nun ein "Attachment"-Part in diesen Code einbinde, der einen Datei-Anhang beim Versenden der Mail ermöglicht.

    Vllt könntest du das Ganze noch an einem kleinen Stückchen Code verdeutlichen?

    MfG
  5. c****s

    In der RFC sind am Ende Beispiele hierfür. Jetzt isses n bisserl spät, aber wenn mich morgen die Muße küsst, dann schreib ich selbst mal was.
  6. Autor dieses Themas

    sw1tch

    Kostenloser Webspace von sw1tch, auf Homepage erstellen warten

    sw1tch hat kostenlosen Webspace.

    Im Prinzip hab ich es nun soweit gebracht, dass ein Attachment vorhanden ist, doch auf dem Dokument geht scheinbar nicht hervor, wie ich nun eine Datei angeben. Es wird dort in Beispielen als "<jpeg data>" bezeichnet. Alles weitere wie z.B. "filename" scheint nicht zu funktionieren bzw. ändert nur den Namen der nicht vorhandenen Datei in dem Anhang (filename wird bei GMail als Datei-Name angezeigt, doch die eig. Datei ist nich dabei)..

    Möglicherweise liegt der Fehler an dem verwendeten Text?:

    "CONTENT-DISPOSITION: ATTACHMENT; FILENAME=LOL.jpg; MODIFICATION_DATE=\"Wed, 12 Feb 1997 16:29:51 -0500\"\r\n"

    MfG

    Beitrag zuletzt geändert: 25.10.2009 2:44:49 von sw1tch
  7. c****s

    Trallala, so geht das:
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <string.h>
    
    char buffer [1001];
    
    void _send (int s, char* msg)
    {
    	int len;
    
    	printf (">> %s", msg);
    	send (s, msg, strlen (msg), 0);
    	len = recv (s, buffer, 1000, 0);
    	buffer [len] = 0;
    	printf ("<< %s", buffer);
    }
    
    int main ()
    {
    	int sock;
    	int len;
    	struct sockaddr_in addr;
    
    	addr.sin_family = AF_INET;
    	addr.sin_port = htons (25);
    	inet_aton ("213.165.64.21", &addr.sin_addr);
    	memset (&addr.sin_zero, 0, 8);
    	printf ("Starting up.\n");
    
    	sock = socket (AF_INET, SOCK_STREAM, 0);
    	if (sock == -1)
    	{
    		printf ("Could not create socket.\n");
    		return 1;
    	}
    
    	printf ("Trying to connect...");
    	if (connect (sock, (struct sockaddr*) &addr, sizeof (addr) ) == -1)
    	{
    		printf ("failed.\n");
    		return 1;
    	}
    	else
    		printf ("done.\n");
    
    
    	len = recv (sock, buffer, 1000, 0);
    	buffer [len] = 0;
    	printf ("<< %s", buffer);
    
    	_send (sock, "HELO ???@gmx.de\r\n");
    	_send (sock, "AUTH LOGIN\r\n");
    	_send (sock, "???\r\n");
    	_send (sock, "???\r\n");
    	_send (sock, "MAIL FROM:<???@gmx.de>\r\n");
    	_send (sock, "RCPT TO:<???@gmx.de>\r\n");
    	_send (sock, "DATA\r\n");
    	_send (sock, "From: ???@gmx.de\r\nTo: Chefe\r\nSubject: Ein Test\r\nMIME-Version: 1.0\r\nContent-Type: multipart/alternative; boundary=foo\r\n\r\n--foo\r\nContent-Type: text/plain\r\n\r\nDas ist der Inhalt\r\n--foo\r\nContent-Type: image/gif\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=egal.gif\r\n\r\nR0lGODlhDwAPANUAAMDAwPn5APb2APHwAO/uAOnoAOjmAOblAOLgAN7cAN3aANvZANnXANTRANPRANHOAc3KAcjFAcfEAcTBAc/LAcvHAcK9AcG9Ab+6Ab+7Abu3Abm1AbizAbeyAbWwAbOuAa+qAa6pAa2nAaulAaumAaiiAaijAaeiAaagAaSeAb+/vwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAPAA8AAAaUQIBQuCoWh0hA8YBYNCBH5IowIBQQjEcEsxpOBQEB4aBwVC6drnKwCgTYiaKF010dCAIjuYgOFREFVFZYWhgeIkULCAcGTE4QExofI0UNDAoJCgwNFBIZHSAmRRAPKw0ODxASFxsrJCh1ERUrFRETGa0iJ2orGBcWRkUiJSlqSh0cHR4fICQnxUlFISIjJrDG0cFJQQA7\r\n--foo--\r\n\r\n.\r\n");
    	_send (sock, "QUIT\r\n");
    
    	close (sock);
    	
    	printf ("Returning successfully.\n");
    	return 0;
    }

    Da das hier kein Mensch lesen kann, hier auch noch die Konsolenausgabe:
    Starting up
    Trying to connect...done.
    << 220 mail.gmx.net GMX Mailservices ESMTP {mp004}
    >> HELO ???@gmx.de
    << 250 mail.gmx.net GMX Mailservices {mp004}
    >> AUTH LOGIN
    << 334 VXNlcm5hbWU6
    >> ???
    << 334 UGFzc3dvcmQ6
    >> ???
    << 235 2.7.0 Go ahead {mp004}
    >> MAIL FROM:<???@gmx.de>
    << 250 2.1.0 ok {mp004}
    >> RCPT TO:<???@gmx.de>
    << 250 2.1.5 ok {mp004}
    >> DATA
    << 354 mail.gmx.net Go ahead {mp004}
    >> From: ???@gmx.de
    To: Chefe
    Subject: Ein Test
    MIME-Version: 1.0
    Content-Type: multipart/alternative; boundary=foo
    
    --foo
    Content-Type: text/plain
    
    Das ist der Inhalt
    --foo
    Content-Type: image/gif
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename=egal.gif
    
    R0lGODlhDwAPANUAAMDAwPn5APb2APHwAO/uAOnoAOjmAOblAOLgAN7cAN3aANvZANnXANTRANPRANHOAc3KAcjFAcfEAcTBAc/LAcvHAcK9AcG9Ab+6Ab+7Abu3Abm1AbizAbeyAbWwAbOuAa+qAa6pAa2nAaulAaumAaiiAaijAaeiAaagAaSeAb+/vwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAPAA8AAAaUQIBQuCoWh0hA8YBYNCBH5IowIBQQjEcEsxpOBQEB4aBwVC6drnKwCgTYiaKF010dCAIjuYgOFREFVFZYWhgeIkULCAcGTE4QExofI0UNDAoJCgwNFBIZHSAmRRAPKw0ODxASFxsrJCh1ERUrFRETGa0iJ2orGBcWRkUiJSlqSh0cHR4fICQnxUlFISIjJrDG0cFJQQA7
    --foo--
    
    .
    << 250 2.6.0 Message accepted {mp004}
    >> QUIT
    << 221 2.0.0 GMX Mailservices {mp004}
    Returning successfully.

    Das ganze verschickt einen Smiley als GIF-Anhang an einen Empfänger. Ich habe das erfolgreich bei gmx getestet. Ich hoffe, das hat alles erklärt.

    Beitrag zuletzt geändert: 25.10.2009 7:28:48 von census
  8. Autor dieses Themas

    sw1tch

    Kostenloser Webspace von sw1tch, auf Homepage erstellen warten

    sw1tch hat kostenlosen Webspace.

    Perfekt!
    Funktioniert alles super doch ich hab noch eine Frage.
    Ich hab den Content-Part wie folgt abgeändert:

    "From: XXXXX@lavabit.com\r\nTo: XXXXX\r\nSubject: Ein Test\r\nMIME-Version: 1.0\r\nContent-Type: multipart/alternative; boundary=foo\r\n\r\n--foo\r\nContent-Type: text/plain\r\n\r\nDas ist der Inhalt\r\n--foo\r\nContent-Type: text/txt\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=egal.txt\r\n\r\nBASE_64_Encoded_TEXT\r\n--foo--\r\n\r\n.\r\n");


    Das Problem ist nun, dass er 2 Dateianhänge anzeigt, die beide funktionieren und den gleichen Inhalt darstellen, obwohl er nur einen anzeigen sollte..
  9. c****s

    Freut mich, dass ich habe helfen können.
    Das mit den 2 Anhängen ist komisch. Vielleicht kommt er mit text/txt nicht klar, weil das ist AFAIK kein MIME-Typ. Versuch's mal mit text/plain.
  10. Autor dieses Themas

    sw1tch

    Kostenloser Webspace von sw1tch, auf Homepage erstellen warten

    sw1tch hat kostenlosen Webspace.

    Liefert kein neues Ergebnis, vllt liegt das Problem ja seitens des Anbieters.
    Trotzdem großes Dankeschön!

    MfG
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!