Vérifier si l'on a des mails

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 775 fois - Téléchargée 27 fois

Contenu du snippet

Voilà une petite fonction permettant de vérifier si l'on a des mails. J'ai pondu cette petite fonction pour les besoins d'un autre programme, je n'ai donc pas le temps ni l'envie de l'améliorer... Si quelqu'un veut l'améliorer, voici la liste des commandes d'un serveur POP3 :

USER identifiant
Cette commande permet de s'authetifier. Elle doit être suivie du nom de l'utilisateur, c'est-à-dire une chaiîne de caractères identifiant l'utilisateur sur le serveur. La commande USER doit précéder la commande PASS.

PASS mot_de_passe
La commande PASS, permet d'indiquer le mot de passe de l'utilisateur dont le nom a été spécifié lors d'une commande USER préalable.

STAT Information sur les messages contenus sur le serveur
RETR Numéro du message à récupérer
DELE Numéro du message à supprimer
LIST [msg] Numéro du message à afficher
NOOP Permet de garder les connexion ouverte en cas d'inactivité

TOP <messageID> <n>
Commande affichant n lignes du message, dont le numéro est donné en argument. En cas du réponse positive du serveur, celui-ci renvoie les en-têtes du message, puis une ligne vierge et enfin les n premières lignes du message.

UIDL [msg]
Demande au serveur de renvoyer une ligne contenant des informations sur le message éventuellement donné en argument. Cette ligne contient une chaîne de caractères, appelée listing d'identificateur unique, permettant d'identifier de façon unique le message sur le serveur, indépendamment de la session. L'argument optionnel est un numéro correspondant à un message existant sur le serveur POP, c'est-à-dire un message non effacé).

QUIT
La commande QUIT demande la sortie du serveur POP3. Elle entraîne la suppression de tous les messages marqués comme effacés et renvoie l'état de cette action.

Source / Exemple :


char* CheckMail(char* login, char* password, char* server, int port) {
	SOCKET sock;

	char* user = new char[1024];
	strcpy(user, "USER ");
	char* pass = new char[1024];
	strcpy(pass, "PASS ");

    strcat(user, login);
	strcat(user, "\r\n");
    strcat(pass, password);
	strcat(pass, "\r\n");

	WSADATA wsaData;
	WSAStartup(0x0101, &wsaData);

    struct sockaddr_in serverSockAddr;
    long hostAddr;

    sock = NULL;
	hostAddr = inet_addr(server);

	if (hostAddr != -1)
		memcpy(&serverSockAddr.sin_addr, &hostAddr, sizeof(hostAddr));
    else {
		struct hostent* serverHostEnt;
        serverHostEnt = gethostbyname(server);
        if (serverHostEnt == NULL)
			return false;
		memcpy(&serverSockAddr.sin_addr, serverHostEnt->h_addr, serverHostEnt->h_length);
	}

    serverSockAddr.sin_port = htons(port);
    serverSockAddr.sin_family = AF_INET;

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0)
		return false;

	int not = 0;
    setsockopt(sock, SOL_SOCKET, SO_DONTLINGER, (char *)&not, sizeof(not));

    if (connect(sock, (struct sockaddr*)&serverSockAddr, sizeof(serverSockAddr)) < 0)
		return false;

	unsigned long ioctl_blocking = 1;
    ioctlsocket(sock, FIONBIO, &ioctl_blocking);

	char buf[1024];
	buf[0] = 0x00;
	while (!buf[0])
		recv(sock, buf, 1024, 0);

	char* result = new char[32];

	for (int i = 0; i < 4; i++) {
		char* buffer = new char[sizeof(user)];
		switch (i) {
			case 0: strcpy(buffer, user); break;
			case 1: strcpy(buffer, pass); break;
			case 2: strcpy(buffer, "STAT\r\n"); break;
			case 3: strcpy(buffer, "QUIT\r\n"); break;
		}
		Sleep(1000);
		send(sock, buffer, strlen(buffer), 0);

		char buf[1024];
		buf[0] = 0x00;
		while (!buf[0])
			buf[recv(sock, buf, 1024, 0)] = '\0';

		if (i == 2) {
			if (buf[0] == '+' && buf[1] == 'O' && buf[2] == 'K') {
				for (int i = 4; buf[i] != ' '; i++);
				result[i - 3] = '\0';
				for (; i >= 4; i--) result[i - 4] = buf[i];
			} else {
				strcpy(result, "0");
			}
		}
	}

    shutdown(sock, 2);
    
    return result;
}

Conclusion :


#include <windows.h> et ws2_32.lib nécessaires

Exemple d'utilisation :

MessageBox(NULL, CheckMail(nom_dutilisateur, mot_de_passe, pop3.wanadoo.fr, 110), "Messages en attente", NULL);

A voir également

Ajouter un commentaire

Commentaires

cs_LordBob
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
8
salut, je viens de tester ta source. et je n'arrive jamais a aller plus loin que le connect(), t'aurrais pas une explication, je suis sous VC2005 !
CyberP
Messages postés
283
Date d'inscription
mercredi 8 janvier 2003
Statut
Membre
Dernière intervention
4 juillet 2007
2
euh désolé je n'ai pas VC2005 donc je ne sais pas s'il y a une explication logique à cela
sinon essaye de débugger pour voir pourquoi ça ne marche pas
essaye un autre code qui utilise ce genre de fonctions pour voir si c'est bien à cause de ce code que ça ne marche pas ou si c'est un problème dû au pc

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.