E-Mail abholen und senden



  • Ich hab das Problem, das ich mit dem unten angeführten Code versuche die Emails abzuholen, kommt ein error. Wenn ich versuche eine Email zu schreiben kommt ein Timeout vom smtp-Server.(Ich hab die angaben für smtp entsprechend geändert).

    #include <windows.h>
    
    #include <winsock2.h>
    
    #include <stdio.h>//Prototypen
    #include <iostream>
    
    using namespace std;
    
    int startWinsock(void);
    
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr)
    
    {
    
      long rc;
    
      unsigned long ip;
    
      HOSTENT* he;  /* Parameter prüfen */
    
      if(hostnameOrIp==NULL || addr==NULL)
    
        return SOCKET_ERROR;  /* eine IP in hostnameOrIp ? */
    
      ip=inet_addr(hostnameOrIp);  /* bei einem fehler liefert inet_addr den Rückgabewert INADDR_NONE */
    
      if(ip!=INADDR_NONE)
    
      {
    
        addr->sin_addr.s_addr=ip;
    
        return 0;
    
      }
    
      else
    
      {
    
        /* Hostname in hostnameOrIp auflösen */
    
        he=gethostbyname(hostnameOrIp);
    
        if(he==NULL)
    
        {
    
          return SOCKET_ERROR;
    
        }
    
        else
    
        {
    
          /*die 4 Bytes der IP von he nach addr kopieren */
    
          memcpy(&(addr->sin_addr),he->h_addr_list[0],4);
    
        }
    
        return 0;
    
      }
    
    }
    
    void wait () 
    { 
        std::cin.clear(); 
        std::cin.ignore(std::cin.rdbuf()->in_avail()); 
        std::cin.get(); 
    } 
    
    int main()
    
    {
    
      long rc;
    
      SOCKET s;
    
      SOCKADDR_IN addr;
    
      rc=startWinsock();
    
      if(rc!=0)
    
      {
    
        printf("Fehler: startWinsock, fehler code: %d\n",rc);
    
        return 1;
    
      }
    
      else
    
      {
    
        printf("Winsock gestartet!\n");
    
      }
    
      s=socket(AF_INET,SOCK_STREAM,0);
    
    if(s==INVALID_SOCKET)
    
    {
    
      printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
    
      return 1;
    
    }
    
    else
    
    {
    
      printf("Socket erstellt!\n");
    
    }
    
      memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten 
    
    addr.sin_family=AF_INET;
    
    addr.sin_port=htons(110); // wir verwenden mal port 12345
    
    //addr.sin_addr.s_addr=inet_addr("127.0.0.1"); // zielrechner ist unser eigener
    
     rc=getAddrFromString("pop.web.de",&addr); 
     if(rc==SOCKET_ERROR)
     {    
          printf("IP für %s konnte nicht aufgeloest werden\n");    
          return 1;  
     }  
     else  
     {    
          printf("IP aufgeloest!\n");  
     }
    
    rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    
    if(rc==SOCKET_ERROR)
    
    {
    
      printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
    
      //return 1;
    
    }
    
    else
    
    {
    
      cout << "Verbunden mit smtp.web.de" << endl;
    
    }
      int zahl = 0;
      char puffer[255] = " ";
      zahl = recv(s, puffer, 255, 0);
      if (zahl==SOCKET_ERROR) cout << "Error"<< endl;
      cout << zahl << endl;
      cout << puffer << endl;
      strcpy(puffer, " ");
      Sleep(1000);
      zahl = send(s, "USER xxx@web.de\0",17,0);
      if (zahl==SOCKET_ERROR) cout << "Error"<< endl;
      cout << zahl << endl;
      zahl = recv(s, puffer, 255, 0);
      if (zahl==SOCKET_ERROR) cout << "Error"<< endl;
      cout << zahl << endl;
      cout << puffer << endl;
      strcpy(puffer, " ");
      Sleep(1000);
      zahl = send(s, "PASS PASSWORT\0", 17, 0);
      if (zahl==SOCKET_ERROR) cout << "Error"<< endl;
      cout << zahl << endl;
      Sleep(100);
      zahl = recv(s, puffer, 255, 0);
      if (zahl==SOCKET_ERROR) cout << "Error"<< endl;
      cout << zahl << endl;
      cout << puffer << endl;
      wait();
      return 0;
    
    }
    int startWinsock(void)
    
    {
    
      WSADATA wsa;
    
      return WSAStartup(MAKEWORD(2,0),&wsa);
    
    }
    


  • 1. Was für ein error kommt?
    2. Forum WinAPI wäre besser.
    Simon



  • bei smtp kommt timeout vom server. Bei pop3 gibt recv -1 zurück.

    mfg liggi1980



  • -1 bei recv() bedeuetet SOCKET_ERROR und mit WSAGetLastError() kann der detailierte Error Code geholt werden. Ich würde das tun.

    PS: deinen Code habe ich gar nicht gesichtet.



  • Hinweis: WSACleanup muss aufgerufen werden, wenn WinSock nicht mehr benötigt wird.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • im Momment geht die Verbindung immer verloren und es wird 0 zurück gegeben.

    mfg liggi1980



  • im Momment geht die Verbindung immer verloren und es wird 0 zurück gegeben.

    wo wird 0 zurückgegeben.

    Je besser Du dein Problem beschreibst, desto besser kann geantwortet werden.



  • recv gibt 0 zurück wenn die Verbindung unterbrochen wurde.

    mfg liggi1980



  • aha... du rufst ja nicht nur einmal recv auf.. also welche zeile?



  • ich bekomme die meldung das ich verbunden bin dann sende ich den Benutzername und dann dauerts etwas und dann ist die Verbindung weg.

    mfg liggi1980



  • \r\n statt \0



  • das Problem besteht aber weiterhin.

    mfg liggi1980



  • Kann ja gar nicht gehen!!!!!Hab vergessen die Anzahl der zu sendenen Zeichen um 4 zuerhöhen. Jetzt gehts.

    mfg liggi1980



  • Warum um 4 erhöhen? 😮



  • gilt \r\n nicht als 4 Zeichen?? Sind das nur 2 Zeichen???

    mfg liggi1980



  • Eigentlich sinds nur zwei... 😉


Anmelden zum Antworten