def VerifieFusion(self, texteHTML="", listeDestinataires=[]): """ Vérifie que tous les mots-clés ont été remplacés """ listeResultats = [] for track in listeDestinataires: dictChamps = track.champs # Remplacement des champs pour la fusion texte = copy.deepcopy(texteHTML) for motcle, valeur in CTRL_Editeur_email.GetChampsStandards( ).items(): texte = texte.replace(motcle, valeur) for motcle, valeur in dictChamps.items(): try: if valeur == None: valeur = u"" if type(valeur) == int: valeur = str(valeur) texte = texte.replace(motcle, valeur) except: pass # Vérifie si champs non remplacés x = r"\{[A-Za-z0-9_]*?\}" regex = re.compile(x) listeAnomalies = regex.findall(texte) if len(listeAnomalies) > 0: listeResultats.append((track.adresse, listeAnomalies)) # Affichage des résultats if len(listeResultats) > 0: message = _( u"Certains mots-clés semblent ne pas avoir été remplacés lors de la fusion des données. Est-ce normal ?\n\n" ) affichageMax = 10 for adresse, listeAnomalies in listeResultats[:affichageMax]: message += u" - %s : %s.\n" % (adresse, ", ".join(listeAnomalies)) if len(listeResultats) > affichageMax: message += _(u" - Ainsi que %d autres...\n") % ( len(listeResultats) - affichageMax) message += _(u"\nSouhaitez-vous tout de même continuer l'envoi ?") dlgErreur = wx.MessageDialog( self, message, _(u"Anomalies"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION) if dlgErreur.ShowModal() == wx.ID_YES: return True else: return False else: return True
def MAJ_apercu(self): index = self.ctrl_adresse.GetSelection() if index == -1 : return xml = self.texte_xml if xml == None : return # Remplacement des champs standards for motcle, valeur in CTRL_Editeur_email.GetChampsStandards().iteritems() : xml = xml.replace(motcle, valeur) # Remplacement des champs spécifiques dictDonnee = self.donnees[index] for motcle, valeur in dictDonnee["champs"].iteritems() : if valeur == None or valeur == "//None" : valeur = "" xml = xml.replace(motcle, valeur) # MAJ éditeur self.ctrl_editeur.SetXML(xml)
def MAJ_apercu(self): index = self.ctrl_adresse.GetSelection() if index == -1: return xml = self.texte_xml if xml == None: return # Remplacement des champs standards for motcle, valeur in CTRL_Editeur_email.GetChampsStandards().items(): xml = xml.replace(motcle.encode("iso-8859-15"), valeur.encode("iso-8859-15")) # Remplacement des champs spécifiques dictDonnee = self.donnees[index] for motcle, valeur in dictDonnee["champs"].items(): if valeur == None or valeur == "//None": valeur = "" if type(valeur) == int: valeur = str(valeur) if type(valeur) == datetime.date: valeur = UTILS_Dates.DateDDEnFr(valeur) xml = xml.replace(motcle, valeur) # MAJ éditeur self.ctrl_editeur.SetXML(xml)
def Envoyer(self, listeDestinataires=[], adresseTest=None): # Expéditeur dictExp = self.ctrl_exp.GetDonnees() if dictExp == None: dlg = wx.MessageDialog( self, _(u"Vous n'avez sélectionné aucune adresse d'expéditeur !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False: self.ShowModal() return # Accusé de réception accuseReception = self.check_accuseReception.GetValue() # Objet sujet = self.ctrl_objet.GetValue() if len(sujet) == 0: dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement saisir un objet pour ce message !" ), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False: self.ShowModal() self.ctrl_objet.SetFocus() return # Destinataires if len(listeDestinataires) == 0: dlg = wx.MessageDialog( self, _(u"Vous devez sélectionner au moins un destinataire !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False: self.ShowModal() return nbreAnomalies = 0 for dest in listeDestinataires: if dest.adresse == None: nbreAnomalies += 1 if nbreAnomalies > 0: dlg = wx.MessageDialog( self, _(u"%d adresse(s) Email ne sont pas renseignées !") % nbreAnomalies, _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return # Texte if len(self.ctrl_editeur.GetValue()) == 0: dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement saisir un texte !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False: self.ShowModal() self.ctrl_editeur.SetFocus() return texteHTML, listeImages, handler = self.ctrl_editeur.GetHTML( imagesIncluses=True) # Vérifie la fusion des mots-clés if self.VerifieFusion(texteHTML, listeDestinataires) == False: if self.IsShown() == False: self.ShowModal() return # Pièces jointes listePiecesCommunes = self.ctrl_pieces.GetDonnees() # Demande de confirmation if adresseTest == None and self.afficher_confirmation_envoi == True: dlg = wx.MessageDialog( self, _(u"Confirmez-vous l'envoi de ce message pour %d destinataires ?\n\nAttention, l'envoi peut prendre quelques minutes..." ) % len(listeDestinataires), _(u"Confirmation"), wx.YES_NO | wx.YES_DEFAULT | wx.CANCEL | wx.ICON_QUESTION) if dlg.ShowModal() != wx.ID_YES: dlg.Destroy() if self.IsShown() == False: self.ShowModal() return dlg.Destroy() # Préparation des messages liste_messages = [] for track in listeDestinataires: adresse = track.adresse if adresseTest != None: adresse = adresseTest listePiecesPersonnelles = track.pieces dictChamps = track.champs # Pièces Personnelles + communes listePieces = listePiecesPersonnelles listePieces.extend(listePiecesCommunes) # Traitement des champs pour la fusion texte = copy.deepcopy(texteHTML) for motcle, valeur in CTRL_Editeur_email.GetChampsStandards( ).items(): texte = texte.replace(motcle, valeur) for motcle, valeur in dictChamps.items(): if valeur == None: valeur = u"" if type(valeur) == int: valeur = str(valeur) if type(valeur) == bool: valeur = str(valeur) if type(valeur) == datetime.date: valeur = UTILS_Dates.DateDDEnFr(valeur) texte = texte.replace(motcle, valeur) # Mémorisation du message message = UTILS_Envoi_email.Message( destinataires=[ adresse, ], sujet=sujet, texte_html=texte, fichiers=listePieces, images=listeImages, champs=dictChamps, ) liste_messages.append(message) # Connexion messagerie dlg_progress = wx.ProgressDialog( _(u"Envoi des mails"), _(u"Connexion au serveur de messagerie..."), maximum=len(liste_messages) + 1, parent=None) dlg_progress.SetSize((450, 140)) dlg_progress.CenterOnScreen() try: messagerie = UTILS_Envoi_email.Messagerie( backend=dictExp["moteur"], hote=dictExp["smtp"], port=dictExp["port"], utilisateur=dictExp["utilisateur"], motdepasse=dictExp["motdepasse"], email_exp=dictExp["adresse"], nom_exp=dictExp["nom_adresse"], timeout=20, use_tls=dictExp["startTLS"], parametres=dictExp["parametres"]) messagerie.Connecter() except Exception as err: dlg_progress.Destroy() err = str(err) intro = _( u"La connexion au serveur de messagerie est impossible :") conclusion = _( u"Vérifiez votre connexion internet ou les paramètres de votre adresse d'expédition." ) dlgErreur = DLG_Messagebox.Dialog(self, titre=_(u"Erreur"), introduction=intro, detail=err, conclusion=conclusion, icone=wx.ICON_ERROR, boutons=[ _(u"Ok"), ]) dlgErreur.ShowModal() dlgErreur.Destroy() return False # Envoi des messages self.listeSucces = messagerie.Envoyer_lot( messages=liste_messages, dlg_progress=dlg_progress, afficher_confirmation_envoi=self.afficher_confirmation_envoi) # Fermeture messagerie try: messagerie.Fermer() except: pass # Fermeture dlg_progress si besoin if dlg_progress != None: try: dlg_progress.Destroy() except: pass # Suppression des images temporaires incluses dans le message handler.DeleteTemporaryImages() # Mémorisation dans l'historique if self.listeSucces != False: for message in self.listeSucces: self.MemorisationHistorique(message.GetLabelDestinataires(), message.sujet)
def Envoyer(self, listeDestinataires=[], adresseTest=None): # Expéditeur dictExp = self.ctrl_exp.GetDonnees() if dictExp == None : dlg = wx.MessageDialog(self, _(u"Vous n'avez sélectionné aucune adresse d'expéditeur !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False : self.ShowModal() return exp = dictExp["adresse"] nomexp = dictExp["nom_adresse"] serveur = dictExp["smtp"] port = dictExp["port"] connexionAuthentifiee = dictExp["auth"] connexionStartTLS = dictExp["startTLS"] motdepasse = dictExp["motdepasse"] utilisateur = dictExp["utilisateur"] # Accusé de réception accuseReception = self.check_accuseReception.GetValue() # Objet sujet = self.ctrl_objet.GetValue() if len(sujet) == 0 : dlg = wx.MessageDialog(self, _(u"Vous devez obligatoirement saisir un objet pour ce message !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False : self.ShowModal() self.ctrl_objet.SetFocus() return # Destinataires if len(listeDestinataires) == 0 : dlg = wx.MessageDialog(self, _(u"Vous devez sélectionner au moins un destinataire !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False : self.ShowModal() return nbreAnomalies = 0 for dest in listeDestinataires : if dest.adresse == None : nbreAnomalies += 1 if nbreAnomalies > 0 : dlg = wx.MessageDialog(self, _(u"%d adresse(s) Email ne sont pas renseignées !") % nbreAnomalies, _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return # Texte if len(self.ctrl_editeur.GetValue()) == 0 : dlg = wx.MessageDialog(self, _(u"Vous devez obligatoirement saisir un texte !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False : self.ShowModal() self.ctrl_editeur.SetFocus() return texteHTML, listeImages, handler = self.ctrl_editeur.GetHTML(imagesIncluses=True) # Vérifie la fusion des mots-clés if self.VerifieFusion(texteHTML, listeDestinataires) == False : if self.IsShown() == False : self.ShowModal() return # Pièces jointes listePiecesCommunes = self.ctrl_pieces.GetDonnees() # Demande de confirmation if adresseTest == None and self.afficher_confirmation_envoi == True : dlg = wx.MessageDialog(self, _(u"Confirmez-vous l'envoi de ce message pour %d destinataires ?\n\nAttention, l'envoi peut prendre quelques minutes...") % len(listeDestinataires), _(u"Confirmation"), wx.YES_NO|wx.YES_DEFAULT|wx.CANCEL|wx.ICON_QUESTION) if dlg.ShowModal() != wx.ID_YES : dlg.Destroy() if self.IsShown() == False : self.ShowModal() return dlg.Destroy() # Envoi des mails dlg = wx.ProgressDialog(_(u"Envoi des mails"), _(u"Veuillez patienter..."), maximum = len(listeDestinataires)+1, parent=self) dlg.SetSize((370, 140)) dlg.CenterOnScreen() index = 1 self.listeAnomalies = [] self.listeSucces = [] for track in listeDestinataires : adresse = track.adresse if adresseTest != None : adresse = adresseTest ## adresse = FonctionsPerso.Supprime_accent2(adresse) listePiecesPersonnelles = track.pieces dictChamps = track.champs # Pièces Personnelles + communes listePieces = listePiecesPersonnelles listePieces.extend(listePiecesCommunes) # Traitement des champs pour la fusion texte = copy.deepcopy(texteHTML) for motcle, valeur in CTRL_Editeur_email.GetChampsStandards().iteritems() : texte = texte.replace(motcle, valeur) for motcle, valeur in dictChamps.iteritems() : if valeur == None : valeur = u"" if type(valeur) == int : valeur = str(valeur) if type(valeur) == bool : valeur = str(valeur) if type(valeur) == datetime.date : valeur = UTILS_Dates.DateDDEnFr(valeur) texte = texte.replace(motcle, valeur) # Envoi du mail try : labelAdresse = adresse.decode("iso-8859-15") except : labelAdresse = adresse label = _(u"Envoi %d/%d : %s...") % (index, len(listeDestinataires), labelAdresse) self.EcritStatusBar(label) dlg.Update(index, label) try : etat = UTILS_Envoi_email.Envoi_mail( adresseExpediteur=exp, nomadresseExpediteur=nomexp, listeDestinataires=[adresse,], listeDestinatairesCCI=[], sujetMail=sujet, texteMail=texte, listeFichiersJoints=listePieces, serveur=serveur, port=port, avecAuthentification=connexionAuthentifiee, avecStartTLS=connexionStartTLS, listeImages=listeImages, motdepasse=motdepasse, accuseReception=accuseReception, utilisateur=utilisateur, ) self.listeSucces.append(track) # Mémorisation dans l'historique self.MemorisationHistorique(adresse, sujet) except Exception, err: err = str(err).decode("iso-8859-15") self.listeAnomalies.append((track, err)) print ("Erreur dans l'envoi d'un mail : %s...", err) traceback.print_exc(file=sys.stdout) if index == len(listeDestinataires) : dlgErreur = wx.MessageDialog(self, _(u"%s\n\nL'erreur suivante a été détectée :\n%s.") % (label, err), _(u"Erreur"), wx.OK | wx.ICON_ERROR) dlgErreur.ShowModal() dlgErreur.Destroy() else : dlgErreur = wx.MessageDialog(self, _(u"%s\n\nL'erreur suivante a été détectée :\n%s.\n\nSouhaitez-vous quand même continuer le processus ?") % (label, err), _(u"Erreur"), wx.YES_NO|wx.YES_DEFAULT|wx.CANCEL|wx.ICON_ERROR) if dlgErreur.ShowModal() != wx.ID_YES : dlgErreur.Destroy() # Arrêt du processus dlg.Destroy() handler.DeleteTemporaryImages() self.EcritStatusBar(u"") return dlgErreur.Destroy() if len(listeDestinataires) > 1 : time.sleep(2) # Attente entre chaque envoi... index += 1