Emails
Point de départ : assets/modeles/email.html. Envoi par Mailgun avec scripts/envoyer_email.py.
Ce qui change par rapport au web
Une messagerie n'est pas un navigateur : Outlook pour Windows rend le HTML avec le moteur de Word, Gmail retire une partie du CSS. La charte y tient par les couleurs, la graisse, la diagonale et le bandeau encre.
- Construction : tableaux et styles en ligne, 600 px de large, une colonne sous 620 px. Pas de variables CSS : les couleurs s'écrivent en dur, avec les valeurs du tableau des couleurs de
SKILL.md. - Polices : Mona Sans et Monaspace Neon se chargent dans Apple Mail et sur iOS. Gmail et Outlook les remplacent par Helvetica ou Arial, et la largeur des lettres (
font-stretch) n'y joue pas. On ne compense pas avec une autre police. - Diagonale :
border-radiusen diagonale sur chaque surface (28 / 6 px pour la carte, 44 / 6 px pour le bloc encre, 18 / 5 px pour les encadrés, 12 / 4 px pour le bouton). Outlook pour Windows les affiche carrés : c'est accepté. - Profondeur : pas d'ombre ni de filet en ombre interne, que Gmail retire. Les surfaces se distinguent par leur fond : lavande, papier, ink-50, pêche claire, encre.
- Courbes de niveau : uniquement dans le bandeau du bloc encre (
assets/email/bandeau.jpg), qui porte aussi le logotype blanc et se fond dans l'encre. - Icônes : pas de SVG ni d'icône Lucide. La flèche « → » en texte suffit pour un bouton ou un lien de suite.
- Mode sombre : Apple Mail suit les classes
bg-*,t-*etbtn-inkdu<style>(papier encre, textes clairs, bouton blanc). Gmail et Outlook inversent eux-mêmes les couleurs ; le bloc encre et les images restent lisibles dans tous les cas.
Images intégrées au message
Les images partent avec l'email, en pièces jointes intégrées : <img src="cid:bandeau.jpg"> renvoie au fichier assets/email/bandeau.jpg, que le script joint au message. Aucun lien vers une image en ligne : Outlook bloque les images distantes tant que le destinataire ne les a pas autorisées.
- Pas d'image en base64 dans le HTML : Gmail la retire.
- Pas d'image en fond CSS : Gmail ne l'affiche pas et la montre en pièce jointe. Un motif passe par une image
<img>, comme le bandeau. - Pas de SVG : ni Gmail ni Outlook ne le lisent. Les logos sont en PNG ou intégrés au bandeau.
- Une nouvelle image : PNG ou JPEG à deux fois sa taille d'affichage, dans
assets/email/(ou un autre dossier passé avec--images), légère. Le modèle pèse environ 64 Ko par message, images comprises. assets/email/logo.pngest le pictogramme (signature et pied). Le logotype n'existe que dans le bandeau, à 150 px de large : environ 90 px sur un téléphone, au-dessus du seuil de lisibilité de 80 px.
Les blocs du modèle
Chaque bloc est délimité par un commentaire <!-- bloc · … --> ; on retire ceux qui ne servent pas. Le script retire ces commentaires à l'envoi.
| Bloc | Rôle |
|---|---|
| Texte d'aperçu | Ce que la messagerie montre sous l'objet : 90 caractères au plus, il complète l'objet sans le répéter |
| Ligne du haut | Le type d'envoi en Monaspace (invitation, lettre, annonce) |
| Temps fort encre | Bandeau, sur-titre pêche, titre (un mot en pêche), chapeau ink-200 |
| Carte papier | Salutation et texte, liste à puces en diagonale, encadré pratique, appel à l'action, encadré pêche, signature |
| Pied | Pictogramme, « AI Driven Insight », adresse, contact, désinscription |
- Un seul titre
h1, dans le bloc encre. Les intertitres de la carte sont desh2de 23 px, 720. - Un seul bouton plein (encre) ; une action secondaire passe en lien de suite.
- L'encadré pratique met ses libellés en Monaspace capitales et ses valeurs en Mona Sans 620 : il passe en une colonne sur téléphone.
- L'encadré pêche porte la phrase humaine : une invitation à répondre, une précision.
- Le lien de désinscription reste dans tout envoi à une liste.
Écrire l'email
Mêmes règles que tout support adalan : français direct, phrases courtes, typographie française (espace insécable avant :, espace fine avant ? ! ;), « adalan » en minuscules. Pas de témoignage, de chiffre ni de résultat client inventés.
- Objet : 50 caractères au plus, concret, sans capitales ni point d'exclamation.
- Variables :
{{prenom}},{{lien_inscription}}… viennent d'une colonne de la liste des destinataires ou de--var nom=valeur.{{lien_desinscription}}devient le lien de désinscription de Mailgun (%unsubscribe_url%). - Crochets :
[Jeudi 00 mois],[Prénom Nom]… marquent ce qu'il reste à compléter. Le script refuse d'envoyer tant qu'il en reste.
Envoyer avec Mailgun
Une seule fois, dans Mailgun :
- un domaine d'envoi vérifié (SPF, DKIM), avec une politique DMARC sur le domaine principal ;
- le suivi des désinscriptions activé dans les réglages du domaine, avec le pied automatique vidé : le lien du modèle le remplace, sinon l'email en porte deux ;
- une clé d'API d'envoi, gardée hors du dépôt.
À chaque envoi :
-
Copier le modèle, écrire le texte, compléter les crochets, retirer les blocs inutiles.
-
Préparer la liste des destinataires en CSV UTF-8 : une colonne
emailet une colonne par variable (prenom…). Excel : « CSV UTF-8 (délimité par des virgules) ». -
Vérifier, sans rien envoyer : le script contrôle les variables, les crochets et les images, puis écrit
apercu.eml, le message du premier destinataire, à ouvrir dans Apple Mail ou Outlook.python3 scripts/envoyer_email.py matinale.html --objet "Matinale IA : passer de l’essai à l’usage" \ --de "adalan <invitations@mg.adalan.fr>" --repondre-a contact@adalan.fr \ --destinataires invites.csv --var lien_inscription=https://… --tag matinale-ia -
S'envoyer l'email à soi-même : remplacer
--destinataires invites.csvpar--a moi@adalan.fr --var prenom=…, et ajouter--envoyer. -
Envoyer à la liste : la commande de l'étape 3 avec
--envoyer.--testen plus fait accepter les messages par Mailgun sans les distribuer.
- Variables d'environnement :
MAILGUN_API_KEY,MAILGUN_DOMAIN, etMAILGUN_REGION=eupour un domaine créé dans la région Europe (uspar défaut). --repondre-a: l'adresse qui reçoit les réponses, quand l'expéditeur est une adresse du domaine d'envoi qui ne reçoit rien.- Le script envoie un message par destinataire, avec une version texte tirée du HTML. En cas d'échec, il s'arrête et dit qui a déjà reçu l'email : on retire ces adresses de la liste avant de relancer.
- Python 3.9 ou plus, bibliothèque standard seulement.
Vérification
- Plus aucun crochet ; l'objet et le texte d'aperçu sont écrits.
- L'aperçu
.emls'ouvre avec ses images, sur ordinateur et sur téléphone. - Un envoi à soi-même est arrivé dans la boîte de réception, pas dans les indésirables, dans Gmail et dans Outlook.
- Le lien de désinscription mène à la page de Mailgun.
- Un seul bouton plein ; tous les liens mènent au bon endroit.