Templates HTML stylés DA Rubis pour les 2 emails sortants — fini le
plain text moche.
apps/api/app/mails/
├── _brand.ts : tokens couleur + spacing partagés
├── _layout.tsx : squelette commun (header rubis-deep + footer)
├── checkin_email.tsx : email envoyé À L'USER avec 2 boutons CTA
│ Oui (rubis primary) / Non (outlined)
└── relance_email.tsx : email envoyé AU CLIENT, body texte du plan
+ card récap (numéro, montant, échéance,
badge retard rubis-deep)
Stack :
- @react-email/components + @react-email/render
- Tous les styles inline (compatible Gmail / Outlook / Apple Mail)
- HTML + plain text en fallback (anti-spam, accessibility)
mail_dispatcher.ts :
- sendRelanceEmail : .html(rendered) + .text(body)
- sendCheckinEmail : .html(rendered) + .text(body)
- daysLate calculé via clock.now (démo-aware)
send_test_email :
- Nouveau flag --template=checkin (default) | relance | plain pour
tester chaque rendu via Mailpit sans créer de vraie facture.
Brand & landing :
- "Rubis Sur l'Ongle" → "Rubis sur l'ongle" partout (config, mail,
PDF, Stripe appInfo)
- Nouvelle env var LANDING_URL (default https://rubis.arthurbarre.fr)
- Footer email rend "Rubis sur l'ongle" comme <a> rubis cliquable
vers la landing — l'user qui reçoit le mail connaît la marque
derrière l'envoi
- .env.example mis à jour avec LANDING_URL pour les autres devs
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
47 lines
1.2 KiB
TypeScript
47 lines
1.2 KiB
TypeScript
import env from '#start/env'
|
|
import { defineConfig, transports } from '@adonisjs/mail'
|
|
import type { InferMailers } from '@adonisjs/mail/types'
|
|
|
|
const mailConfig = defineConfig({
|
|
default: env.get('MAIL_DRIVER', 'smtp'),
|
|
|
|
from: {
|
|
address: env.get('MAIL_FROM_ADDRESS', 'relances@rubis-sur-l-ongle.fr'),
|
|
name: env.get('MAIL_FROM_NAME', "Rubis sur l'ongle"),
|
|
},
|
|
|
|
/**
|
|
* Variables partagées par tous les templates Edge (logo, URL de base…).
|
|
*/
|
|
globals: {
|
|
brandName: "Rubis sur l'ongle",
|
|
appUrl: env.get('APP_URL'),
|
|
},
|
|
|
|
mailers: {
|
|
/**
|
|
* SMTP — Mailpit en dev (catch-all sur localhost:1025), n'importe quel
|
|
* relais SMTP en prod si on ne veut pas de provider tiers.
|
|
*/
|
|
smtp: transports.smtp({
|
|
host: env.get('SMTP_HOST', 'localhost'),
|
|
port: env.get('SMTP_PORT', 1025),
|
|
// Auth optionnelle — pas requise pour Mailpit
|
|
}),
|
|
|
|
/**
|
|
* Resend — provider transactionnel par défaut en prod (cf. ADR-021).
|
|
*/
|
|
resend: transports.resend({
|
|
key: env.get('RESEND_API_KEY', ''),
|
|
baseUrl: 'https://api.resend.com',
|
|
}),
|
|
},
|
|
})
|
|
|
|
export default mailConfig
|
|
|
|
declare module '@adonisjs/mail/types' {
|
|
export interface MailersList extends InferMailers<typeof mailConfig> {}
|
|
}
|