PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Restreindre sélection email
Restreindre sélection email
Débuté par Morpheuus, 21 jan. 2025 11:20 - 2 réponses
Posté le 21 janvier 2025 - 11:20
Bonjour, j'ai un code qui me permet de lire des mails et de faire un fichier excel avec des infos. J'avais déjà fais ce code en VBA, mais on m'a demandé de le refaire en WinDev, et j'ai un petit problème qui ralenti un peu le processus. En VBA, quand je parcourt les mails, je peux faire en sorte d'utiliser une fonction de base "Restrict" qui va restreindre les mails seulement à mon filtre, donc la il va juste check les mails sur 1 mois :

Set olItems = olFolder.Items
        olItems.Sort "[ReceivedTime]", True
        Dim filter As String
        filter = "[ReceivedTime] >= '" & Format(currentDate - 1, "dd/MM/yyyy") & " 18:00' AND [ReceivedTime] <= '" & Format(currentDate, "dd/MM/yyyy") & " 17:59'"
        Set olFilteredItems = olItems.Restrict(filter)


Mais en Windev, je n'ai rien trouvé de telle, donc je récupère TOUS les mails du dossier qui m'intéresse que je stocke dans un tableau "tabEmails" et je regarde à l'intérieur ceux qui m'intéressent (les mails sur 1 mois en l'occurence) mais si mon dossier contient beaucoup de mails, ça va prendre énormément de temps, y'a t'il un moyen de régler cela ?

Procedure CheckAcronisStatus()

// Chargement de la configuration
config est un tableau associatif de chaînes = LoadConfig()

// Récupération des paramètres depuis la configuration
SAVE_HTML_FOLDER est une chaîne = config["SAVE_HTML_FOLDER"]
EMAIL_NAME est une chaîne = config["EMAIL_NAME"]
EMAIL_FOLDER est une chaîne = config["EMAIL_FOLDER"]
EMAIL_SUBFOLDER est une chaîne = config["EMAIL_SUBFOLDER"]
EMAIL_SUBFOLDER_ACRONIS est une chaîne = config["EMAIL_SUBFOLDER_ACRONIS"]

// Ouverture de la session Outlook
MaSession est emailSessionOutlook
MaSession..Nom = "Outlook"
EmailOuvreSession(MaSession)

// Accès au dossier Acronis
OutlookFolder est une chaîne = EMAIL_NAME + "\" + EMAIL_FOLDER + "\" + EMAIL_SUBFOLDER + "\" + EMAIL_SUBFOLDER_ACRONIS
EmailChangeDossier(MaSession, OutlookFolder)

// Chargement des noms d'appareils depuis le fichier de configuration
sUserProfile est une chaîne = SysEnvironment("USERPROFILE")
SI Position(sUserProfile, "=") > 0 ALORS
sUserProfile = ExtraitChaîne(sUserProfile, 2, "=")
FIN

sConfigPath est une chaîne = SAVE_HTML_FOLDER + "config.xlsx"

xlsConfigDoc est xlsDocument
xlsConfigDoc = xlsOuvre(sConfigPath, xlsEcriture)
SI ErreurDétectée ALORS
Info("Erreur lors de l'ouverture du fichier de configuration : " + sConfigPath + RC + ErreurInfo(errComplet))
RETOUR
FIN

// Sélection de la feuille Acronis
SI xlsFeuilleEnCours(xlsConfigDoc, 3) = Faux ALORS
Info("Impossible de trouver la feuille 'Acronis' dans le fichier de configuration.")
xlsFerme(xlsConfigDoc)
RETOUR
FIN

// Récupération des noms d'appareils
nLastRow est entier = xlsNbLigne(xlsConfigDoc)
appareilList est une tableau de chaîne = []

POUR i = 2 _À_ nLastRow
SI xlsConfigDoc[i, 1] <> "" ALORS
Ajoute(appareilList, xlsConfigDoc[i, 1])
FIN
FIN

xlsFerme(xlsConfigDoc)

// Création d'un document Excel vierge pour le résultat
xlsResultDoc est un xlsDocument(xlsVersionXlsx)

// Définition de la plage de dates
startDate est Date = DateSys()
startDate.Jour -= 30
endDate est Date = DateSys()

dDate est Date = startDate

TANTQUE dDate <= endDate

// Ajout d'une nouvelle feuille pour la date actuelle
xlsAjouteFeuille(xlsResultDoc, DateVersChaîne(dDate, "JJ_MM_AAAA"))
SI xlsFeuilleEnCours(xlsResultDoc, xlsNbFeuille(xlsResultDoc)) = Faux ALORS
Info("Erreur interne : impossible de sélectionner la feuille ajoutée.")
RETOUR
FIN

xlsResultDoc[1, 1] = DateVersChaîne(dDate, "JJ/MM/AAAA")
xlsResultDoc[2, 1] = "Acronis"
xlsResultDoc[2, 2] = "Statut"

// Création d'un "dictionnaire" pour stocker les statuts des appareils
dictStatuts est un tableau associatif de chaînes AvecDoublon

// Récupération des emails pour la plage horaire (18h hier à 17h59 aujourd'hui)
dFilterStart est DateHeure = dDate
dFilterStart.Jour -= 1
dFilterStart.Heure = 18
dFilterStart.Minute = 0
dFilterStart.Seconde = 0

dFilterEnd est DateHeure = dDate
dFilterEnd.Heure = 17
dFilterEnd.Minute = 59
dFilterEnd.Seconde = 0

tabEmails est un tableau de Email = EmailRécupèreTout(MaSession, ertComplet)

POUR TOUT emailCourant de tabEmails
SI emailCourant.DateRéception >= dFilterStart ET emailCourant.DateRéception <= dFilterEnd ALORS

// Suppression des URLs dans le corps du mail
sBody est une chaîne = emailCourant.Message
sBodySansURL est une chaîne = Remplace(sBody, "http://", "")

// Vérification des noms d'appareils dans le mail
POUR TOUT appareil de appareilList
SI Position(sBodySansURL, appareil) > 0 ALORS

// Détermination du statut basé sur le contenu du message
sStatutActuel est une chaîne = "Non Validé"
SI Position(sBodySansURL, "Sauvegarde réussie") > 0 ALORS
sStatutActuel = "Validé"
SINON SI Position(sBodySansURL, "Activité réussie avec avertissements") > 0 ALORS
sStatutActuel = "Validé avec avertissements"
FIN

// Mise à jour du dictionnaire des statuts
SI dictStatuts[appareil]..Existe ALORS
sStatutExistant est une chaîne = dictStatuts[appareil]
SI sStatutExistant <> "Validé" ET (sStatutActuel = "Validé" OU (sStatutExistant = "Non Validé" ET sStatutActuel = "Validé avec avertissements")) ALORS
dictStatuts[appareil] = sStatutActuel
FIN
SINON
dictStatuts[appareil] = sStatutActuel
FIN
FIN
FIN
FIN
FIN

// Écriture des statuts dans la feuille Excel
ligne est entier = 3
POUR TOUT ÉLÉMENT sStatut, sAppareil de dictStatuts
xlsResultDoc[ligne, 1] = sAppareil
xlsResultDoc[ligne, 2] = sStatut
ligne += 1
FIN

dDate += 1
FIN

// Enregistrement du fichier Excel final
sResultFile est chaîne = SAVE_HTML_FOLDER + DateVersChaîne(DateSys(), "JJ_MM_AAAA") + "_checkup_Acronis.xlsx"
SI fFichierExiste(sResultFile) ALORS
fSupprime(sResultFile)
FIN
xlsSauve(xlsResultDoc, sResultFile)
xlsFerme(xlsResultDoc)

// Fermeture de la session Outlook
EmailFermeSession(MaSession)


Merci à vous ( Pour info, j'ai commencé le Windev y'a 1 semaine)
Posté le 21 janvier 2025 - 15:54
Bonjour

Je vois votre problème, vous souhaitez lister en moins de temps les messages dans un adresse e-mail, j'ai une solution pour vous

1. Vous devrez récupérer tout les messages de l'e-mail dans un tableau, je veux dire en moins de 5 ligne, ensuite vous créez une nouvelle méthode pour filtrer les dates

Pour ce cas, vous gagnez un peu de temps pour les messages par rapport à votre programme

Voilà un programme dont vous pouvez utiliser
// EDD (01/25) : créer une nouvelle classe ClEmail
ClEmail est une Classe
m_ssSession is emailSessionOutlook
m_tbEmails is tableau d'Email
FIN

// EDD (01/25) : créer deux nouvelle méthode dans la classe ClEmail
PROCÉDURE Messages()
LOCAL
ctbEmail_Information is tableau of ClEmail_Information
eEntier is entier
:m_tbEmails = EmailRécupèreTout(:m_ssSession, ertComplet)
POUR TOUT sEmail_Courant DE :m_tbEmails
eEntier = TableauAjouteLigne(ctbEmail_Information)
ctbEmail_Information[eEntier]:m_sMessage = sEmail_Courant.Message
ctbEmail_Information[eEntier]:m_dDate_Reception = sEmail_Courant.DateRéception
FIN
RENVOYER ctbEmail_Information

PROCÉDURE Filtrer()
LOCAL
ctbEmail_Information is tableau of ClEmail_Information = :Messages()
dDate_Debut, dDate_Finale is DateHeure
FOR i = 1 _TO_ TableauOccurrence(ctbEmail_Information)
IF dDate_Debut > ctbEmail_Information[i]:m_dDate_Reception AND dDate_Finale < ctbEmail_Information[i]:m_dDate_Reception THEN
// EDD (01/25) : ajouter le filtre dans un tableau pour être enregistrer dans un dossier tableur ou .xlsx
Trace(ctbEmail_Information[i]:m_sMessage)
END
END

// EDD (01/25) : créer une nouvelle classe ClEmail_Information
ClEmail_Information est une Classe
m_dDate_Reception is DateHeure
m_sMessage is string
FIN

// EDD (01/25) : ajouter ce programme dans un procédure d'une fenêtre
LOCAL
cEmail is ClEmail
cEmail:m_ssSession = " ... " // EDD (01/25) : ajouter l'information de session
cEmail:Messages()
// EDD (01/25) : enregistrement des messages dans un dossier tableur à la finalité

NB : Vous gagner un peu de seconde lorsque vous parcourer une variable tableau local que dans un message d'email

Cordialement
Mr.RATSIMANDRESY
Niry Aina Eddy
Posté le 21 janvier 2025 - 17:55
bonjour,

Vous pouvez faire un tableaucherche sur le tableau de email ou utiliser la fonction "filtre" sur votre tabEmails. afin de n'avoir que les emails correspondants à vos critères