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...


  • Mod

    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!


  • Mod

    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


Anmelden zum Antworten