====== Script de Génération de template mail outlook ====== À adapter en fonction du contexte. Les templates de base doivent être au format HTML et contenir les variables sous la forme {variable}. Extensions requises : ''pywin32'' et ''requests'' import win32com.client as win32 import requests import json #URL du webhook webhook_url = 'https://webhook.test/123456' #fonction menu def menu(): print("Choisissez un template : ") print("1: Notification d'incident") print("2: Notification de fin d'incident") print("3: [client1] Notification d'incident") print("4: [client1] Notification de fin d'incident") choix = input("Entrez le numéro de votre choix : ") if choix == '1': incident_notif() elif choix == '2': fin_incident_notif() elif choix == '3': client1_incident_notif() elif choix == '4': client1_fin_incident_notif() else: print("Choix invalide, fin du programme.") #fonction notification d'incident def incident_notif(): # Demande des infos à l'utilisateur destinatairesprincipaux = input("Entrez les adresses mail des destinataires principaux (séparer les adresses avec un ;) (l'incident management est déjà inclus) : ") destinatairessecondaires = input("Entrez les adresses mail en copie (séparer les adresses avec un ;) : ") client = input("Client concerné : ") description = input("Description de l'incident : ") start_date = input("Date de début d'incident : ") start_time = input("Heure de début d'incident (UTC sinon préciser): ") duree = input("Durée de l'incident : ") equipement = input("Equipement(s) concerné(s) : ") incident_ref = input("Ticket : ") impact = input("Impact client : ") # Demander à l'utilisateur de choisir la gravité : choix_severite = input("Gravité de l'incident (1, 2 ou 3) : ") # Initialiser les cases severite1 = "[ ] 1" severite2 = "[ ] 2" severite3 = "[ ] 3" # Mettre à jour en fonction du choix if choix_severite == '1': severite1 = "[X] 1" elif choix_severite == '2': severite2 = "[X] 2" elif choix_severite == '3': severite3 = "[X] 3" else: print("Choix invalide, aucune case cochée.") statut = input("Statut actuel : ") ttr = input("Temps de réparation estimé : ") next_actions = input("Prochaines actions : ") next_update = input("Prochaine mise à jour : ") incident_owner = input("Responsable de l'incident : ") # Demande si on doit faire une notif mattermost ou non notif_equipe = input("Envoyer une notif mattermost immédiatement ? (O/N) ") if notif_equipe == 'Y' or notif_equipe == 'O' or notif_equipe == 'y' or notif_equipe == 'o': notif_mattermost(webhook_url, client, incident_ref, description, impact, statut) # Concatenne les variables sujetmail = "Security Incident Notification || " + client + " || " + incident_ref + " || " + equipement + " || " + description destinataires = "test@test.fr;" + destinatairesprincipaux destinatairescopie = "test@test.fr;" + destinatairessecondaires # Charger le template HTML depuis un fichier externe with open('template_incident_notification.html', 'r', encoding='utf-8') as file: template_html = file.read() # Insérer toutes les variables dans le body contenu_html = template_html.format( client=client, description=description, start_date=start_date, start_time=start_time, equipement=equipement, duree=duree, incident_ref=incident_ref, impact=impact, severite1=severite1, severite2=severite2, severite3=severite3, statut=statut, ttr=ttr, next_actions=next_actions, next_update=next_update, incident_owner=incident_owner ) # Créer et afficher le mail Outlook outlook = win32.Dispatch('outlook.application') mail = outlook.CreateItem(0) mail.Subject = sujetmail mail.To = destinataires mail.CC = destinatairescopie mail.HTMLBody = contenu_html mail.Display() #fonction notification de fin d'incident def fin_incident_notif(): # Demande des infos à l'utilisateur destinatairesprincipaux = input("Entrez les adresses mail des destinataires principaux (séparer les adresses avec un ;) (l'incident management est déjà inclus) : ") destinatairessecondaires = input("Entrez les adresses mail en copie (séparer les adresses avec un ;) : ") client = input("Client concerné : ") description = input("Description de l'incident : ") start_date = input("Date de début d'incident : ") start_time = input("Heure de début d'incident (UTC sinon préciser): ") duree = input("Durée de l'incident : ") equipement = input("Equipement(s) concerné(s) : ") incident_ref = input("Ticket : ") impact = input("Impact client : ") # Demander à l'utilisateur de choisir la gravité : choix_severite = input("Gravité de l'incident (1, 2 ou 3) : ") # Initialiser les cases severite1 = "[ ] 1" severite2 = "[ ] 2" severite3 = "[ ] 3" # Mettre à jour en fonction du choix if choix_severite == '1': severite1 = "[X] 1" elif choix_severite == '2': severite2 = "[X] 2" elif choix_severite == '3': severite3 = "[X] 3" else: print("Choix invalide, aucune case cochée.") statut = input("Statut actuel : ") ttr = input("Temps de réparation estimé : ") next_actions = input("Prochaines actions : ") next_update = input("Prochaine mise à jour : ") incident_owner = input("Responsable de l'incident : ") # Demande si on doit faire une notif mattermost ou non notif_equipe = input("Envoyer une notif mattermost immédiatement ? (O/N) ") if notif_equipe == 'Y' or notif_equipe == 'O' or notif_equipe == 'y' or notif_equipe == 'o': notif_fin_mattermost(webhook_url, client, incident_ref, description, impact, statut) # Concatenne les variables sujetmail = "Security Incident Closure || " + client + " || " + incident_ref + " || " + equipement + " || " + description destinataires = "test@test.fr;" + destinatairesprincipaux destinatairescopie = "test@test.fr;" + destinatairessecondaires # Charger le template HTML depuis un fichier externe with open('template_incident_closure.html', 'r', encoding='utf-8') as file: template_html = file.read() # Insérer toutes les variables dans le body contenu_html = template_html.format( client=client, description=description, start_date=start_date, start_time=start_time, equipement=equipement, duree=duree, incident_ref=incident_ref, impact=impact, severite1=severite1, severite2=severite2, severite3=severite3, statut=statut, ttr=ttr, next_actions=next_actions, next_update=next_update, incident_owner=incident_owner ) # Créer et afficher le mail Outlook outlook = win32.Dispatch('outlook.application') mail = outlook.CreateItem(0) mail.Subject = sujetmail mail.To = destinataires mail.CC = destinatairescopie mail.HTMLBody = contenu_html mail.Display() #fonction notification d'incident client1 def client1_incident_notif(): # Demande des infos à l'utilisateur destinatairessecondaires = input("Entrez les adresses mail en copie (séparer les adresses avec un ;) (gouvernance déjà en destinataires) : ") perimetre = input("Périmètre de l'incident : ") description = input("Description de l'incident : ") start_date = input("Date de début d'incident : ") start_time = input("Heure de début d'incident (UTC sinon préciser): ") equipement = input("Equipement(s) concerné(s) : ") incident_ref = input("Ticket : ") impact = input("Impact client : ") statut = input("Statut actuel : ") client = "client1" # Demande si on doit faire une notif mattermost ou non notif_equipe = input("Envoyer une notif mattermost immédiatement ? (O/N) ") if notif_equipe == 'Y' or notif_equipe == 'O' or notif_equipe == 'y' or notif_equipe == 'o': notif_mattermost_client1(webhook_url, client, perimetre, incident_ref, description, impact, statut) # Concatenne les variables sujetmail = "[" + client + "] " + incident_ref + " - " + perimetre + " - " + description destinataires = "test@test.fr;" destinatairescopie = "test@test.fr;" + destinatairessecondaires # Charger le template HTML depuis un fichier externe with open('template_incident_notification_client1.html', 'r', encoding='utf-8') as file: template_html = file.read() # Insérer toutes les variables dans le body contenu_html = template_html.format( client=client, description=description, start_date=start_date, start_time=start_time, equipement=equipement, incident_ref=incident_ref, impact=impact, statut=statut, perimetre = perimetre ) # Créer et afficher le mail Outlook outlook = win32.Dispatch('outlook.application') mail = outlook.CreateItem(0) mail.Subject = sujetmail mail.To = destinataires mail.CC = destinatairescopie mail.HTMLBody = contenu_html mail.Display() def client1_fin_incident_notif(): # Demande des infos à l'utilisateur destinatairessecondaires = input("Entrez les adresses mail en copie (séparer les adresses avec un ;) (gouvernance déjà en destinataires) : ") perimetre = input("Périmètre de l'incident : ") description = input("Description de l'incident : ") start_date = input("Date de début d'incident : ") start_time = input("Heure de début d'incident (UTC sinon préciser): ") equipement = input("Equipement(s) concerné(s) : ") incident_ref = input("Ticket : ") impact = input("Impact client : ") statut = input("Statut actuel (+rootcause) : ") client = "client1" # Demande si on doit faire une notif mattermost ou non notif_equipe = input("Envoyer une notif mattermost immédiatement ? (O/N) ") if notif_equipe == 'Y' or notif_equipe == 'O' or notif_equipe == 'y' or notif_equipe == 'o': notif_fin_mattermost_client1(webhook_url, client, perimetre, incident_ref, description, impact, statut) # Concatenne les variables sujetmail = "[" + client + "] Fin d'incident " + incident_ref + " - " + perimetre + " - " + description destinataires = "test@test.fr;" destinatairescopie = "test@test.fr;" + destinatairessecondaires # Charger le template HTML depuis un fichier externe with open('template_incident_closure_client1.html', 'r', encoding='utf-8') as file: template_html = file.read() # Insérer toutes les variables dans le body contenu_html = template_html.format( client=client, description=description, start_date=start_date, start_time=start_time, equipement=equipement, incident_ref=incident_ref, impact=impact, statut=statut, perimetre = perimetre ) # Créer et afficher le mail Outlook outlook = win32.Dispatch('outlook.application') mail = outlook.CreateItem(0) mail.Subject = sujetmail mail.To = destinataires mail.CC = destinatairescopie mail.HTMLBody = contenu_html mail.Display() #fonction d'envoi de notif de début d'incident def notif_mattermost(webhook_url, client, incident_ref, description, impact, statut): message_mattermost = "🚨 Incident critique : [" + client + "] " + incident_ref + " - " + description + " - " + impact + " - " + statut + " 🚨" # Contenu du message message = { "text": message_mattermost } # Envoyer la requête POST response = requests.post( webhook_url, data=json.dumps(message), headers={'Content-Type': 'application/json'} ) # Vérifier la réponse if response.status_code == 200: print("Message envoyé avec succès!") else: print(f"Erreur lors de l'envoi du message : {response.status_code} - {response.text}") #fonction d'envoi de notif de fin d'incident def notif_fin_mattermost(webhook_url, client, incident_ref, description, impact, statut): # URL du webhook Mattermost message_mattermost = "✅ Fin d'incident : [" + client + "] " + incident_ref + " - " + description + " - " + impact + " - " + statut + " ✅" # Contenu du message message = { "text": message_mattermost } # Envoyer la requête POST response = requests.post( webhook_url, data=json.dumps(message), headers={'Content-Type': 'application/json'} ) # Vérifier la réponse if response.status_code == 200: print("Message envoyé avec succès!") else: print(f"Erreur lors de l'envoi du message : {response.status_code} - {response.text}") #fonction d'envoi de notif de début d'incident client1 def notif_mattermost_client1(webhook_url, client, perimetre, incident_ref, description, impact, statut): message_mattermost = "🚨 Incident critique : [" + client + "] " + incident_ref + " - " + perimetre + " - " + description + " - " + impact + " - " + statut + " 🚨" # Contenu du message message = { "text": message_mattermost } # Envoyer la requête POST response = requests.post( webhook_url, data=json.dumps(message), headers={'Content-Type': 'application/json'} ) # Vérifier la réponse if response.status_code == 200: print("Message envoyé avec succès!") else: print(f"Erreur lors de l'envoi du message : {response.status_code} - {response.text}") #fonction d'envoi de notif de fin d'incident client1 def notif_fin_mattermost_client1(webhook_url, client, perimetre, incident_ref, description, impact, statut): # URL du webhook Mattermost message_mattermost = "✅ Fin d'incident : [" + client + "] " + incident_ref + " - " + perimetre + " - " + description + " - " + impact + " - " + statut + " ✅" # Contenu du message message = { "text": message_mattermost } # Envoyer la requête POST response = requests.post( webhook_url, data=json.dumps(message), headers={'Content-Type': 'application/json'} ) # Vérifier la réponse if response.status_code == 200: print("Message envoyé avec succès!") else: print(f"Erreur lors de l'envoi du message : {response.status_code} - {response.text}") # appel du menu menu()