WinSock-Programmierung
lima-city → Forum → Programmiersprachen → C/C++ und D
anhang
buffer
code
date
datei
disposition
frage
helfen
image
inhalt
login
mime
part
problem
server
test
text
transfer
type
url
-
Es ist wieder soweit. Ich bin mal wieder überfragt und meine letzte Hilfe seid nun ihr...
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
Auf eine Antwort von dir hab ich ja schon heimlich gehofft
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 -
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.
-
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 -
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 -
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.. -
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. -
Liefert kein neues Ergebnis, vllt liegt das Problem ja seitens des Anbieters.
Trotzdem großes Dankeschön!
MfG -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage