I. Lister le nombre de mails à lire

Piloter ses mails depuis une application mobile peut s'avérer confortable pour les utilisateurs afin qu'il n'y ait pas la nécessité de switcher entre leur application professionnelle et Pocket Outlook toutes les 10 minutes.

Le but de cette première partie est donc de mettre en place un code qui va scruter le nombre de mail présent sur le serveur et avertir l'utilisateur. Le code sera présent dans un bouton, pas de timer ou de code dans l'initialisation d'une fenêtre pour ne pas impacter les performances de l'appareil.

Actuellement notre bouton va juste changer de libellé pour donner le nombre de message présent sur le serveur. Deux champs libellés informeront l'utilisateur des étapes en cours.

 
Sélectionnez

User, Password, Pop, Smtp sont des chaînes
NomUser est une chaîne
nombremessage est un entier
//Attribution des variables en dur pour l'exemple
User = "vous@domaine.xxx"
Password = "motdepasse"
Pop = "pop.fournisseur.xxx"
Smtp = "smtp.fournisseur.xxx"
//Premier champs libellé informant l'utilisateur
Lproc..Libellé = "Ouverture de la session mail"
//Ouverture de la session mail
SI EmailOuvreSession(User, Password, Pop, Smtp)= Vrai ALORS
	NomUser = User
SINON
	NomUser = ""
	Erreur("Impossible d'établir la connexion")
FIN
//Deuxième champs libellé avertissant l'utilisateur
LDétail..Libellé = "Recherche de nouveaux messages"
//Check du nombre de mail présent sur le serveur
nombremessage = EmailNbMessage(User)
//Changement du nom du bouton de "Mail" à "Mail - X nouveaux"
BMail..Libellé = "Mail - " + nombremessage + " nouveaux"
//On informe à nouveau l'utilisateur
Lproc..Libellé = "Fermeture de la session mail"
LDétail..Libellé = ""
//Fermeture de la session mail
EmailFermeSession(User)

Nous sommes maintenant capables d'afficher le nombre de mail présent sur le serveur distant. Le pré requis pour est évidemment qu'une connexion internet, Edge, 3G, GPRS soit active lors de l'exécution du code.

Le plus simple est fait, il s'agit maintenant de récupérer les mails à lire, de les stocker afin de pouvoir les supprimer du serveur, gérer les éventuelles pièces jointes et enfin procéder à l'envoi de mail pour faire un tour complet des possibilités.

II. Récupérer les mails

Après avoir vu comment interroger le serveur sur le nombre de mail en attente, il est temps pour nous de récupérer et de présenter les mails.

Pour ce faire nous allons créer une fenêtre et tenter d'organiser tout cela au mieux. Assez difficile vu la taille des écrans des pda. Nous allons nous inspirer de l'interface mail livrée avec Windows et l'adapter à nos besoins.

Le but est d'utiliser les fonctions d'ouverture de session mail de WinDev afin de pouvoir gérer plusieurs utilisateurs sans devoir tous les créer à la main dans Pocket Outlook. Dans le cas d'un déploiement via un patch applicatif, cela permet de ne pas avoir à créer un .reg pour chaque utilisateur.

En plus de notre fenêtre d'interface mail, nous ajouterons une ou deux tables à l'analyse.

La première contiendra la liste des utilisateurs avec leurs infos de mail et un champs qui fera la jonction avec la table d'identification du programme (pour cet exemple). Ainsi, une fois l'utilisateur authentifié dans l'application, ce dernier recevra ses mails sans le besoin d'autres informations. Si l'appareil mobile change de main, le reparamétrage de l'appareil ne sera donc pas nécessaire.

La seconde table (facultative) permettra la sauvegarde des mails en local. Elle est facultative (brièvement décrite ici car non utilisée) car dès lors de son utilisation, les mails se retrouveraient en exclusivité sur un seul appareil mobile et notre gestion par table des utilisateurs serait inutile.

Entrons dans le vif du sujet, le code :

