(back) add invitation email templates

Add HTML and text email templates for calendar invitations,
updates, cancellations and attendee reply notifications.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Nathan Panchout
2026-01-25 20:33:06 +01:00
parent c623596cbc
commit 7e90c960dc
8 changed files with 614 additions and 0 deletions

View File

@@ -0,0 +1,145 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Invitation à un événement</title>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
line-height: 1.6;
color: #333;
max-width: 600px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background-color: #ffffff;
border-radius: 8px;
padding: 30px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.header {
border-bottom: 2px solid #0066cc;
padding-bottom: 15px;
margin-bottom: 20px;
}
.header h1 {
color: #0066cc;
margin: 0;
font-size: 24px;
}
.event-title {
font-size: 20px;
font-weight: bold;
color: #333;
margin: 15px 0;
}
.event-details {
background-color: #f8f9fa;
border-left: 4px solid #0066cc;
padding: 15px;
margin: 20px 0;
}
.event-details table {
width: 100%;
border-collapse: collapse;
}
.event-details td {
padding: 8px 0;
vertical-align: top;
}
.event-details td:first-child {
font-weight: bold;
color: #666;
width: 120px;
}
.event-details td:last-child {
color: #333;
}
.description {
background-color: #fff;
border: 1px solid #eee;
padding: 15px;
margin: 20px 0;
border-radius: 4px;
}
.description h3 {
margin-top: 0;
color: #666;
}
.instructions {
background-color: #e7f3ff;
border-radius: 4px;
padding: 15px;
margin: 20px 0;
}
.instructions p {
margin: 0;
color: #0066cc;
}
.footer {
border-top: 1px solid #eee;
padding-top: 15px;
margin-top: 20px;
font-size: 12px;
color: #999;
text-align: center;
}
.icon {
vertical-align: middle;
margin-right: 8px;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>Invitation à un événement</h1>
</div>
<p>{{ organizer_display }} vous invite à un événement</p>
<div class="event-title">{{ event.summary }}</div>
<div class="event-details">
<table>
<tr>
<td>Quand</td>
<td>
{{ start_date }}<br>
<strong>{{ time_str }}</strong>
{% if start_date != end_date %}<br>jusqu'au {{ end_date }}{% endif %}
</td>
</tr>
{% if event.location %}
<tr>
<td>Lieu</td>
<td>{{ event.location }}</td>
</tr>
{% endif %}
<tr>
<td>Organisateur</td>
<td>{{ organizer_display }} &lt;{{ event.organizer_email }}&gt;</td>
</tr>
</table>
</div>
{% if event.description %}
<div class="description">
<h3>Description</h3>
<p>{{ event.description|linebreaks }}</p>
</div>
{% endif %}
<div class="instructions">
<p>Pour répondre à cette invitation, veuillez ouvrir le fichier .ics en pièce jointe avec votre application de calendrier ou répondre directement depuis votre client de messagerie.</p>
</div>
<div class="footer">
<p>Cette invitation a été envoyée via {{ app_name }}</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,19 @@
{{ organizer_display }} vous invite à un événement
Détails de l'événement
======================
Titre : {{ event.summary }}
Quand : {{ start_date }} {{ time_str }}{% if start_date != end_date %} - {{ end_date }}{% endif %}
{% if event.location %}Lieu : {{ event.location }}
{% endif %}Organisateur : {{ organizer_display }} <{{ event.organizer_email }}>
{% if event.description %}
Description :
{{ event.description }}
{% endif %}
Pour répondre à cette invitation, veuillez ouvrir le fichier .ics en pièce jointe avec votre application de calendrier ou répondre directement depuis votre client de messagerie.
---
Cette invitation a été envoyée via {{ app_name }}

View File

@@ -0,0 +1,133 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Événement annulé</title>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
line-height: 1.6;
color: #333;
max-width: 600px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background-color: #ffffff;
border-radius: 8px;
padding: 30px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.header {
border-bottom: 2px solid #dc3545;
padding-bottom: 15px;
margin-bottom: 20px;
}
.header h1 {
color: #dc3545;
margin: 0;
font-size: 24px;
}
.cancel-badge {
display: inline-block;
background-color: #dc3545;
color: white;
padding: 4px 12px;
border-radius: 12px;
font-size: 12px;
font-weight: bold;
margin-bottom: 10px;
}
.event-title {
font-size: 20px;
font-weight: bold;
color: #999;
margin: 15px 0;
text-decoration: line-through;
}
.event-details {
background-color: #f8d7da;
border-left: 4px solid #dc3545;
padding: 15px;
margin: 20px 0;
}
.event-details table {
width: 100%;
border-collapse: collapse;
}
.event-details td {
padding: 8px 0;
vertical-align: top;
color: #721c24;
}
.event-details td:first-child {
font-weight: bold;
width: 150px;
}
.instructions {
background-color: #f8d7da;
border-radius: 4px;
padding: 15px;
margin: 20px 0;
}
.instructions p {
margin: 0;
color: #721c24;
}
.footer {
border-top: 1px solid #eee;
padding-top: 15px;
margin-top: 20px;
font-size: 12px;
color: #999;
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>Événement annulé</h1>
</div>
<span class="cancel-badge">ANNULÉ</span>
<p>{{ organizer_display }} a annulé l'événement suivant</p>
<div class="event-title">{{ event.summary }}</div>
<div class="event-details">
<table>
<tr>
<td>Était prévu le</td>
<td>
{{ start_date }}<br>
<strong>{{ time_str }}</strong>
{% if start_date != end_date %}<br>jusqu'au {{ end_date }}{% endif %}
</td>
</tr>
{% if event.location %}
<tr>
<td>Lieu</td>
<td>{{ event.location }}</td>
</tr>
{% endif %}
<tr>
<td>Organisateur</td>
<td>{{ organizer_display }} &lt;{{ event.organizer_email }}&gt;</td>
</tr>
</table>
</div>
<div class="instructions">
<p>Cet événement a été annulé. Ouvrez le fichier .ics en pièce jointe pour le supprimer de votre calendrier.</p>
</div>
<div class="footer">
<p>Cette notification a été envoyée via {{ app_name }}</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,14 @@
{{ organizer_display }} a annulé l'événement : {{ event.summary }}
Détails de l'événement annulé
=============================
Titre : {{ event.summary }}
Était prévu le : {{ start_date }} {{ time_str }}{% if start_date != end_date %} - {{ end_date }}{% endif %}
{% if event.location %}Lieu : {{ event.location }}
{% endif %}Organisateur : {{ organizer_display }} <{{ event.organizer_email }}>
Cet événement a été annulé. Vous pouvez le supprimer de votre calendrier en ouvrant le fichier .ics en pièce jointe.
---
Cette notification a été envoyée via {{ app_name }}

View File

@@ -0,0 +1,120 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Réponse à l'événement</title>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
line-height: 1.6;
color: #333;
max-width: 600px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background-color: #ffffff;
border-radius: 8px;
padding: 30px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.header {
border-bottom: 2px solid #28a745;
padding-bottom: 15px;
margin-bottom: 20px;
}
.header h1 {
color: #28a745;
margin: 0;
font-size: 24px;
}
.event-title {
font-size: 20px;
font-weight: bold;
color: #333;
margin: 15px 0;
}
.event-details {
background-color: #d4edda;
border-left: 4px solid #28a745;
padding: 15px;
margin: 20px 0;
}
.event-details table {
width: 100%;
border-collapse: collapse;
}
.event-details td {
padding: 8px 0;
vertical-align: top;
}
.event-details td:first-child {
font-weight: bold;
color: #666;
width: 120px;
}
.instructions {
background-color: #d4edda;
border-radius: 4px;
padding: 15px;
margin: 20px 0;
}
.instructions p {
margin: 0;
color: #155724;
}
.footer {
border-top: 1px solid #eee;
padding-top: 15px;
margin-top: 20px;
font-size: 12px;
color: #999;
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>Réponse reçue</h1>
</div>
<p>{{ attendee_display }} a répondu à votre événement</p>
<div class="event-title">{{ event.summary }}</div>
<div class="event-details">
<table>
<tr>
<td>Quand</td>
<td>
{{ start_date }}<br>
<strong>{{ time_str }}</strong>
{% if start_date != end_date %}<br>jusqu'au {{ end_date }}{% endif %}
</td>
</tr>
{% if event.location %}
<tr>
<td>Lieu</td>
<td>{{ event.location }}</td>
</tr>
{% endif %}
<tr>
<td>Participant</td>
<td>{{ attendee_display }} &lt;{{ event.attendee_email }}&gt;</td>
</tr>
</table>
</div>
<div class="instructions">
<p>La réponse du participant a été enregistrée. Ouvrez le fichier .ics en pièce jointe pour mettre à jour votre calendrier.</p>
</div>
<div class="footer">
<p>Cette notification a été envoyée via {{ app_name }}</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,14 @@
{{ attendee_display }} a répondu à votre événement : {{ event.summary }}
Détails de l'événement
======================
Titre : {{ event.summary }}
Quand : {{ start_date }} {{ time_str }}{% if start_date != end_date %} - {{ end_date }}{% endif %}
{% if event.location %}Lieu : {{ event.location }}
{% endif %}
La réponse du participant a été enregistrée dans le fichier .ics en pièce jointe.
---
Cette notification a été envoyée via {{ app_name }}

View File

@@ -0,0 +1,150 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Événement modifié</title>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
line-height: 1.6;
color: #333;
max-width: 600px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background-color: #ffffff;
border-radius: 8px;
padding: 30px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.header {
border-bottom: 2px solid #ff9800;
padding-bottom: 15px;
margin-bottom: 20px;
}
.header h1 {
color: #ff9800;
margin: 0;
font-size: 24px;
}
.update-badge {
display: inline-block;
background-color: #ff9800;
color: white;
padding: 4px 12px;
border-radius: 12px;
font-size: 12px;
font-weight: bold;
margin-bottom: 10px;
}
.event-title {
font-size: 20px;
font-weight: bold;
color: #333;
margin: 15px 0;
}
.event-details {
background-color: #fff8e1;
border-left: 4px solid #ff9800;
padding: 15px;
margin: 20px 0;
}
.event-details table {
width: 100%;
border-collapse: collapse;
}
.event-details td {
padding: 8px 0;
vertical-align: top;
}
.event-details td:first-child {
font-weight: bold;
color: #666;
width: 120px;
}
.description {
background-color: #fff;
border: 1px solid #eee;
padding: 15px;
margin: 20px 0;
border-radius: 4px;
}
.description h3 {
margin-top: 0;
color: #666;
}
.instructions {
background-color: #fff8e1;
border-radius: 4px;
padding: 15px;
margin: 20px 0;
}
.instructions p {
margin: 0;
color: #e65100;
}
.footer {
border-top: 1px solid #eee;
padding-top: 15px;
margin-top: 20px;
font-size: 12px;
color: #999;
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>Événement modifié</h1>
</div>
<span class="update-badge">MODIFIÉ</span>
<p>{{ organizer_display }} a modifié un événement auquel vous êtes invité(e)</p>
<div class="event-title">{{ event.summary }}</div>
<div class="event-details">
<table>
<tr>
<td>Quand</td>
<td>
{{ start_date }}<br>
<strong>{{ time_str }}</strong>
{% if start_date != end_date %}<br>jusqu'au {{ end_date }}{% endif %}
</td>
</tr>
{% if event.location %}
<tr>
<td>Lieu</td>
<td>{{ event.location }}</td>
</tr>
{% endif %}
<tr>
<td>Organisateur</td>
<td>{{ organizer_display }} &lt;{{ event.organizer_email }}&gt;</td>
</tr>
</table>
</div>
{% if event.description %}
<div class="description">
<h3>Description</h3>
<p>{{ event.description|linebreaks }}</p>
</div>
{% endif %}
<div class="instructions">
<p>Cet événement a été modifié. Veuillez ouvrir le fichier .ics en pièce jointe pour mettre à jour votre calendrier.</p>
</div>
<div class="footer">
<p>Cette notification a été envoyée via {{ app_name }}</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,19 @@
{{ organizer_display }} a modifié l'événement
Détails de l'événement mis à jour
=================================
Titre : {{ event.summary }}
Quand : {{ start_date }} {{ time_str }}{% if start_date != end_date %} - {{ end_date }}{% endif %}
{% if event.location %}Lieu : {{ event.location }}
{% endif %}Organisateur : {{ organizer_display }} <{{ event.organizer_email }}>
{% if event.description %}
Description :
{{ event.description }}
{% endif %}
Cet événement a été modifié. Veuillez vérifier les changements et mettre à jour votre calendrier en conséquence.
---
Cette notification a été envoyée via {{ app_name }}