Piloter ses mails sur PC et sur un PDA

Stéphane Bertolotti

- Titre : Piloter ses mails sur PC et sur un PDA

- Auteur : Stéphane Bertolotti

- Parution : 12 janvier 2009

- Mise à jour : 12 janvier 2009

- Licence : Copyright ® 2009 Stéphane Bertolotti. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Lister le nombre de mails à lire

- II. Récupérer les mails

- II-A. Réception des mails

- II-B. Affichage des mails

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

- II-D. Suppression des mails sur le serveur

- II-E. Et les pièces jointes ?

- III. L'envoi de mail

- IV. Et après ?

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 mails présents 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 messages présents sur le serveur. Deux champs libellés informeront l'utilisateur des étapes en cours.

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 champ 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 champ libellé avertissant l'utilisateur
LDétail..Libellé = "Recherche de nouveaux messages"
//Check du nombre de mails présents 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 mails présents 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 mails 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 champ 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.

À 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

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.

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 mails présents 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é :

//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 mails presents sur le serveur
POUR i = 1 A nombremessage
//lecture des entêtes
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 procédure 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 :

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.

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 :

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 donner 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 autorisé ;

- 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 tutoriels, voici le code :

i est un entier
variabledestinataire est une chaîne
// Envoi d'un email 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é '" + &#8230;
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, multiutilisateur, sans toucher au registre sur des pda. Ces tutoriels peuvent servir également dans le cas d'un développement sur pc à la manière d'un Gmail Notifier par exemple.