Erklärung/Tutorial zu Codebeispiel
-
Hallo,
ich habe irgendwann mal irgendwo ein Codebeispiel gefunden, wie man sich bei einem SMTP Server authentifizieren kann.
1. Ich finde zwar den Code im Internet wieder, allerdings keinerlei Erklärung dazu, bzw irgendein Tutorial.
2. Möchte ich gerne ein Mail versenden, nichts empfangen. Wie man das in etwa macht mit authentifizierung und senden, findet man zwar im Internet, aber etwas konkretes habe ich nur für Indy gefunden und das scheint irgendwie nichtmehr zu existieren
Hier ist der Code den ich meinte. Meine Fragen dazu habe ich als Kommentar zugeschrieben (einige Kommentare waren schon vorher drin, die habe ich jetzt einfach mal gelassen).#include "stdafx.h" #include <stdio.h> #include <iostream> #include <winsock2.h> #include <windows.h> #pragma comment( lib, "ws2_32.lib" ) using namespace std; int startWinsock() { //Initialsierung der WSA Startup WSA-Win Socket Api WSADATA wsa; return WSAStartup(MAKEWORD(2,0), &wsa); } bool readable(SOCKET socket) { FD_SET fdSet; TIMEVAL timeout; timeout.tv_sec = 0; timeout.tv_usec = 0; long status; FD_ZERO(&fdSet); FD_SET(socket,&fdSet); status = select(0,&fdSet,0,0,&timeout); if(status <= 0) FD_ZERO(&fdSet); if(!FD_ISSET(socket,&fdSet)) return false; return true; } int main() { long rc; SOCKET s; SOCKADDR_IN addr; char buf[256]; char buf2[256]; rc = startWinsock(); if(rc != 0) { cout << "Es ist ein Fehler beim Initialsieren der Windowsocket aufgetreten" << endl; return 1; } else { cout <<"Winsocket started!" << endl; } //Socket erstellen s = socket(AF_INET, SOCK_STREAM, 0); if(s == INVALID_SOCKET) { cout << "Error: Could not create socket, error: " << WSAGetLastError() << endl; return 1; } else { cout << "Socket creating successfull!" << endl; } // Alles auf 0 setzen, inklsuive sin_zero memset(&addr, 0, sizeof(SOCKADDR_IN)); addr.sin_family = AF_INET; // Legt Portnummer fest, htons wandelt Short in Network byte um addr.sin_port = htons(25); // Was ist diese Adresse, und wieso wird eine Verbindung zu mail.gmx.net aufgebaut? addr.sin_addr.s_addr = inet_addr("213.165.64.21"); //Socketverbindung aufbauen rc = connect(s, reinterpret_cast<SOCKADDR*>(&addr), sizeof(SOCKADDR)); if( rc == SOCKET_ERROR) { cout << "Connection to socket failed." << WSAGetLastError() << endl; return 1; } else { cout << "Verbunden mit SMTP Freenet - Port 25... " << endl; } // Daten austauschen int ok = 1; while(rc != SOCKET_ERROR) { char helo[256] = "EHLO localhost\r\n"; send(s, helo,strlen(helo),0); rc = recv(s,buf,256,0); buf[rc] = '\0'; printf("\nServer antwortet(ehlo): %s\n",buf); char auth[256] = "AUTH LOGIN\r\n"; send(s, auth,strlen(auth),0); rc=recv(s,buf,256,0); buf[rc] = '\0'; printf("\nServer antwortet(auth): %s\n",buf); // Was bedeutet diese Zeichenfolge, und wieso bekomme // ich so eine Ähnlich seltsame wieder zurück? // Woher weiß der Server, dass das der Usename ist? char user[256] = "c2ltb24ucGljdffda2VydEBnbXguZGU=\r\n"; send(s, user,strlen(user),0); rc = recv(s,buf,256,0); buf[rc] = '\0'; printf("\nServer antwortet(user): %s\n",buf); // Gleiche Frage wie oben. char pass[256] = "YXNfkZjFhcsfss2Rm\r\n"; send(s, pass,strlen(pass),0); rc=recv(s,buf,256,0); buf[rc] = '\0'; printf("\nServer antwortet(pass): %s\n",buf); system("Pause"); if(rc == 0) { cout << "Server hat die Verbindung getrennt.." << endl; break; } if(rc == SOCKET_ERROR) { cout << "Fehler: recv, fehler code: " << WSAGetLastError() << endl; break; } buf[rc] = '\0'; cout << "\nServer antwortet: " << buf << endl; } closesocket(s); WSACleanup(); return 0; }
-
Die IPAdresse des gewünsten Providers erhälst Du mittels "gethostbyname".
Un die komischen Strings erhälst Du wenn Du das Folgende liest:
http://de.wikipedia.org/wiki/SMTP-Auth
-
Danke, das hat mir schon sehr weitergeholfen.
Also teile ich über das senden von "AUTH LOGIN\r\n" dem Server also mit, dass Benutzername und Passwort Base64 encoded gesendet werden? So habe ich es jetzt zumindestens verstanden.
Und das mit gethostbyname() ist verständlich.
Und wie kann ich jetzt eine Mail versenden, nachdem ich mich eingeloggt habe? Gibt es dazu ein gutes Tuorial?
-
Habs jetzt geschafft.
Hier ist ein nettes Codebeispiel wie man eine mail versendet. Kombiniert mit dem Code den ich vorher gepostet habe, verschickt die Mails genauso wie ich will
-
Hi,
ich hab noch eine Frage zum Mail versenden.
Wie kann ich einen Anhang mit verschicken? Bei google hab ich nur gefunden, dass Anhänge nur codiert mit in den body von der mail verschickt werden.
Kann das einer eklären, wie genau man das anstellt, oder kennt eine Seite wo das beschrieben wird?
-
zur not vom echten mailprogramm mitschneiden???
-
hi
rfc zu smtp und derivaten lesen, und vieleicht einmal mit wireshark den trafic deines email clients wie zbsp. thunderbird, mitschneiden und analysieren.
du weist schon das diese standard auth sehr leich encodiert und mitgesnift werden kann !!?
schau dir dazu ssl bzw. tls an meine für die auth.
stichwort:status codes soltest du auch mal anschauen von smtp und derivaten.
lowbyte