Files
wondif_vue/server/utils/mailer.js

192 lines
5.2 KiB
JavaScript

import nodemailer from "nodemailer"
let transporter
function isSmtpConfigured(config) {
return Boolean(
config.smtpHost &&
config.smtpPort &&
config.smtpUser &&
config.smtpPassword &&
config.smtpFromEmail
)
}
function getTransporter() {
if (transporter) {
return transporter
}
const config = useRuntimeConfig()
if (!isSmtpConfigured(config)) {
return null
}
transporter = nodemailer.createTransport({
host: config.smtpHost,
port: Number(config.smtpPort),
secure: String(config.smtpSecure).toLowerCase() === "true",
connectionTimeout: 10000,
greetingTimeout: 10000,
socketTimeout: 15000,
auth: {
user: config.smtpUser,
pass: config.smtpPassword,
},
})
return transporter
}
export async function sendParcDemandEmails(payload) {
const config = useRuntimeConfig()
const mailer = getTransporter()
if (!mailer || !config.parcRequestRecipientEmail) {
return false
}
const from = config.smtpFromName
? `"${config.smtpFromName}" <${config.smtpFromEmail}>`
: config.smtpFromEmail
const adminSubject = `WONDIF - Formulaire de demande Parc instrumental - ${payload.name}`
const adminText = [
"Une nouvelle demande a été envoyée depuis le formulaire du Parc instrumental.",
"",
`Type de demande : ${payload.requestType}`,
`Nom : ${payload.name}`,
`Email : ${payload.email}`,
`Telephone : ${payload.phone}`,
`Structure : ${payload.organization}`,
"",
"Message :",
payload.message,
].join("\n")
const userSubject = "ONDIF - Confirmation de votre demande - Parc instrumental"
const userText = [
`Bonjour ${payload.name},`,
"",
"Votre demande a bien été transmise à l'équipe du Parc instrumental.",
"Nous reviendrons vers vous dans les meilleurs délais.",
"",
"Recapitulatif :",
`Type de demande : ${payload.requestType}`,
`Structure : ${payload.organization}`,
`Telephone : ${payload.phone}`,
"",
"Votre message :",
payload.message,
].join("\n")
await Promise.all([
mailer.sendMail({
from,
to: config.parcRequestRecipientEmail,
replyTo: payload.email,
subject: adminSubject,
text: adminText,
}),
mailer.sendMail({
from,
to: payload.email,
subject: userSubject,
text: userText,
}),
])
return true
}
function formatProjetLyceePriority(priority) {
if (priority === null || priority === undefined) return "Non renseigné"
if (priority === 0) return "Non souhaité"
return `Priorité ${priority}`
}
function getProjetLyceeSummary(payload) {
const projectWishes = [
["Concert-rencontre", payload.concertRencontrePriority],
["Parcours Entrer dans la peau d'un professionnel du spectacle", payload.immersionPriority],
["Parcours EAC", payload.eacPriority],
["Concert commente", payload.concertCommentePriority],
]
.filter(([, priority]) => priority >= 1 && priority <= 4)
.map(([label, priority]) => `${label} : ${formatProjetLyceePriority(priority)}`)
return [
`Etablissement scolaire : ${payload.schoolName}`,
`Departement : ${payload.department}`,
`Ville : ${payload.city}`,
`Enseignant coordinateur : ${payload.coordinatorName}`,
`Email : ${payload.email}`,
`Telephone : ${payload.phone}`,
`Discipline enseignee : ${payload.discipline}`,
`Niveau de classe : ${payload.classLevel}`,
`Nombre probable d'eleves concernes : ${payload.studentCount}`,
...(projectWishes.length ? ["", "Souhaits de projet :", ...projectWishes] : []),
"",
"Periode souhaitee :",
payload.projectPeriod,
].join("\n")
}
export async function sendProjetLyceeEmails(payload) {
const config = useRuntimeConfig()
const mailer = getTransporter()
if (!mailer) {
console.warn("Email projet lycée non envoyé: configuration SMTP incomplète.")
return false
}
if (!config.scolaireRequestRecipientEmail) {
console.warn("Email projet lycée non envoyé: destinataire scolaire manquant.")
return false
}
const from = config.smtpFromName
? `"${config.smtpFromName}" <${config.smtpFromEmail}>`
: config.smtpFromEmail
const summary = getProjetLyceeSummary(payload)
const adminSubject = `WONDIF - Candidature projet lycee - ${payload.schoolName}`
const adminText = [
"Une nouvelle candidature a été envoyée depuis le formulaire Projet lycée.",
"",
summary,
].join("\n")
const userSubject = "ONDIF - Confirmation de votre candidature - Projet lycée"
const userText = [
`Bonjour ${payload.coordinatorName},`,
"",
"Votre candidature à un projet avec l'Orchestre national d'Île-de-France a bien été transmise.",
"L'équipe d'action culturelle reviendra vers vous d'ici fin juin 2026 afin de vous informer de la suite donnée à votre candidature.",
"",
"Recapitulatif :",
summary,
].join("\n")
await Promise.all([
mailer.sendMail({
from,
to: config.scolaireRequestRecipientEmail,
replyTo: payload.email,
subject: adminSubject,
text: adminText,
}),
mailer.sendMail({
from,
to: payload.email,
subject: userSubject,
text: userText,
}),
])
return true
}