This commit is contained in:
2026-03-04 14:13:16 +01:00
parent b7d826e29c
commit 56ea3348d6
41 changed files with 846 additions and 162 deletions

View File

@@ -1,7 +1,10 @@
import nodemailer from 'nodemailer'
const SMTP_HOST = (process.env.SMTP_HOST ?? '').trim()
const SMTP_HOST_IS_PLACEHOLDER = SMTP_HOST === '' || SMTP_HOST.toLowerCase() === 'smtp.example.com'
const transporter = nodemailer.createTransport({
host: process.env.SMTP_HOST,
host: SMTP_HOST,
port: Number(process.env.SMTP_PORT) || 587,
secure: process.env.SMTP_SECURE === 'true',
auth:
@@ -10,6 +13,16 @@ const transporter = nodemailer.createTransport({
: undefined,
})
async function sendMailOrSkip(mailOptions: any, emailType: string) {
if (SMTP_HOST_IS_PLACEHOLDER) {
const target = typeof mailOptions?.to === 'string' ? mailOptions.to : 'unknown-recipient'
console.warn(`[email] SMTP not configured. Skipping ${emailType} email to ${target}.`)
return
}
await transporter.sendMail(mailOptions)
}
export async function sendMagicLinkEmail({
to,
magicUrl,
@@ -17,7 +30,7 @@ export async function sendMagicLinkEmail({
to: string
magicUrl: string
}) {
await transporter.sendMail({
await sendMailOrSkip({
from: process.env.EMAIL_FROM ?? 'noreply@innungsapp.de',
to,
subject: 'Ihr Login-Link für InnungsApp',
@@ -44,7 +57,7 @@ export async function sendMagicLinkEmail({
</div>
</div>
`,
})
}, 'magic link')
}
export async function sendInviteEmail({
@@ -61,7 +74,7 @@ export async function sendInviteEmail({
// Generate magic link for the invite
const signInUrl = `${apiUrl}/login?email=${encodeURIComponent(to)}&invited=true`
await transporter.sendMail({
await sendMailOrSkip({
from: process.env.EMAIL_FROM ?? 'noreply@innungsapp.de',
to,
subject: `Einladung zur InnungsApp — ${orgName}`,
@@ -86,7 +99,7 @@ export async function sendInviteEmail({
</div>
</div>
`,
})
}, 'invite')
}
export async function sendAdminCredentialsEmail({
@@ -102,7 +115,7 @@ export async function sendAdminCredentialsEmail({
password: string
loginUrl: string
}) {
await transporter.sendMail({
await sendMailOrSkip({
from: process.env.EMAIL_FROM ?? 'noreply@innungsapp.de',
to,
subject: `Admin-Zugang für — ${orgName}`,
@@ -134,5 +147,5 @@ export async function sendAdminCredentialsEmail({
</div>
</div>
`,
})
}, 'admin credentials')
}