E-Mail aus Anwendung schicken
-
Dieser Link bringt keine Information!
-
Informationen, nein.
Das ist eine Klasse die ich vor einiger Zeit mal entwickelt habe, die über Sockets E-Mails versendet .. Nachteil ist, dass man sich bei den meisten E-Mail-Anbietern erst authentifizieren muss, d.h. Anmeldename und Passwort in base64-Codierung mit angeben muss, bevor man über deren Server E-Mails versenden kann. Wie die Klasse genau funktioniert, steht (mit kleinem Beispiel) in der PDF die im Downloadlink enthalten ist ..Edit: Die pdf war veraltet ist mir gerade aufgefallen, hab das Archiv aktualisiert .. Fehlerbehandlung ist auch dürftig, aber musst die Klasse ja nicht benutzen, ist nur ein Lösungsansatz ^^
-
Wenn du bisschen warten kannst, kann ich Dir meine Smtp library zukommen lassen.. leider noch ohne ssl, aber dafür alles was Dein Herz begehrt.
- Anhänge
- md5 Auth
- base64, login und plain Auth
- SocksV4-5 unterstützung, wenn Du das Mail über eine Socks-Kette schicken möchtest.Die library ist in C geschrieben, und nach RFC standard geschrieben..also keine 3 library von nöten... die ssl unterstützung wird folgen.
Kannst mir ja Deine Mail-Addr hinterlegen, wenn Du intressiert bist.
Aber wenn ich so darüber nachdenke, hast Du noch andere Probleme, und zwar dass Du ja die Zugangsdaten zum Mail-Account vom Benutzer erfragen musst, sammt e-mail Server Adresse...um überhaubt ein mail an Dich absetzen zu können (Ob dass der User möchte, bezweifle ich. Aber ist von mir ausgesehen immer noch die beste Variante). Oder Du kannst Dir auch selber ein Account bei einem Anbieter erstellen, und denn fest in Dein Programm hinterlegen. Der nachteil an dieser Methode ist, dass man es reversen kann indem man Dein Binarie Analysiert. Sommit wäre eine DOS Attk oder MITM Attk möglich. Oder noch einfacher..man nehme Wireshark...aber mit ssl nicht möglich.
lowbyte
Ps:Mit ein bisschen warten meine ich frühstens heute Nachmittag.
-
Die beste Variante ist wohl einfach ein Skript (z.B. PHP) auf einem Webserver aufzurufen?!
-
Ist schon die beste, und gängigste Variante. Doch ein extra Webserver für ein kleines Programm, ich weis nicht. Wenn man all den aufwand vergleicht...hilst du Dir am besten die Account infos vom User.
Den aufwand wäre von mir aus gesehen zu hoch. Wenn man den bei allem von 0 anfängt.Webserver :
hardening
firewall
domain name alt. ddns
script , cgi
authorisierung beim webserver, da sonnst missbrauch oder andrrwertige attk's
möglich sind.
Und da musst Du die Credentials auch im Programm unterbringen..Somit Auch wieder Angreifbar, ausser mit asymmetrischer krypto... doch dann ist der Aufwand gross!
Also alles in allem ein riesen Aufwand.
-
@highbyte: wirst du deine library für alle öffentlich zur verfügung stellen oder nur für berniebutt?
-
magicbyte schrieb:
@highbyte: wirst du deine library für alle öffentlich zur verfügung stellen oder nur für berniebutt?
Werde sie auf vpn23.homelinux.org veröffentlichen sowie die pop3 library die ich parallel dazu entwckelt habe. Beide stehen unter der LGPL V3.
Wenn ich dazukomme werde ich sie spät in der Nacht Online stellen ansonsten im verlaufe Nächste Woche.
-
Warum braucht man eigentlich immer einen SMTP Server, um Mails zu versenden? Kann man nicht direkt mit dem Zielserver kommunizieren? Kennt ihr eine lib? Wenn möglich für C/C++ und PHP.
-
Frage1 schrieb:
Warum braucht man eigentlich immer einen SMTP Server, um Mails zu versenden? Kann man nicht direkt mit dem Zielserver kommunizieren? Kennt ihr eine lib? Wenn möglich für C/C++ und PHP.
-
Es besteht auch die Möglichkeit das "Neue E-Mail" Fenster des Standard-EMail Programms aufzurufen, um die Mail einfach über die Adresse des Benutzers zu verschicken. Wenn es dir in deinem Programm nur um eine simple Feedback Funktion geht wäre dies wohl dann der beste Ansatz. Hier noch ein paar Infos zur Implementierung: http://stackoverflow.com/questions/1820489/creating-a-new-email-message-using-the-default-email-program
-
player424 schrieb:
Es besteht auch die Möglichkeit das "Neue E-Mail" Fenster des Standard-EMail Programms aufzurufen, um die Mail einfach über die Adresse des Benutzers zu verschicken. Wenn es dir in deinem Programm nur um eine simple Feedback Funktion geht wäre dies wohl dann der beste Ansatz. Hier noch ein paar Infos zur Implementierung: http://stackoverflow.com/questions/1820489/creating-a-new-email-message-using-the-default-email-program
Und wenn der User kein Standard Mail Programm hat?
-
Und wenn der Benutzer keinen Computer hat kann er das Programm gar nicht erst ausführen
.
Ne Spass beiseite. Die Frage ist durchaus berechtigt. Allerdings, wenn dies wirklich nur ein kleines Projekt werden soll und die Mail-Funktion nur ein optionaler Bestandteil ist finde ich persönlich die Lösung immer noch am elegantesten.
Ein extra Account für das Programm zu erstellen um sich mit nem SMTP Server zu "unterhalten" ist, meiner Meinung nach, keine gute Idee, wg. bereits genanten Punkten. Da würd ich lieber das Risiko mit dem EMail-Programm eingehen. Notfalls kann man die EMail-Adresse auch in eine Readonly-Textbox packen, sodass der Nutzer sie dann in sein Web-Frontend einfügen kann.
Wenn der Benutzer auch keine EMail-Adresse hat, denke ich, wird er auch nicht unbedingt in der Lage sein die Funktion zu nutzen da er evt. eine Antwort erhält/erhalten sollte.
Aber solange wir den genauen Sinn der Funktion nicht kennen kann man hier auch keine genaue Aussage treffen. Ich wollte meinen Vorschlag nur mal in die Runde geworfen haben.Grüsse
player424
-
-lowbyte- schrieb:
Frage1 schrieb:
Warum braucht man eigentlich immer einen SMTP Server, um Mails zu versenden? Kann man nicht direkt mit dem Zielserver kommunizieren? Kennt ihr eine lib? Wenn möglich für C/C++ und PHP.
-
player424 schrieb:
Aber solange wir den genauen Sinn der Funktion nicht kennen kann man hier auch keine genaue Aussage treffen.
Ganz einfacher Sinn: Ich schmeisse online ein Programm unters Volk und erhoffe Rückantworten der Benutzer. Hierzu soll es quasi ein Kontaktformular als Dialog geben. Wenn der Benutzer den Button 'Senden' klickt, soll sein Text an meine E-Mail-Adresse gehen ohne diese explizit anzugeben.
Zur Information: Inzwischen läuft der erste Versuch mit MAPI32.DLL einwandfrei. Die Texte 'subject' und 'message' müssen mit Linefeed \n abgeschlossen werden. Das hatte ich übersehen. Den Rest kriege ich auch noch auf die Reihe.
Danke für alle Antworten. Das Thema scheint allgemein interessant zu sein.
-
Hallo, warum benutzt du nicht einfach WinSock? So habe ich es früher mal gemacht schau dir mal diese Links an:
http://de.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol
Du kannst dir auch mit www.wireshark.org mal anschauen was z.b. Outlook da so macht. (Das hat mir früher auch geholfen Benutzername und Passwort werden in Base64 kodiert, das heißt wenn z.b. ein Benutzer eingibt example@example.com dann muss das example@example.com in Base64 kodiert werden.)
Hier ein Base64 kodierer [nicht von mir]:
#include "base64.h" #include <iostream> static const std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; static inline bool is_base64(unsigned char c) { // return (isalnum(c) || (c == '+') || (c == '/') ); } std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) { std::string ret; int i = 0; int j = 0; unsigned char char_array_3[3]; unsigned char char_array_4[4]; while (in_len--) { char_array_3[i++] = *(bytes_to_encode++); if (i == 3) { char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; for(i = 0; (i <4) ; i++) ret += base64_chars[char_array_4[i]]; i = 0; } } if (i) { for(j = i; j < 3; j++) char_array_3[j] = '\0'; char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; for (j = 0; (j < i + 1); j++) ret += base64_chars[char_array_4[j]]; while((i++ < 3)) ret += '='; } return ret; }
base64.h
#include <string> std::string base64_encode(unsigned char const* , unsigned int len);
Und nicht das \n vergessen. (Ja ich weiss das Datum hier ist falsch, GetLocalTime wäre dort wohl besser...)
string send_mail ="From: <example@example.com>\n"; send_mail+="To: <example@example.com>>\n"; send_mail+="Subject: hallo ich bin der betreff\n"; send_mail+="Date: We, 9 Jun 2010 12:10:00\n"; send_mail+="Ich bin Text Zeile 1 der email \n"; send_mail+="\n"; // <-- so macht man einen Zeilenumbruch in der Email send_mail+="Ich bin Text Zeile 2 der email\n"; send_mail+=".\n";
-
Ich glaube man kann den Thread schliessen, das gespame von kiddies muss nich sein!
-
laberte er schrieb:
Ich glaube man kann den Thread schliessen, das gespame von kiddies muss nich sein!
Richtig: Den Thread kann man schliessen, weil auf verschiedene Weise auch für nicht-kiddies ohne Spam-Absichten lösbar. Über den Sinn und Zweck kann man reden! :p
-
Nein, denn ich bin noch offen.
-
Frage1 schrieb:
Warum braucht man eigentlich immer einen SMTP Server, um Mails zu versenden? Kann man nicht direkt mit dem Zielserver kommunizieren? Kennt ihr eine lib? Wenn möglich für C/C++ und PHP.
Sich direkt mit dem Ziel-SMTP-Server zu verbinden und die eMail dort abzuliefern hat mehrere Probleme, z.B.:
- Sehr viele Mailserver blockieren dynamische IP-Adressen, akzeptieren keine eMails von dynamischen IPs oder sortieren die eMails direkt in den Spam-Ordner
- Mailversand kann wegen Techniken wie Greylisting fehlschlagen-------
Beim Weg über MAPI gibt es bei codeproject recht viel:
http://www.codeproject.com/KB/IP/#MAPI
-
Sorry, ich meinte eigentlich, von einem dedicated server mit fixer IP aus eine Mail zu versenden.
Da trifft das dann ja nicht zu?
Weil wozu sollte main auf einem ded. server einen SMTP Server laufen lassen, nur weil man eine Mail verschicken will?