Pour les raisons de place évoquées ci-dessus, nous allons tout de même utiliser une seule et même fenêtre pour piloter tout ça. Cette fenêtre sera pilotée par un champ combo pré-rempli avec trois options : Réception, Envoi et Quitter.

A chaque changement d'état du combo, un code sous forme de procédure locale s'exécutera et la gestion d'affichage de champs utiles sera exécutée. Nous allons voir ici les procédures d'envoi et de réception de mail ainsi que la manière d'afficher ces derniers. Il existe certainement plusieurs autres manières d'arriver à ce but.

II-A. Réception des mails

 
Sélectionnez

NomUser, Destinataire, Sujet, Texte est une chaîne
nombremessage, i est un entier
// Gestion de la Combo box, ici l'option 1 correspond à la réception de mail
Cchoix = 1
indice = Cchoix
SI indice = 1 ALORS
	//initialisation de la fenêtre version réception //Groupe1_Recept et Groupe2_Envoi sont un groupe de champs
	Groupe1_Recept..Visible = Vrai
	LCorps..Visible = Faux
	Groupe2_Envoi..Visible = Faux
	FenRepeint(Fmail)
	//Test
	User = "user@xxx.xx"
	Password = "xxxxxxx"
	Pop = "pop.xxx.xx"
	Smtp = "smtp.xxx.x"
	//Ouverture de session mail
	SI EmailOuvreSession(User, Password, Pop, Smtp)= Vrai ALORS
		NomUser = User
	SINON
		NomUser = ""
		Erreur("Impossible d'établir la connexion")
	FIN
	//Check du nombre de mail présent sur le serveur et Ajout dans une table des informations des mailsprésents sur le serveur : Expéditeur, Objet, Corps en texte brut, i ; l'identifiant du message
	nombremessage = EmailNbMessage(User)
	POUR i = 1 A nombremessage
		EmailLitMessage(User,i)
		SI Email.EnDehors <> Vrai ALORS
			TableAjouteLigne(TMail,Email.Expéditeur,Email.Sujet,Email.TexteBrut,i)
		SINON
		FIN
	FIN
FIN

II-B. Affichage des mails

Nous allons utiliser le champ ActiveX afin de pouvoir afficher les mails au format HTML et un champ de saisie en consultation simple pour les mails en texte brut.

 
Sélectionnez

maligne est un entier
maligne = TableSelect(TMail)
hFic est un entier
hauteur est un entier
Repert_Temp est une chaîne = «c:\SDMMC Disk\temp\»
CID est une chaîne
I est un entier
EmailLitMessage(User,TMail.Id[maligne])
//test si le mail contient du HTML
SI Email.HTML <> «« ALORS
	ActiveX1..Visible = Vrai
	LCorps..Visible = Faux
	// Pour chaque fichier attaché
	POUR I =1 A Email.NbAttache
		// Copier le fichier dans un répertoire temporaire
		EmailSauveFichierAttaché(Email.Attache[I],Repert_Temp+Email.Attache[I])
		// Récupérer l'identifiant du fichier attaché dans le mail
		CID =«cid:» + Email.IdentifiantAttache[I]
		// Remplacer les références au fichier attaché par le nom réel du fichier
		Email.HTML =Remplace(Email.HTML, CID, «file:» + Repert_Temp + Email.Attache[I])
	FIN
	// Afficher le contenu HTML dans un Browser WEB
	// Créer un fichier temporaire contenant le HTML
	NomFic est une chaîne =Repert_Temp+ «temp.htm»
	hFic = fCrée(NomFic)
	hFic = fOuvre(NomFic)
	fEcrit(hFic, Email.HTML, Taille(Email.HTML))
	fFerme(hFic)
	// Fournir le fichier HTML temporaire au browser
	// navigateur_WEB est un champ ActiveX «Microsoft Web Browser»
	ActiveX1>>Navigate(NomFic)
SINON
	ActiveX1..Visible = Faux
	LCorps..Visible = Vrai
	fSauveTexte(Repert_Temp + «temp.txt»,Email.Message)
	LCorps = fChargeTexte(Repert_Temp + «temp.txt»)
FIN

