Vérifier si l'on a des mails

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

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.