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()