II-C. Récupération des mails selon la date de réception

Note : Pas de véritable moyen trouvé pour tester si le message a été lu ou non directement côté serveur, nous allons donc trier les mails et définir leur récupération en fonction de la date de réception.

Dans un premier temps, nous allons interroger le serveur sur le nombre de mail présent afin de pouvoir définir un "Pour x = 1 à Nombre de messages présents". Dans ce traitement, nous allons récupérer la date de réception de chaque message et la comparer à la date du jour. Dans cet exemple la base de comparaison est le mois en cours. Nous devrons donc formater la date de réception afin de la rendre utilisable, la date renvoyée par le serveur étant de type : "TUE, 5 Feb 2008?.

Voici le code commenté :

 
Sélectionnez

//Verification de la date du jour
dateverif = DateVersChaîne(DateDuJour())
dateverif = Milieu(dateverif,4,2)
//Check du nombre de mail présent sur le serveur
nombremessage = EmailNbMessage(User)
//boucle traitement des mail presents sur le serveur
POUR i = 1 A nombremessage
	//lecture des entetes
	EmailLitEntêtePremier(User)
	//Recuperation de la date de réception et formatage dans une date exploitable
	date = Email.DateRéception
	date = Milieu(date,5,12)
	date = SansEspace(date)
	date = Remplace(date," ","")
	SI Taille(date) <> 9 ALORS
		date = "0?+date
	FIN
	datefinal = Gauche(date,2) + "/" + Milieu(date,3,3) + "/" + Droite(date,4)
	date = datefinal
	//Appel de la procedure dateremplace() qui va transformer les abréviations de mois en chiffes
	dateremplace()
	//passage de la date formatée vers une variable date
	dateformatee = ChaîneVersDate(date)
	date = DateVersChaîne(dateformatee)
	date = Milieu(date,4,2)
	//info(date,dateverif)
	//test sur le mois, si le mois de réception égale le mois en cours on récupère le message
	SI date = dateverif ALORS
		EmailLitMessage(User,i)
		SI Email.EnDehors <> Vrai ALORS
			TableAjouteLigne(TMail,Email.Expéditeur,Email.Sujet,Email.TexteBrut,i)
		SINON
		FIN
	SINON
	FIN
FIN

Dans ce code nous faisons appel à une procédure DateRemplace() dont voici le détail :

 
Sélectionnez

PROCEDURE dateremplace()
date = Remplace(date,"jan","01",SansCasse)
date = Remplace(date,"feb","02",SansCasse)
date = Remplace(date,"mar","03",SansCasse)
date = Remplace(date,"apr","04",SansCasse)
date = Remplace(date,"may","05",SansCasse)
date = Remplace(date,"jun","06",SansCasse)
date = Remplace(date,"jul","07",SansCasse)
date = Remplace(date,"aug","08",SansCasse)
date = Remplace(date,"sep","09",SansCasse)
date = Remplace(date,"oct","10",SansCasse)
date = Remplace(date,"nov","11",SansCasse)
date = Remplace(date,"dec","12",SansCasse)

Ce code est bien sûr à adapter à vos besoins.

II-D. Suppression des mails sur le serveur

La suppression des mails sur le serveur s'effectue à partir d'une unique commande.

 
Sélectionnez
EmailSupprimeMessage(Utilisateur, numéro du message)

Le paramètre numéro du message est optionnel, s'il n'est pas indiqué le dernier message lu sera supprimé.

Si vous afficher les mails récupérés dans une table, il suffira de récupérer l'id du mail et de le placer dans celle-ci dans une colonne cachée par exemple. Cela permet de laisser à l'utilisateur le choix de conserver ou de supprimer le message qu'il lit du serveur. Cela donnerait un bouron "Suppression du Message" contenant un code de ce type :

 
Sélectionnez

ide,mailid est un entier
ide = TableSelect(TMail)
mailid = Tmail.mailid[ide]
EmailSupprimeMessage(User,mailid)
TableSupprime(TMail,ide)
FenRepeint(Fmail)	

