Emails versenden
-
Morgen hat wer eine Ahnung wie ich Email mit C++ versenden kann ?
Ich will das OHNE irgendwelche Komponeten ( z.b. indy komponente ) machen.
-
Ohne irgendwelche Komponenten ist das unmöglich.
-
Wo muss man sich einlesen wenn man selber eine Mail Komponete Programmieren will z.b. ?
-
Hi!
Mit ISO-C++ ist es unmöglich. Mit C++ und Sockets ist es durchaus möglich. Kann man ja auch mit telnet machen, wenn man einen entsprechenden Zugang zu einem Mail-Server hat. Mit SMTP zumindest recht simpel. Eigentlich muss man nur die Zeilen, wie man sie im Wikipedia-Artikel über SMTP zu finden sind an den Server senden und ebenso muss man die Antworten korrekt auswerten. Natürlich muss man eventuell noch eine entsprechende Authentifizierung durchführen (siehe dazu z.B. SMTP-Auth). Da ich grad nicht zuhause bin, hab ich leider kein Codebeispiel parat (zuhause müsste ich noch nen source von mir haben, der auch nen Anhang mit versendet).
Greetz
-
Vellas könntest du mir vielleicht später das Code beispiel posten plz ? :xmas2:
-
Hi!
Naja, ist nicht ganz trivial. Meine Socket-Klasse kann ich dir leider nit posten, aber eigentlich macht die nicht viel mehr, als normale Verbindungsaufbau und Verbindungsabbau Funktionen zu implementieren und die send und recv Funktionen der Socket-Bibliothek zu kapseln. Auf jeden Fall solltest du beim receive einen timeout auf den Socket per select legen. Wie das geht, kannst du im Internet recherchieren, ich will dir hier schließlich nicht alles vorkauen, aber ich kann dir versichern, ich habe ausschließlich Posix-Sockets verwendet, wie sie in ws2_32.lib in Windows zur Verfügung gestellt werden bzw. in Unix-Systemen in der socket.h, netdb.h und anderen Headern zur Verfügung stehen.
bool sendMail(string szServer, string szFrom, string szTo, string szSubject, string szMessage) { Socket theSocket; unsigned int timeout = 10000; // 10 seconds string strResponse; // Connect to the server if (!theSocket.connect(szServer, 25)) { cerr << "Socket creation failed" << endl; return false; } // Read the "HELO" response from the server if (theSocket.receive(strResponse, timeout)<0) return false; if (strResponse.substr(0, 3) != ("220")) { string strError = "ERROR: Not a valid SMTP server response\r\n"; strError += strResponse; cerr << strError << endl; theSocket.send("QUIT\r\n"); return false; } // Send the "FROM" line string strCommand = "MAIL FROM:<"; strCommand += szFrom; strCommand += ">\r\n"; theSocket.send(strCommand); // and check the response if (theSocket.receive(strResponse, timeout)<0) return false; if (strResponse.substr(0, 3) != ("250")) { string strError = "ERROR: Sender rejected\r\n"; strError += strResponse; cerr << strError << endl; theSocket.send("QUIT\r\n"); return false; } // Send the "RCPT" line strCommand = "RCPT TO:<"; strCommand += szTo; strCommand += ">\r\n"; theSocket.send(strCommand); // and check the response if (theSocket.receive(strResponse, timeout)<0) return false; if (strResponse.substr(0, 3) != ("250")) { string strError = "ERROR: Recipient rejected\r\n"; strError += strResponse; cerr << strError << endl; theSocket.send("QUIT\r\n"); return false; } // Send the "DATA" line theSocket.send("DATA\r\n"); // and check the response if (theSocket.receive(strResponse, timeout)<0) return false; if (strResponse.substr(0, 3) != ("354")) { string strError = "ERROR: DATA command rejected\r\n"; strError += strResponse; cerr << strError << endl; theSocket.send("QUIT\r\n"); return false; } // Send the "Subject" line strCommand = "From: " + szFrom + "\r\n"; strCommand += "To: " + szTo + "\r\n"; strCommand += "Subject: " + szSubject; strCommand += "\r\n"; theSocket.send(strCommand); // Send the message data if (theSocket.send(szMessage)<0) return false; // Send the termination line theSocket.send("\r\n.\r\n"); // and check the response if (theSocket.receive(strResponse, timeout)<0) return false; if (strResponse.substr(0, 3) != ("250")) { string strError = "ERROR: Message body rejected\r\n"; strError += strResponse; cerr << strError << endl; theSocket.send("QUIT\r\n"); return false; } // Send the "QUIT" line theSocket.send("QUIT\r\n"); return true; }Send ist eigentlich nichts anderes als ein gekapselter Aufruf von der send Funktion aus der Socket-Bibliothek. Die connect-Funktion baut die Verbindung auf und verbindet sich auf den angegebenen Server auf den Port 25. recv in receive ist zwar auch eine eigene Funktion, aber kapselt, äquivalent zu send, die recv-Funktion aus der Socket-Bibliothek.
Der Aufruf:
string strToAddress = "mail@domain.de"; string strSubject = "Subject"; string strServer = "domain.de"; string strFrom = "mail@domain.de"; cout << sendMail(strServer, strFrom, strToAddress, strSubject, "Hallo, Mail-World! :)") << endl;Wenn du einigermaßen mit Sockets umgehen kannst sollte das kein Problem sein. Den Teil zum versenden von Anhängen habe ich entfernt. Wenn du wissen willst wie das geht, musst du es dir anlesen und/oder halt mit einer Mailanwendung ausprobieren und auswerten.
Gut die sendMail-Funktion ist nicht grad gut programmiert, aber ich hab das Beispiel grad eben mal schnell zusammengebastelt. Der eigentliche Code ist wesentlich umfangreicher (und auch nicht in nur einer Funktion realisiert).
Greetz
-
Der Code geht davon aus das ein recv-Call immer eine Zeile einliest. Das muss unbedingt gefickst werden.
-
!! schrieb:
Der Code geht davon aus das ein recv-Call immer eine Zeile einliest. Das muss unbedingt gefickst werden.
Viel Spass dabei

Wenn ich auch nicht weiß woher du wissen willst, wie ich die recv-Funktion in receive genau aufrufe. Es wird auf jeden Fall sichergestellt das alles eingelesen wird. Was man eventuell besser machen sollte ist, sicherstellen das, wenn mehrere Zeilen gelesen wurden, diese entsprechend gesplittet werden.Greetz
-
Es gibt plattform-neutrale Netzwerk-Libs für C++, die auch gleich fertige Mail-Klassen mitbringen. http://pocoproject.org/ ist z.B. eine gute Anlaufstelle.
Schau mal hier:
http://pocoproject.org/docs/Poco.Net.SMTPClientSession.html#14908