- MAIL_DRIVER=resend par défaut, from rubis@arthurbarre.fr (domaine vérifié) - replyTo posé sur user.email dans les relances : les réponses des clients reviennent au patron de la TPE, pas dans notre boîte transactionnelle - ajout d'une commande Ace `send:test-email` pour valider la conf (driver, from, SPF/DKIM/clé API) sans passer par tout le flow facture Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
62 lines
2.2 KiB
TypeScript
62 lines
2.2 KiB
TypeScript
import { BaseCommand, args, flags } from '@adonisjs/core/ace'
|
|
import type { CommandOptions } from '@adonisjs/core/types/ace'
|
|
import mail from '@adonisjs/mail/services/main'
|
|
import env from '#start/env'
|
|
|
|
/**
|
|
* Envoie un email de test via le mailer courant (typiquement Resend)
|
|
* pour valider la conf SPF/DKIM/clé API sans passer par toute la chaîne
|
|
* facture → job BullMQ.
|
|
*
|
|
* node ace send:test-email arthur@example.com
|
|
* node ace send:test-email arthur@example.com --reply-to=patron@tpe.fr
|
|
*/
|
|
export default class SendTestEmail extends BaseCommand {
|
|
static commandName = 'send:test-email'
|
|
static description = 'Envoie un email de test via le mailer configuré (Resend en prod)'
|
|
|
|
static options: CommandOptions = {
|
|
startApp: true,
|
|
}
|
|
|
|
@args.string({ description: 'Adresse destinataire' })
|
|
declare to: string
|
|
|
|
@flags.string({ description: 'Adresse de reply-to (optionnelle)' })
|
|
declare replyTo?: string
|
|
|
|
async run() {
|
|
const driver = env.get('MAIL_DRIVER', 'smtp')
|
|
const fromAddress = env.get('MAIL_FROM_ADDRESS', 'relances@rubis-sur-l-ongle.fr')
|
|
const fromName = env.get('MAIL_FROM_NAME', "Rubis Sur l'Ongle")
|
|
|
|
this.logger.info(`Driver: ${driver}`)
|
|
this.logger.info(`From: ${fromName} <${fromAddress}>`)
|
|
this.logger.info(`To: ${this.to}`)
|
|
if (this.replyTo) this.logger.info(`ReplyTo: ${this.replyTo}`)
|
|
|
|
const mailer = mail.use(driver)
|
|
const response = await mailer.send((m) => {
|
|
m.from(fromAddress, fromName)
|
|
.to(this.to)
|
|
.subject('[Rubis] Test d\'envoi via Resend')
|
|
.text(
|
|
`Bonjour,\n\n` +
|
|
`Ceci est un email de test envoyé depuis Rubis Sur l'Ongle.\n` +
|
|
`Si vous recevez ce message, la conf Resend (SPF/DKIM/API key) est OK.\n\n` +
|
|
`Driver utilisé : ${driver}\n` +
|
|
`Date : ${new Date().toISOString()}\n\n` +
|
|
`— L'équipe Rubis`
|
|
)
|
|
if (this.replyTo) m.replyTo(this.replyTo)
|
|
})
|
|
|
|
this.logger.success('Email envoyé')
|
|
// Resend renvoie un messageId dans la réponse — utile pour retrouver
|
|
// le log dans le dashboard.
|
|
if (response?.messageId) {
|
|
this.logger.info(`messageId: ${response.messageId}`)
|
|
}
|
|
}
|
|
}
|