minokitaro | Bonjour, je voulais faire un programme qui me permettrais de récupérer tous mes mails et de les stocker dans un dossier.
Le problème c'est qu'il plante avec "certain mail" sans que je puisse savoir pourquoi...
exemple :
j'ai 100 mails dans ma boites il récupère puis plante au 10eme.
je recommence cette fois en commencer par le 20eme et je peux récupérer tous le reste.
si je supprime le mail qui me plante je récupère tous sans problème...
procédé :
- je récupère la liste pour avoir le nombre de mails
- je fais une boucle pour récupérer les mails et les stocks dans des fichiers séparer
NB: il ouvre un fichier connection.txt ou il y a les infos d'un compte mail d'un server (sans SSL ou autre) :
smtp.fournisseur.com
compte
pass
port
donc j'aimerais savoir si le problème vous arrive aussi, et si vous avez des conseils. =)
http://dl.free.fr/pqTkKEKO/main.txt
Code :
- #ifdef WIN32
- #include <winsock2.h>
- #pragma comment(lib, "ws2_32.lib" )
- #elif defined (linux)
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <unistd.h> /* close */
- #include <netdb.h> /* gethostbyname */
- #define INVALID_SOCKET -1
- #define SOCKET_ERROR -1
- #define closesocket(s) close(s)
- typedef int SOCKET;
- typedef struct sockaddr_in SOCKADDR_IN;
- typedef struct sockaddr SOCKADDR;
- typedef struct in_addr IN_ADDR;
- #else
- #error not defined for this platform
- #endif
- #define USER "USER"
- #define PASS "PASS"
- #define PASSWORD "2t2k9q"
- #define LIST "LIST"
- #define RETR "RETR"
- #define END_DATA "."
- #define QUIT "QUIT"
- #define PORT 110
- #define BUF_SIZE 1024
- #define RECV_SIZE 32768
- #define CRLF "\r\n"
- #include <stdio.h>
- #include <stdlib.h>
- int _server_response(SOCKET sock, char *buffer);
- int send_server(SOCKET sock, char *command);
- int _pop_retrieve_list();
- int main()
- {
- int a=0;
- a = _pop_retrieve_list();
- if(a==0)
- printf("failed\n" );
- else
- printf("succeeded\n" );
- }
- int _server_response(SOCKET sock, char *buffer)
- {
- if(recv(sock, buffer, BUF_SIZE, 0) < 0)
- {
- perror("recv()" );
- return 0;
- }
- strtok(buffer, " \r\n" );
- if (strcmp(buffer,"+OK" ) != 0)
- {
- printf("Connexion failed\n" );
- return 0;
- }
- return 1;
- }
- int send_server(SOCKET sock, char *command)
- {
- if(send(sock, command, strlen(command), 0) < 0)
- {
- perror("send()" );
- return 0;
- }
- return 1;
- }
- int _pop_retrieve_list()
- {
- SOCKET sock;
- SOCKADDR_IN sin;
- FILE *fichier = NULL;
- struct hostent *hostinfo;
- char command[BUF_SIZE];
- char hostname[128];
- char account[128];
- char pass[128];
- char port[5];
- long port_long;
- char list[RECV_SIZE];
- char text[128];
- char text_dump[128];
- char* buffer = (char*)malloc(BUF_SIZE);
- char* temp = (char*)malloc(BUF_SIZE);
- int check = 0;
- int nombre_mail=0;
- int i;
- #ifdef WIN32
- WSADATA wsa;
- int err = WSAStartup(MAKEWORD(2, 2), &wsa);
- if(err < 0)
- {
- printf("WSAStartup failed !\n" );
- return 0;
- }
- #endif
- sock = socket(AF_INET, SOCK_STREAM, 0);
- if (sock == INVALID_SOCKET)
- {
- perror("socket()" );
- return 0;
- }
- fichier = fopen("connection.txt", "r" );
- if (fichier == NULL)
- {
- perror("fopen()" );
- return 0;
- }
- fgets(hostname, 128, fichier);
- fgets(account, 128, fichier);
- fgets(pass, 128, fichier);
- fgets(port, 128, fichier);
- fclose(fichier);
- strtok(hostname, "\n" );
- strtok(account, "\n" );
- strtok(pass, "\n" );
- strtok(port, "\n" );
- port_long = strtol(port, NULL, NULL);
- hostinfo = gethostbyname(hostname);
- if (hostinfo == NULL)
- {
- printf(stderr, "Unknown host %s.\n", BUF_SIZE);
- return 0;
- }
- sin.sin_addr = *(IN_ADDR *) hostinfo->h_addr;
- sin.sin_port = htons(port_long);
- sin.sin_family = PF_INET;
- if(connect(sock,(SOCKADDR *) &sin, sizeof(SOCKADDR)) == SOCKET_ERROR)
- {
- perror("connect()" );
- return 0;
- }
- //to check the reception
- check = _server_response(sock, buffer);
- if(check == 0)
- return 0;
- // send user account
- sprintf(command, "USER %s%s", account, CRLF);
- check = send_server(sock, command);
- if(check == 0)
- return 0;
- check = _server_response(sock, buffer);
- if(check == 0)
- return 0;
- // send user pass
- sprintf(command, "PASS %s%s", pass, CRLF);
- check = send_server(sock, command);
- if(check == 0)
- return 0;
- check = _server_response(sock, buffer);
- if(check == 0)
- return 0;
- // send LIST command
- sprintf(command, "LIST%s", CRLF);
- check = send_server(sock, command);
- if(check == 0)
- return 0;
- // retrieve LIST response
- sprintf(text, "%s@%s/list.txt", account, hostname);
- fichier = fopen(text, "w+" );
- if(fichier==NULL)// to create a new list file in a folder account@provider
- {
- sprintf(text, "mkdir %s@%s", account, hostname);
- system(text);
- sprintf(text, "%s@%s/list.txt", account, hostname);
- fichier = fopen(text, "w+" );
- }
- fclose(fichier);
- fichier = fopen(text, "a" );
- do
- {
- memset (list,0,RECV_SIZE);
- if(recv(sock, list, RECV_SIZE, 0) < 0)
- {
- perror("recv()" );
- return 0;
- }
- fprintf(fichier, list);
- }while(strstr(list, "\r\n.\r\n" )==0);
- fclose(fichier);
- // retrive the number of mail from the mail list
- fichier = fopen(text, "r" );
- if(fichier == NULL)
- {
- printf("error" );
- }
- else
- {
- fgets(text_dump, 128, fichier);
- do
- {
- nombre_mail++;
- }while(fgets(text_dump, 128, fichier)!=NULL);
- fclose(fichier);
- nombre_mail = nombre_mail-1;
- }
- for( i=1 ; i<nombre_mail ; i++)
- {
- // send RETR command
- sprintf(command, "RETR %ld%s", i, CRLF);
- check = send_server(sock, command);
- if(check == 0)
- return 0;
- // retrieve RETR response
- sprintf(text, "%s@%s/mail %3ld.txt", account, hostname, i);
- fichier = fopen(text, "w+" );
- fclose(fichier);
- fichier = fopen(text, "a" );
- strcpy(list, "" );
- printf(list);
- do
- {
- memset (list,0,16384);
- if(recv(sock, list, 16384, 0) < 0)
- {
- perror("recv()" );
- return 0;
- }
- fprintf(fichier, list);
- }while(strstr(list, "\r\n.\r\n" )==0);
- fclose(fichier);
- printf("%ld/%ld\n", i, nombre_mail-1);
- }
- return 1;
- }
|
|