Dans ce cas précis cependant, le passage du paramètre n'est pas obligatoire non plus puisque le bouton de suppression du message doit supprimer le dernier mail lu. Ce paramètre est bien plus utile dans le cas de programmation de batch de suppression en grand nombre de mail.

II-E. Et les pièces jointes ?

Il est possible de connaître les détails des pièces jointes d'un message en lisant la structure de l'email avec les commandes suivantes :

  • Email.Attache pour connaître le nom des fichiers attachés, utile pour bloquer la sauvegarde de certaines extensions
  • Email.IdentifiantAttache pour connaître les "id" des pièces jointes
  • Email.NbAttache pour connaître le nombre de fichiers attachés

Après quoi vous pourrez sauvegarder ces pièces jointes sur disque :

  • EmailSauveFichierAttaché(Nom du fichier attaché, chemin+nom du fichier sauvegardé)

Le nom du fichier attaché est récupéré avec Email.Attache. Le deuxième paramètre est le chemin complet du répertoire de sauvegarde des pièces jointes complété par le nom que vous souhaitez donné au fichier sauvegardé.

Il est préférable d'insérer ce traitement dans une boucle de type "Pour x = 1 à Email.NbAttache" afin d'être certain de sauvegarder la pièce désirée.

III. L'envoi de mail

Recevoir des mails et parvenir à les traiter, filtrer, présenter, supprimer c'est bien mais pouvoir en envoyer c'est utile aussi.

Présentation des champs utilisés pour une meilleure compréhension du code qui va suivre :

  • L_destinataire est une liste d'adresse mail authorisée
  • S_Sujet est un champ de saisie de l'objet du message
  • S_Message est un champ de saisie du corps du message

Les variables utilisées sont soit décrites dans le code soit déjà utilisées dans les précédents tutoriaux, voici le code :

 
Sélectionnez

i est un entier
variabledestinataire est une chaîne
// Envoi d'un e-mail par le protocole SMTP
SI EmailOuvreSessionSMTP(User,Password, Smtp) = Vrai ALORS
	// Procédure permettant d'initialiser la structure e-mail
	SI L_Destinataire..Occurrence = 0 ALORS
		Erreur("Vous n'avez pas sélectionné de destinataires")
		RepriseSaisie(S_Sujet)
	SINON SI S_Sujet = "" ALORS
		RepriseSaisie(S_Sujet)
		Erreur("Vous n'avez pas précisé l'objet du message")
	SINON SI S_Message = "" ALORS
		Erreur("Vous n'avez pas spécifié de message")
		RepriseSaisie(S_Message)
	SINON
		SI L_Destinataire..Occurrence = 1 ALORS
			variabledestinataire = L_Destinataire[1]
		SINON
			//Insertion de tous les destinataires séparés par un point virgule
			POUR i = 1 A L_Destinataire..Occurrence
				ListeSelect(L_Destinataire,i)
				variabledestinataire = variabledestinataire + L_Destinataire[i] + ","
			FIN
		FIN
		Email.Destinataire = variabledestinataire
		Email.Expéditeur = User
		Email.Sujet = S_Sujet
		Email.Message = S_Message
		Email.NbDestinataire = L_Destinataire..Occurrence
		// Envoie le mail
		SI EmailEnvoieMessage(User) = Faux ALORS
			Erreur("EmMailEnvoieMessage a échoué '" +ErreurInfo(errMessage) + "'")
		SINON
			Info("EmMailEnvoieMessage a réussi")
		FIN
	FIN
FIN

IV. Et après ?

Ce tutoriel n'est pas exhaustif, vous aurez peut-être envie de gérer les priorités des mails, d'insérer plus de filtres, d'optimiser les traitements ou les aborder différemment.

Pour rappel, le but de ce tutoriel est de pouvoir gérer ses mails tout en les laissant sur votre serveur mail. Initialement, cette solution a été étudiée afin d'intégrer une application mail légère, multi-utilisateurs, sans toucher au registre sur des pda. Ces tutoriaux peuvent servir également dans le cas d'un développement sur pc à la manière d'un Gmail Notifier par exemple.