|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
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()
config est un tableau associatif de chaînes = LoadConfig()
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"]
MaSession est emailSessionOutlook MaSession..Nom = "Outlook" EmailOuvreSession(MaSession)
OutlookFolder est une chaîne = EMAIL_NAME + "\" + EMAIL_FOLDER + "\" + EMAIL_SUBFOLDER + "\" + EMAIL_SUBFOLDER_ACRONIS EmailChangeDossier(MaSession, OutlookFolder)
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
SI xlsFeuilleEnCours(xlsConfigDoc, 3) = Faux ALORS Info("Impossible de trouver la feuille 'Acronis' dans le fichier de configuration.") xlsFerme(xlsConfigDoc) RETOUR FIN
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)
xlsResultDoc est un xlsDocument(xlsVersionXlsx)
startDate est Date = DateSys() startDate.Jour -= 30 endDate est Date = DateSys()
dDate est Date = startDate
TANTQUE dDate <= endDate
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"
dictStatuts est un tableau associatif de chaînes AvecDoublon
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
sBody est une chaîne = emailCourant.Message sBodySansURL est une chaîne = Remplace(sBody, "http://", "")
POUR TOUT appareil de appareilList SI Position(sBodySansURL, appareil) > 0 ALORS
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
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
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
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)
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 |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|