Bonjour,
Nous avons un Tiers Lieu avec un espace de cowroking et un café culturel et nous utilisons Dokos pour gérer les réservations, la facturation et les événements.
Pour simplifier la tache de l’équipe qui s’occupe de la programmation des événements j’ai mis en place une newsletter mensuelle automatisé qui envoi l’agenda des évements à partir des informations rentré dans Dokos.
Si d’autres personnes souhaitent mettre ça en place voici le code que j’utilise:
def creer_email_evenements_du_mois():
try:
# 1. Définir les dates du mois en cours
aujourdhui = frappe.utils.getdate(frappe.utils.nowdate())
debut_mois = aujourdhui.replace(day=1)
debut_mois = frappe.utils.add_months(debut_mois,1)
fin_mois = frappe.utils.add_days(debut_mois, 32).replace(day=1)
frappe.log("Période : " + str(debut_mois) + " à " + str(fin_mois))
# 2. Récupérer les événements du mois
événements = frappe.get_all(
"Event",
filters={
"starts_on": ["between", [debut_mois, fin_mois]],
"published": 1
},
fields=["name", "subject", "starts_on", "description", "Image"],
order_by="starts_on"
)
frappe.log("Nombre d'événements trouvés : " + str(len(événements)))
if not événements:
frappe.log("Aucun événement trouvé pour ce mois.")
return
# 3. Générer le contenu HTML de l'email
html_parts = [
"""
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
max-width: 600px;
margin: 0 auto;
padding: 20px;
background-color: #f9f9f9;
}
.header {
text-align: center;
padding: 20px 0;
border-bottom: 3px solid #065c2d;
background-color: #fff;
border-radius: 10px 10px 0 0;
margin-bottom: 20px;
}
.logo {
width: 40%;
margin-bottom: 10px;
}
h1 {
color: #065c2d;
font-size: 24px;
margin: 0;
}
.event {
margin-bottom: 20px;
padding: 20px;
border: 1px solid #ddd;
border-radius: 10px;
background-color: #fff;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
border-left: 4px solid #fddd04;
}
.event img {
max-width: 100%;
height: auto;
border-radius: 8px;
margin-bottom: 10px;
}
.event-title {
font-weight: bold;
font-size: 20px;
margin: 10px 0;
color: #065c2d;
}
.event-date {
color: #065c2d;
font-weight: bold;
font-size: 16px;
font-style: normal;
margin: 10px 0;
padding: 5px;
background-color: #f0f9eb;
border-radius: 5px;
display: inline-block;
}
.event-description {
margin: 10px 0;
font-size: 15px;
}
.cta-button {
display: inline-block;
background-color: #065c2d;
color: #fff;
padding: 10px 20px;
border-radius: 5px;
text-decoration: none;
font-weight: bold;
margin-top: 10px;
transition: background-color 0.3s ease;
}
.cta-button:hover {
background-color: #fddd04;
color: #065c2d;
}
.highlight {
font-weight: bold;
color: #065c2d;
}
</style>
</head>
<body>
<div class="header">
<img src="?Entrez l'url du logo du lieu?>" alt="Logo du lieu" class="logo">
<h1>Événements du mois au Lieu ??</h1>
<h1>{mois}</h1>
</div>
<div>
<p><span class="highlight">Un programme pour tous, toute l'année !</span> <br/>
Les bénévoles vous accueillent pour partager des moments <span class="highlight">festifs, créatifs et chaleureux</span></p>
""".replace("{mois}", frappe.utils.formatdate(debut_mois, 'MMMM yyyy').capitalize())
]
for événement in événements:
image_url = frappe.utils.get_url(événement.Image) if événement.Image else ""
img_tag = '<img src="' + image_url + '">' if image_url else ''
html_parts.append("""lalocomotive
<div class="event">
{img_tag}<div class="event-title">{subject}</div>
<div class="event-date"> {starts_on}</div>
<div class="event-description">{description}</div>
</div>
""".replace("{img_tag}", img_tag)
.replace("{subject}", événement.subject)
.replace("{starts_on}", frappe.utils.format_datetime(événement.starts_on, "dd/MM/yyyy HH:mm"))
.replace("{description}", événement.description or ''))
html_parts.extend([
"""
</div>
<div>
<p>Pour plus d’informations, consultez notre <a href="https://?url dokos?.dokos.cloud/bookings-ui/events">page événements</a>.</p>
<p>Vous pouvez également suivre la programme en direct, sur <a href="?url Facebook?">Facebook</a> ou sur <a href="url Instagram">InstaListe Groupe Email pour Newsletter Mensuellegram</a>.</p>
<p>À très vite à ?Nom du lieu? !</p>
</div>
</body>
</html>
"""
])
html_content = "".join(html_parts)
frappe.log("Contenu HTML généré avec succès.")
# Créer une newsletter
frappe.log("Création de la newsletter...")
newsletter_test = frappe.get_doc("Newsletter","Liste Groupe Email pour Newsletter Mensuelle")
email_group = newsletter_test.email_group
newsletter = frappe.get_doc({
"doctype": "Newsletter",
"title": "{mois} - Liste des événements à ?Nom du lieu?".replace("{mois}", frappe.utils.formatdate(debut_mois, 'MMMM yyyy').capitalize()),
"email_template": "Standard", # Utilise un template existant ou crée-en un
"sender_name": "?Nom du lieu?",
"sender_email": "?Email du lieu?",
"subject": "{mois} - Agenda des évenements à ?Nom du lieu?".replace("{mois}", frappe.utils.formatdate(debut_mois, 'MMMM yyyy').capitalize()),
"message": html_content,
"send_to": "email_group", # Option pour envoyer à des adresses spécifiques
"email_group": email_group, # Adresse email du destinataire
"send_to_contacts": 1,
"status": "Draft" # Statut initial
})
# Sauvegarder la newsletter
newsletter.insert(ignore_permissions=True)
frappe.db.commit()
# Envoyer la newsletter
frappe.log("Envoi d'un mail de rappel d'envoi de la newsletter...")
frappe.sendmail(
recipients="?Email gestionnaire evenements?;",
subject="La Newsletter est prete",
message="La Newsletter avec la liste des evenements pour ce mois ci est prete a être envoyée, <a href=\"https://lalocomotive.dokos.cloud/app/newsletter\">https://lalocomotive.dokos.cloud/app/newsletter</a>"
)
frappe.log("Newsletter envoyée avec succès.")
except Exception as e:
frappe.log("Erreur lors de l'exécution du script : " + str(e))
frappe.log_error(str(e))
frappe.sendmail(
recipients="?Email Admin?;",
subject="La Newsletter n'a pas pu être genérée",
message="Un problème a eu lieu de la création de la newsletter <a href=\"https://?url du lieu?.dokos.cloud/app/newsletter\">https://?url du lieu?.dokos.cloud/app/newsletter</a>"
)
# Exécuter la fonction
creer_email_evenements_du_mois()
Comment utiliser ce code :
- Créer un script serveur de type « Evenement Programmé » avec la fréquence Cron suivante :
0 0 20 * *. Cela executera le script tout les 20 du mois avec les évenements du mois suivant. - Créer une newsletter (
Email Groupé) vierge appeléListe Groupe Email pour Newsletter Mensuelle(le nom est important, il est utilisé dans le script) - Dans cette newsletter vierge, mettre le groupe email qui sera utilisé pour l’envoi de la newsletter.
- Voilà, attendre la fin du mois. Le script generera la Newsletter, enverra un email au gestionnaire de l’évenementiel pour qu’il puisse vérifier la newsletter et qu’il puisse l’envoyer.
Voilà un aperçu de la newsletter
