MailsNouveau
Un seul modèle pour tous les mails d’AUBOTA : la mise en forme du mail de partage de Share (fond nuit, carte, bouton bleu), un pied qui dit toujours pourquoi on reçoit le mail et comment ne plus le recevoir. Côté serveur, une classe : AubotaMail.
Aperçu
Ce sont les vrais mails, rendus à l’instant par la classe du serveur. Le pied change selon la sorte du mail.
Invitation vers une adresse sans compte (Share)
Version texte (toujours envoyée avec)
AUBOTA Share Un fichier t’attend =================== Camille Martin t’a envoyé un document via AUBOTA. Fichier : rapport-annuel-2026.pdf Lien temporaire · ouverture sécurisée · pas besoin de compte pour consulter. Ouvrir le partage : https://share.aubota.xyz/AbCdEf1234 -- Tu reçois ce mail parce que Camille Martin a saisi ton adresse pour t’inviter. C’est le seul mail que tu recevras pour cette invitation, sans publicité : ton adresse ne sert qu’à elle. Ne plus recevoir d’invitations par AUBOTA : https://settings.aubota.xyz/mails/exemple AUBOTA Share · https://aubota.xyz
Notification vers un compte (Réunions)
Version texte (toujours envoyée avec)
AUBOTA Réunions Tu es invité(e) à une réunion ============================= Bonjour Alex, Camille Martin t’invite à une réunion vidéo sur AUBOTA, dans ton navigateur : rien à installer. Réunion : Point du lundi Quand : 03/11/2026 à 09:30 Mot de passe : aucun Rejoindre la réunion : https://hub.aubota.xyz/meetings/abc123 -- Tu reçois ce mail parce que tu as choisi d’être prévenu par e-mail. Tu retrouves aussi tout dans Comlink (la cloche). Ne plus être prévenu par e-mail : https://settings.aubota.xyz/mails/exemple Tes choix : https://settings.aubota.xyz/choix/ AUBOTA Réunions · https://aubota.xyz
Transactionnel (mot de passe oublié)
Version texte (toujours envoyée avec)
AUBOTA Choisis un nouveau mot de passe =============================== Salut Alex, Tu as demandé à réinitialiser ton mot de passe sur AUBOTA. Le bouton ci-dessous t’emmène choisir le nouveau. Attention : ce lien n’est valable que 30 minutes. Réinitialiser mon mot de passe : https://auth.aubota.xyz/reset -- Tu reçois ce mail parce qu’une réinitialisation de mot de passe a été demandée pour le compte AUBOTA lié à cette adresse. Si tu n’es pas à l’origine de cette demande, ignore ce mail : rien ne change. AUBOTA · https://aubota.xyz
Nouveautés et conseils (Administration › Mails)
Version texte (toujours envoyée avec)
AUBOTA Les nouveautés de novembre ========================== Salut, Wallet sait maintenant lire tes tickets de caisse tout seul. -- Tu reçois ce mail parce que tu as accepté les nouveautés et conseils d’AUBOTA (Réglages › Tes choix). Me désabonner en un clic : https://settings.aubota.xyz/mails/exemple Tes choix : https://settings.aubota.xyz/choix/ AUBOTA · https://aubota.xyz
Envoyer un mail
Classe hors web src.aubota.xyz/php/core/AubotaMail.php. Le site décide d’abord s’il a le droit d’écrire (voir plus bas), puis :
require_once __DIR__ . '/../src.aubota.xyz/php/core/AubotaMail.php';
$ok = AubotaMail::envoyer($email, $prenom, [
'sorte' => Consentements::NOTIFICATION, // TRANSACTIONNEL | NOTIFICATION | CONSEILS
'module' => 'Share', // surtitre « AUBOTA SHARE »
'sujet' => 'Aubota Share — ' . $nom,
'titre' => 'Un fichier t’attend',
'intro' => $qui . ' t’a envoyé un document via AUBOTA.',
'details' => [['Fichier', $nom]],
'note' => 'Lien temporaire · pas besoin de compte pour consulter.',
'bouton' => ['libelle' => 'Ouvrir le partage', 'lien' => $lien],
'compte' => $hashDuDestinataire, // '' = adresse sans compte
'invite_par' => $qui,
]); // transport : mail() du serveur
// AubotaMail::envoyer(…, […], ['transport' => 'smtp']) → SMTP d’AuthMailer
// AubotaMail::rendre([…]) → ['sujet', 'html', 'texte', 'entetes'] sans rien envoyer
// AubotaMail::derniereErreur() après un échec| Clé | Rôle |
|---|---|
sorte | Obligatoire. Décide du pied (ci-dessous). Une sorte inconnue est traitée en notification, jamais en transactionnel. |
module | Surtitre en capitales (« AUBOTA RÉUNIONS ») et nom d’expéditeur (« AUBOTA Réunions »). |
sujet · titre | Objet du mail et grand titre de l’en-tête. |
intro · paragraphes | Texte brut (échappé) ; un saut de ligne reste un saut de ligne. |
details | Encadré [[étiquette, valeur], …] : fichier, date, lieu… |
note | Petite ligne sous l’encadré (durée de validité, conditions). |
bouton | libelle + lien en https:// (tout autre lien est ignoré). Le lien est aussi donné en clair, à copier. |
compte | Hash du destinataire s’il a un compte ; vide = adresse sans compte (invitation). |
invite_par | Invitation sans compte : qui a saisi l’adresse (« Camille Martin a saisi ton adresse… »). AubotaMail::nomSession() le donne. |
pourquoi | Remplace la phrase « Tu reçois ce mail parce que… » du pied. |
si_pas_toi | Transactionnel : ajoute « si tu n’es pas à l’origine de cette demande, ignore ce mail ». |
apercu | Ligne grise affichée par les boîtes de réception (défaut : l’intro). |
Le pied, selon la sorte
| Sorte | Avant d’envoyer | Pied du mail |
|---|---|---|
TRANSACTIONNELconfirmer l’adresse, mot de passe oublié, sécurité, info de service | Rien : part toujours. | « Il concerne ton compte AUBOTA. » Pas de désinscription (rien à désinscrire). |
NOTIFICATION vers un compteinvitation, partage, préversion | Consentements::mailAutorise(NOTIFICATION, $hash) | « Tu as choisi d’être prévenu par e-mail » + Ne plus être prévenu par e-mail (un clic, sans connexion) + Tes choix. |
NOTIFICATION sans compteinvitation à une adresse tapée | MailOpposition::estOpposee($email) + un seul mail par invitation | « X a saisi ton adresse pour t’inviter, seul mail, sans pub » + Ne plus recevoir d’invitations par AUBOTA (sans compte). |
CONSEILSnouveautés, newsletter | Consentements::mailAutorise(CONSEILS, $hash) | « Tu as accepté les nouveautés et conseils » + Me désabonner en un clic + Tes choix. En-têtes List-Unsubscribe / -Post (RFC 8058). |
Les liens « ne plus recevoir » mènent à https://settings.aubota.xyz/mails/<jeton> : jeton signé par le serveur (MailOpposition), page de confirmation Aubui, aucune connexion demandée. Un simple clic (ou l’antivirus d’une messagerie qui ouvre le lien) ne change rien : il faut confirmer. Le bouton « Se désabonner » de Gmail et des autres (POST List-Unsubscribe=One-Click) agit directement.
Adresses sans compte : les règles
- Un seul mail par invitation : la même adresse invitée deux fois au même partage ou à la même réunion ne reçoit rien de plus, et il n’y a pas de relance.
- Aucune pub dans une invitation.
- Liste d’opposition hors web (
~/.aubota/commun/mails/opposition.json), consultée avant chaque invitation : elle ne contient que des empreintes (HMAC avec une clé du serveur), jamais d’adresse. - On ne garde pas l’adresse au-delà de ce que l’objet exige : une réunion ne garde que l’empreinte de l’adresse invitée ; un partage garde la liste de ses destinataires tant qu’il existe (« à qui j’ai partagé »), effacée avec lui. Aucune adresse dans les journaux.
Pourquoi il tient dans toutes les boîtes
- Tables et styles en ligne, couleurs doublées en
bgcolor: un client qui retire le CSS garde le fond sombre et le texte lisible. - 600 px au plus, une colonne : rien à défiler de côté sur téléphone (vérifié à 390 et 700 px).
- Aucune image, aucune police externe, rien de tiers : polices du système, ≈ 6 Ko.
- Sombre partout, déclaré (
color-scheme) : Apple Mail ne l’inverse pas ; Gmail et Outlook en mode sombre gardent le fond sombre (vérifié en mode sombre forcé de Chrome). - Toujours une version texte, avec les mêmes liens.
Ce qui passe déjà par le modèle
| Envoi | Sorte | Transport |
|---|---|---|
| Inscription : confirmer l’adresse | Transactionnel | mail() |
| Mot de passe oublié | Transactionnel | SMTP d’auth (AuthSmtpMail, rendu par AubotaMail::rendre) |
| Réglages : changer d’e-mail (lien vers l’adresse actuelle, puis vers la nouvelle ; alerte « Annuler ce changement » vers l’ancienne) | Transactionnel | mail() (CompteEmail) |
| Share : partage d’un fichier | Notification (compte ou adresse) | mail() |
| Réunions : invitation | Notification (compte ou adresse) | mail() |
| Listes : invitation | Notification (compte) | mail() |
| Préversions de l’app | Notification (compte) | SMTP (AuthMailer) |
| Administration › Mails | Conseils, ou Transactionnel pour une info de service | SMTP (AuthMailer) |
lang="fr", tables marquéesrole="presentation", un vrai titreh1.- Contrastes sur la carte : texte 11:1, pied 5,5:1 (un cran plus clair que l’ancien mail de Share, qui était à 3,3:1). Le bouton garde le bleu de Share (3,7:1, texte gras) et son lien est aussi donné en clair.
- La version texte se lit seule (lecteurs d’écran, clients sans HTML).