Stoppt die Vorratsdatenspeicherung! Jetzt klicken && handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien:
 
pop3 und winsock
von Plapperkatze am 18.September 2006 um 01:10
zurück zur Kategorie "Tutorials"

hallo freunde,
diesmal werden wir mit winsock emails von einem pop3-server herunterladen. das ganze ist sehr einfach und nur als konsolen-anwendung realisiert. das genügt aber, um ein grundverständnis für das pop3-protokoll zu bekommen.

die rfc 1939 ist sehr zu empfehlen:
http://www.ietf.org/rfc/rfc1939.txt

hier also mein spärlich kommentierter code:
#include<stdio.h>
#include <winsock2.h>
//#include<string.h> // braucht bcc32 nicht

int main(int argc, char* argv[])
{
 long rc;
 SOCKET s;
 SOCKADDR_IN addr;
 char buf[1024];
 WSADATA wsa;
 HOSTENT* he;

 int number_of_mails,i;
 char *p,*p2;

 if(argc!=4)
 {
   printf("syntax: pop3console.exe host user password\n");
   printf("syntax: pop3console.exe pop3.web.de meier@web.de ganzgeheim\n");
   exit(1);
 }

 // socket erstellen und connecten
 if(WSAStartup(MAKEWORD(2,0),&wsa)!=0)
 {
   printf("Could not Startup WSA\n");
   exit(1);
 }

 s=socket(AF_INET,SOCK_STREAM,0);
 if(s==INVALID_SOCKET)
 {
   WSACleanup();
   printf("Could not create socket\n");
   exit(1);
 }

 memset(&addr,0,sizeof(SOCKADDR_IN)); // auf 0 setzen
 addr.sin_family=AF_INET;
 addr.sin_port=htons(110); // port

 he=gethostbyname(argv[1]);
 memcpy(&(addr.sin_addr),he->h_addr_list[0],4);

 rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
 if(rc==SOCKET_ERROR)
 {
   closesocket(s);
   WSACleanup();
   printf("Could not connect\n");
   exit(1);
 }

 printf("connected to %s\n",argv[1]);

 // login + check for mail

 sprintf(buf,"USER %s\r\n",argv[2]);
 rc=send(s,buf,strlen(buf),0);

 if(rc==SOCKET_ERROR)
 {
   closesocket(s);
   WSACleanup();
   printf("Could not send\n");
   exit(1);
 }

 rc=recv(s,buf,1023,0);
 buf[rc]='\0';
 printf("%s",buf);

 sprintf(buf,"PASS %s\r\n",argv[3]);
 rc=send(s,buf,strlen(buf),0);

 if(rc==SOCKET_ERROR)
 {
   closesocket(s);
   WSACleanup();
   printf("Could not send\n");
   exit(1);
 }

 rc=recv(s,buf,1023,0);
 buf[rc]='\0';
 printf("%s",buf);

 rc=recv(s,buf,1023,0);
 buf[rc]='\0';
 printf("%s",buf);

 sprintf(buf,"STAT\r\n");
 rc=send(s,buf,strlen(buf),0);

 if(rc==SOCKET_ERROR)
 {
   closesocket(s);
   WSACleanup();
   printf("Could not send\n");
   exit(1);
 }

 rc=recv(s,buf,1023,0);
 buf[rc]='\0';
 printf("%s",buf);

 // anzahl der mails bestimmen
 // wenn alles geklappt hat, steht hinter dem letzten "+OK" die anzahl der mails im postfach

 p=buf;
 while(strstr(p,"+OK")!=NULL)
   p=strstr(p,"+OK")+1;
 p+=3;
 p2=strstr(p," ");
 if(p&&p2)
 {
   *p2=0;
   number_of_mails=atoi(p);
   printf("%d mails auf dem server\n",number_of_mails);
 }

 // mails runterladen und danach auf dem server löschen
 for(i=1;i<=number_of_mails;i++)
 {
   sprintf(buf,"RETR %d\r\n",i);
   send(s,buf,strlen(buf),0);

   do
   {
     rc=recv(s,buf,1024,0);
     buf[rc]='\0';
     printf("%s",buf);
     if(strstr(&buf[rc-5],"\r\n.\r\n")!=NULL)break;
   }
   while(rc!=SOCKET_ERROR);

   sprintf(buf,"DELE %d\r\n",i);
   send(s,buf,strlen(buf),0);
 }

 // session beenden
 sprintf(buf,"QUIT\r\n");
 send(s,buf,strlen(buf),0);

 // aufraeumen
 closesocket(s);
 WSACleanup();

 return 0;
}

man würde natürlich die mails lokal speichern, und dann einen emailbetrachter öffnen, statt sie nur in der konsole darzustellen.

eine andere idee ist, daraus einen spamfilter zu basteln, der unerwünschte mails löscht, bevor man sein email-proggie öffnet, das dann den rest runterläd.

gruesse von eurer katze

zurück zur Kategorie "Tutorials"
[1 Kommentare]

kennie (Gast) schrieb am 30. Juni 2011 um 19:18
DANKE für das Beispiel!!
Habe stundenlang nach sowas gesucht... endlich :)

Nochmals Dank & Gruß

-kennie

Name


Kommentar




Bitte abtippen


 
(C) 2006-20012 Plapperkatze - 215314 Besucher seit dem 23.01.2012 Login