diff --git a/app/beach/actions.ts b/app/beach/actions.ts index 8fe55e0..fbe517e 100644 --- a/app/beach/actions.ts +++ b/app/beach/actions.ts @@ -2,8 +2,6 @@ 'use server'; -import nodemailer from 'nodemailer'; - export async function submitRegistration(prevState: unknown, formData: FormData) { // 1. Spara all rådata direkt för att kunna skicka tillbaka den vid fel const rawData = { @@ -21,9 +19,9 @@ export async function submitRegistration(prevState: unknown, formData: FormData) return { success: false, message: 'Spam detekterat.', values: rawData }; } - // 2. Hämta Turnstile Token och Secret (MATCHING .env NAME) + // 2. Hämta Turnstile Token och Secret const turnstileToken = formData.get('cf-turnstile-response'); - const secretKey = process.env.TURNSTILE_SECRET; // Matchar din .env exakt + const secretKey = process.env.TURNSTILE_SECRET; if (!secretKey) { console.error("Saknar TURNSTILE_SECRET i miljön."); @@ -73,43 +71,97 @@ export async function submitRegistration(prevState: unknown, formData: FormData) ? `+46 (0)${cleanTel.substring(0, 2)}-${cleanTel.substring(2, 5)} ${cleanTel.substring(5, 7)} ${cleanTel.substring(7, 9)}` : rawData.tel; - // 5. Nodemailer setup - const transporter = nodemailer.createTransport({ - host: process.env.SMTP_HOST, - port: 587, - secure: false, - auth: { - user: process.env.SMTP_USER, - pass: process.env.SMTP_PASS, - }, - tls: { - rejectUnauthorized: false - } - }); + // 5. Stalwart JMAP Setup + const jmapUrl = process.env.STALWART_JMAP_URL; + const jmapToken = process.env.STALWART_API_TOKEN; + const accountId = process.env.STALWART_ACCOUNT_ID; + if (!jmapUrl || !jmapToken || !accountId) { + console.error("Saknar JMAP-konfiguration i miljön."); + return { + success: false, + message: 'E-postserver är inte konfigurerad. Kontakta administratör.', + values: rawData + }; + } + + // Hjälpfunktion för att bygga och skicka via Stalwart JMAP + async function sendMailJMAP(toEmail: string, replyToEmail: string, subject: string, htmlContent: string, fromName: string) { + const payload = { + using: [ + "urn:ietf:params:jmap:core", + "urn:ietf:params:jmap:mail", + "urn:ietf:params:jmap:submission" + ], + methodCalls: [ + [ + "Email/set", + { + accountId: accountId, + create: { + "draft-1": { + from: [{ email: accountId, name: fromName }], + to: [{ email: toEmail }], + replyTo: [{ email: replyToEmail }], + subject: subject, + bodyValues: { + "body-html": { + value: htmlContent, + isTruncated: false, + isEncodingProblem: false + } + }, + htmlBody: [{ partId: "body-html", type: "text/html" }] + } + } + }, + "0" + ], + [ + "EmailSubmission/set", + { + accountId: accountId, + create: { + "sub-1": { + emailId: "#draft-1" + } + } + }, + "1" + ] + ] + }; + + const res = await fetch(jmapUrl as string, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${jmapToken}` + }, + body: JSON.stringify(payload) + }); + + if (!res.ok) { + throw new Error(`JMAP API Error: ${res.status} ${res.statusText}`); + } + + return res.json(); + } + + // 6. Skapa och skicka mail try { const dateStr = new Date().toLocaleString('sv-SE', { timeZone: 'Europe/Stockholm', - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit' + year: 'numeric', month: '2-digit', day: '2-digit', + hour: '2-digit', minute: '2-digit', second: '2-digit' }); const cleanMessage = rawData.message ? rawData.message.replace(/[\r\n;]/g, " ") : ""; - // Mail till klubben - await transporter.sendMail({ - from: `"Beach-anmälan: ${rawData.name}" <${process.env.SMTP_USER}>`, - to: 'beach@lerbergetsvolleyboll.se', - replyTo: rawData.email, - subject: `Anmälan: ${rawData.team}`, - html: ` + // HTML för mail till klubben + const mailTillKlubbHtml = `
| Lagnamn: | ${rawData.team} |
| Kontakt: | ${rawData.name} |
| Nivå: | ${rawData.level} |
Meddelande:
${rawData.message ? rawData.message.replace(/\n/g, '
') : 'Inget meddelande'}