Mailen mit C/C++???
-
Hy Leute,
ich möchte ein c-Programm schreiben, was verschiedene Dateien im Anhang
versenden kann. Um nicht wieder direkt was ins Forum zu posten habe ich
mich mal über verschiedene Bibliotheken informiert, aber ich habe keine
passende gefunden. Es gibt zum beispiel die Bibliothek smtp.h, doch hier
gibt es immer verschiedene und da passt überhaupt nichts von zusammen. Hat
vielleicht schon mal einer von Euch so ein Programm geschrieben und kennt
bestimmte Bibliotheken die funktionieren?Danke schon mal für Eure Hilfe!
Lippy
-
hi!
nimm winapi, dann kommst du zur lösung like that:#include <windows.h> #include <winsock.h> #pragma comment (lib, "wsock32.lib") #define HELO_MAX 4 BOOL fHeloSenden (SOCKET) ; BOOL fBodySenden (SOCKET) ; BOOL fQuitSenden (SOCKET) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ struct sockaddr_in server ; SOCKET sock ; char command[200], buff[100], szHost[] = "mail.gmx.net" ; unsigned int iFor, iEmpfangen ; short wVersionRequested ; WSADATA wsaData ; struct hostent *he ; ZeroMemory (&server, sizeof (sockaddr_in)) ; wVersionRequested = MAKEWORD (1, 1) ; WSAStartup (wVersionRequested, &wsaData) ; if (!(he = gethostbyname (szHost))){ MessageBox (NULL, "gethostbyname", "Fehler", NULL) ; return 1 ; } if (he->h_addrtype != AF_INET){ MessageBox (NULL, "AF_INET", "Fehler", NULL) ; return 2 ; } if (!he->h_addr_list[0]){ MessageBox (NULL, "he->h_addr_list[0]", "Fehler", NULL) ; return 3 ; } server.sin_family = AF_INET ; server.sin_port = htons (25) ; server.sin_addr = *(struct in_addr*) he->h_addr_list[0] ; if ((sock = socket (PF_INET, SOCK_STREAM, 0)) == -1){ MessageBox (NULL, "socket", "Fehler", NULL) ; return 4 ; } if (connect (sock, (struct sockaddr*) &server, sizeof (struct sockaddr)) < 0){ MessageBox (NULL, "connect", "Fehler", NULL) ; return 5 ; } fHeloSenden (sock) ; fBodySenden (sock) ; fQuitSenden (sock) ; closesocket (sock) ; WSACleanup () ; return 0 ; } BOOL fHeloSenden (SOCKET sock){ char *smtp[] = { "HELO tescik\r\n", "MAIL FROM: <email@email.de>\r\n", "RCPT TO: <email@email.de>\r\n", "DATA\r\n", "From: ich\r\nTo: ich\r\nSubject: Test\r\n"} ; char command[100], buff[100] ; unsigned int iEmpfangen = 0, iFor = 0 ; for(iFor = 0; iFor <= HELO_MAX; iFor++){ strcpy (command, smtp[iFor]) ; send (sock, command, lstrlen (command), 0) ; if (iFor != HELO_MAX){ iEmpfangen = recv (sock, buff, sizeof (buff), 0) ; buff[iEmpfangen] = '\0' ; MessageBox (NULL, (LPTSTR) buff, "empfang", NULL) ; } } return 0 ; } BOOL fBodySenden (SOCKET sock){ char *smtp[] = { "Mime-Version: 1.0\r\n", "Content-Type: multipart/mixed; boundary=\"IstEineID\"\r\n\r\n", "--IstEineID\r\n", "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n", "Content-Transfer-Encoding: 7bit\r\n\r\n", "Teil 1 der email\r\n", "--IstEineID\r\n", "Content-Type: text/plain; charset=\"US-ASCII\"\r\n\r\n", "Teil 2 der email (so zu sagen anhang... hehehe)\r\n", "--IstEineID--"} ; char command[100], buff[100] ; unsigned int iEmpfangen = 0, iFor = 0 ; for(iFor = 0; iFor <= 9; iFor++){ strcpy (command, smtp[iFor]) ; send (sock, command, lstrlen (command), 0) ; } return 0 ; } BOOL fQuitSenden (SOCKET sock){ char *smtp[] = { "\r\n.\r\n", "QUIT\r\n", "QUIT\r\n"} ; char command[100], buff[100] ; unsigned int iEmpfangen = 0, iFor = 0 ; for(iFor = 0; iFor <= 2; iFor++){ strcpy (command, smtp[iFor]) ; send (sock, command, lstrlen (command), 0) ; iEmpfangen = recv (sock, buff, sizeof (buff), 0) ; buff[iEmpfangen] = '\0' ; MessageBox (NULL, (LPTSTR)buff, "empfang", NULL) ; } return 0 ; }
bitte lies hier nach:
http://www.c-plusplus.net/forum/viewtopic.php?t=59537&highlight=email+versendenoder da:
http://www.c-plusplus.net/forum/search.php?mode=resultssee u!
-
Danke für die Antwort, aber diese Lösung läuft nur unter Windows und nicht Plattform unabhängig. Gibt es eine Möglichkeit ein Programm zu schreiben was nicht von dem Betriebssystem abhängig ist???
Danke für Eure Mitarbeit!
-
@lippy, Sockets sind nun mal Platform abhängig. Jedoch kann man den Code von blacky relativ einfach nach Linux/Unix portieren. Unter www.ecst.csuchico.edu/~beej/guide/net/ findest du die dazu notwendigen Informationen. Außer der Initialisierung mit WSAStartup, welche nur unter Windows benötigt wird, ändert sich nicht viel.
-
Hy Leute,
ich hab' keine Ahnung warum sich das Programm nicht compilieren lässt. Aber es kommen immer Linker-Errors beim compilieren.
Lippy
-
wichtig wäre, zu wissen, welchen compiler du fährst.
wenn du eine ide nimmst, achte darauf, daß du ein WIN32 projekt anlegst, keine win32 konsoelenapplikation.
der einsprung ist eine win_maindas programm läuft so einwandfrei unter windows.
-
Hy elise,
ich benutze den Bloodsheet Dev C++. Welchen Compiler benutzt du den???
Lippy
-
Hallo,
Also unter Unix würde ich auf alle Fälle den bereits installierten MTA des Systems verwenden; kein Grund das Rad neu zu erfinden!
-
Hy,
ich versuche ja unter Windows zu programmieren und da ich bisher immer nur so billig Programme geschrieben habe weiss ich jetzt nicht genau wie das funktioniert.
Lippy
-
hab ein problem mit dem programm oben
und zwar sagt er bei der empfänger email danach unimplemented....aber warum?!
der rest des programmes funktioniert...un die email etc auch, wenn ichs manuel eintipp...woran könnte das liegen?