Fehler bei "portierung" von konsolenanwendung in wx...
-
Hallo,
ich habe ein klasse mySMTP gefunden/gebastelt die in der Konsole funktioniert. Nun möchte ich aber auch mails aus Windows herraus versenden, jedoch bekomm ich dort immer den windows Fehler "...progrmm muss beendet werde..."
Ist ziemlich viel code, aber compilert wird Fehlerfrei und wenn ich es als Konsolenversion benutze funktioniert auch, nur halt aus einem Programm herraus nicht.
Testweise benutzen wollt ich es so wenn ich auf einen Button drücke:void mailtestFrm::WxButton1Click(wxCommandEvent& event) { const char *sender="f.heinze@feueraus.de"; const char *reciever="fheinze@feueraus.de"; const char *server="post.strato.de"; const char *fname="mytest.txt"; const char *attFile="C:\\Temp\\email\\mytest.txt"; const char *message="test nachricht"; const char *subject="test subject"; mySMTP *mail=new mySMTP(); mail->conect(server, sender, reciever, subject, message, fname, attFile); }
#include "mySMTP.h" mySMTP::mySMTP() { } mySMTP::~mySMTP(){} WORD version = MAKEWORD(1,1); WSADATA wsaData; SOCKET theSocket; char Buf[256],myBuf[1024]; // Buf -for server answer and myBuf -for your commands int nRet; // For eventual errors using namespace std; void conect(const char *server, const char *sender, const char *reciever, const char *subject, const char *message, const char *fname, const char *attFile); void sendmail(const char *server, const char *sender, const char *reciever, const char *subject, const char *message, const char *fname, const char *attFile); void RunApplication(LPCTSTR FileName, LPCTSTR FileParam); void mySMTP::conect(const char *server, const char *sender, const char *reciever, const char *subject, const char *message, const char *fname, const char *attFile) { //Connects to a server using "Winsock" // Start up Winsock nRet=WSAStartup(version, &wsaData); if (nRet!=0) { } // Store information about the server LPHOSTENT lpHostEntry; lpHostEntry = gethostbyname(server); if (lpHostEntry == NULL) { WSACleanup(); } // Create the socket theSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (theSocket == INVALID_SOCKET) { WSACleanup(); } SOCKADDR_IN saServer; saServer.sin_family = AF_INET; saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list); saServer.sin_port = htons(25); // Port 25 // Connect to the server nRet = connect(theSocket,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); if (nRet == SOCKET_ERROR) { WSACleanup(); } nRet = recv(theSocket,Buf,sizeof(Buf),0); if (nRet == SOCKET_ERROR) { WSACleanup(); } if (Buf[0]=='4' || Buf[0]=='5') { return(0); // Not a '220' Hello } if (Buf[0]=='2' && Buf[1]=='2' && Buf[2]=='0') { sendmail("post.strato.de", "f.heinze@feueraus.de", "fheinze@feueraus.de", "test", "dies ist ein test","tester.txt" , "C:\\Temp\\email\\mytest.txt"); //sendmail(server, sender, reciever, subject, message, fname, attFile); // Ok to send mails } //Close the connection closesocket(theSocket); // Shutdown Winsock WSACleanup(); } void mySMTP::sendmail(const char *server, const char *sender, const char *reciever, const char *subject, const char *message, const char *fname, const char *attFile){ int err=0; char ch[1]; // "HELO" the server strcpy(myBuf, "HELO "); strcat(myBuf,server); strcat(myBuf,"\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); recv(theSocket,Buf,sizeof(Buf),0); // MAIL FROM... if (Buf[0]=='2' && Buf[1]=='5' && Buf[2]=='0') { strcpy(myBuf, "MAIL FROM:<"); strcat(myBuf,sender); strcat(myBuf,">\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); recv(theSocket,Buf,sizeof(Buf),0); } if (Buf[0]=='4' || Buf[0]=='5'){ err=1; //cout<<"Fehler sender \n"; exit(1); } if (Buf[0]=='2' && Buf[1]=='5' && Buf[2]=='0' && err==0) { // MAIL TO... strcpy(myBuf, "RCPT TO:<"); strcat(myBuf, reciever); strcat(myBuf, ">\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); recv(theSocket,Buf,sizeof(Buf),0); } if (Buf[0]=='4' || Buf[0]=='5'){ err=1; //cout<<"fehler reciever\n"; exit(1); } if (Buf[0]=='2' && Buf[1]=='5' && err==0) { strcpy(myBuf, "DATA\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); recv(theSocket,Buf,sizeof(Buf),0); } if (Buf[0]=='4' || Buf[0]=='5'){ err=1; exit(1); } // MIME encoded message if (Buf[0]=='3' && Buf[1]=='5' && Buf[2]=='4' && err==0) { strcpy(myBuf, "From: <"); strcat(myBuf, sender); strcat(myBuf, ">\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); strcpy(myBuf, "Subject:"); strcat(myBuf, subject); strcat(myBuf, "\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); // MIME stuff strcpy(myBuf, "MIME-Version: 1.0\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); strcpy(myBuf, "Content-Type: multipart/mixed;\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); strcpy(myBuf, " boundary = \"bla\"\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); strcpy(myBuf, "X-Priority: 3\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); strcpy(myBuf, "X -MSMail - Priority: Normal\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); strcpy(myBuf, "X-Mailer: mailer@localhost\x0d\x0a\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); strcpy(myBuf, "This is a multi-part message in MIME format.\x0d\x0a\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); strcpy(myBuf, "--bla\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); strcpy(myBuf, "Content-Type: text/plain; charset:us-ascii\x0d\x0a\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); // This is the message (change it as you whish) strcpy(myBuf, message); strcat(myBuf, "\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); strcpy(myBuf, "--bla\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); strcpy(myBuf, "Content-Type: application/x-msdownload;\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); // This is the attachement file name, also change this strcpy(myBuf, " name = \""); strcat(myBuf,fname); strcat(myBuf, "\"\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); strcpy(myBuf, "Content-Transfer-Encoding: base64\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); strcpy(myBuf, "Content-Disposition: attachment;\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); // This is the attachement file name, also change this strcpy(myBuf, " filename = \""); strcat(myBuf,fname); strcat(myBuf, "\"\x0d\x0a\x0d\x0a"); //strcpy(myBuf, " filename = \"test.txt\"\x0d\x0a\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); //encode file to base64 std::stringstream s; s<<"C:\\Temp\\email\\base64.exe"; string FileName =s.str(); s.str(""); s.clear(); s<<" -e "<<attFile<<" C:\\Temp\\email\\encoded.b64"; string FileParam =s.str(); RunApplication(FileName.c_str(), FileParam.c_str()); Sleep(500); //Send the file byte by byte fstream f; f.open("C:\\Temp\\email\\encoded.b64", ios::in); // The file must be Base64 encoded while (!f.eof()){ f.get(ch[1]); strcpy(myBuf,&ch[1]); send(theSocket,myBuf,strlen(myBuf),0); } f.close(); strcpy(myBuf, "\x0d\x0a--bla--\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); strcpy(myBuf, "\x0d\x0a.\x0d\x0a"); //cout<<myBuf; // End transmission ;) send(theSocket,myBuf,strlen(myBuf),0); recv(theSocket,Buf,sizeof(Buf),0); } if (Buf[0]=='4' || Buf[0]=='5'){ //cout<<"error content\n"; err=1; exit(1); } // QUIT (bye bye) strcpy(myBuf, "QUIT\x0d\x0a"); send(theSocket,myBuf,strlen(myBuf),0); } // führt per ShellExecute die Anwendung, die mit der Dateiendung von FileName // assoziert ist aus, FileParam spezifiziert zusätzliche Aufrufparameter void mySMTP::RunApplication(LPCTSTR FileName, LPCTSTR FileParam) { int ret = (int) ShellExecute(0, "open", FileName, FileParam, 0, SW_SHOW); if (ret <= 32) { //wxMessageDialog msg(NULL, wxT("Ein Fehler beim öffnen des Programms ist aufgetreten"), wxT("Fehler")); //msg.ShowModal(); } }
und der dazugehörige Header:
#ifndef __MYSMTP_h__ #define __MYSMTP_h__ #include <cstdlib> #include <fstream> #include <sstream> #include <iostream> #include <winsock.h> #include <shellapi.h> #include <string> class mySMTP{ public: mySMTP(); virtual ~mySMTP(); void conect(const char *server, const char *sender, const char *reciever, const char *subject, const char *message, const char *fname, const char *attFile); private : void sendmail(const char *server, const char *sender, const char *reciever, const char *subject, const char *message, const char *fname, const char *attFile); void RunApplication(LPCTSTR FileName, LPCTSTR FileParam); }; #endif
Hoffe es kann mir wer helfen
Danke & Gruß
-
Ich habe es zwischenzeitlich erstmal so gelöst, das ich die Konsolenversion benutzte und diese dann aus meinen programm mittels ShellExecute starte und die entsprechenden Paramter mit übergebe. Gefällt mir allerdings nicht wirklich, wenn jemand also einen Tip hat woran mein ursprüngliches Vorhaben scheitert...
-
Hm, ka. Aber es gibt auch wxSMTP soviel ich weiss, versuch doch mal damit dein Glück.
Ansonsten könnte man den Code natürlich auch nach wxWidgets portieren, so das er wxSocket nutzt.phlox
-
wxSMTP konnte ich in der LibaryList von Version 2.6.3 nicht finden... werd mal nach googlen und das dann wenn damit nochmal versuchen!
-
schau mal bei wxCode. Oder such einfach im wxWidgetsforum.
-
hab das hier gefunden
http://www.wxwidgets.org/wiki/index.php/WxSMTP
die Files zu meinem Projekt hinzugefügt kompiliert und getestet!
Funktioniert wunderbar
Danke