93 lines
3.1 KiB
TypeScript
93 lines
3.1 KiB
TypeScript
"use server";
|
|
|
|
import { transporter } from "@/lib/mailer";
|
|
|
|
export interface ContactFormState {
|
|
success: boolean;
|
|
error?: string;
|
|
fieldErrors?: Partial<Record<
|
|
"unternehmen" | "vorname" | "nachname" | "email" | "telefon" | "nachricht" | "datenschutz",
|
|
string
|
|
>>;
|
|
}
|
|
|
|
const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
// Erlaubt Ziffern, Leerzeichen, +, -, /, Klammern - deckt gängige Telefonformate ab.
|
|
const PHONE_REGEX = /^[0-9+\-/() ]{6,20}$/;
|
|
|
|
export async function sendContactMessage(
|
|
_prevState: ContactFormState,
|
|
formData: FormData,
|
|
): Promise<ContactFormState> {
|
|
const unternehmen = (formData.get("unternehmen") as string | null)?.trim() ?? "";
|
|
const vorname = (formData.get("vorname") as string | null)?.trim() ?? "";
|
|
const nachname = (formData.get("nachname") as string | null)?.trim() ?? "";
|
|
const email = (formData.get("email") as string | null)?.trim() ?? "";
|
|
const telefon = (formData.get("telefon") as string | null)?.trim() ?? "";
|
|
const nachricht = (formData.get("nachricht") as string | null)?.trim() ?? "";
|
|
const datenschutz = formData.get("datenschutz");
|
|
|
|
const fieldErrors: ContactFormState["fieldErrors"] = {};
|
|
|
|
if (!vorname) fieldErrors.vorname = "Bitte geben Sie Ihren Vornamen an.";
|
|
if (!nachname) fieldErrors.nachname = "Bitte geben Sie Ihren Nachnamen an.";
|
|
|
|
if (!email) {
|
|
fieldErrors.email = "Bitte geben Sie Ihre E-Mail-Adresse an.";
|
|
} else if (!EMAIL_REGEX.test(email)) {
|
|
fieldErrors.email = "Bitte geben Sie eine gültige E-Mail-Adresse an.";
|
|
}
|
|
|
|
if (!telefon) {
|
|
fieldErrors.telefon = "Bitte geben Sie Ihre Telefonnummer an.";
|
|
} else if (!PHONE_REGEX.test(telefon)) {
|
|
fieldErrors.telefon = "Bitte geben Sie eine gültige Telefonnummer an.";
|
|
}
|
|
|
|
if (!nachricht) {
|
|
fieldErrors.nachricht = "Bitte geben Sie eine Nachricht ein.";
|
|
}
|
|
|
|
if (datenschutz !== "on") {
|
|
fieldErrors.datenschutz = "Bitte bestätigen Sie die Datenschutzhinweise.";
|
|
}
|
|
|
|
if (Object.keys(fieldErrors).length > 0) {
|
|
return { success: false, fieldErrors };
|
|
}
|
|
|
|
try {
|
|
await transporter.sendMail({
|
|
from: `"Basiclean Kontaktformular" <${process.env.SMTP_USER}>`,
|
|
to: process.env.CONTACT_RECEIVER,
|
|
replyTo: email,
|
|
subject: `Neue Kontaktanfrage von ${vorname} ${nachname}`,
|
|
text: [
|
|
`Unternehmen: ${unternehmen || "-"}`,
|
|
`Name: ${vorname} ${nachname}`,
|
|
`E-Mail: ${email}`,
|
|
`Telefon: ${telefon}`,
|
|
"",
|
|
"Nachricht:",
|
|
nachricht,
|
|
].join("\n"),
|
|
html: `
|
|
<h2>Neue Kontaktanfrage</h2>
|
|
<p><strong>Unternehmen:</strong> ${unternehmen || "-"}</p>
|
|
<p><strong>Name:</strong> ${vorname} ${nachname}</p>
|
|
<p><strong>E-Mail:</strong> ${email}</p>
|
|
<p><strong>Telefon:</strong> ${telefon}</p>
|
|
<p><strong>Nachricht:</strong></p>
|
|
<p>${nachricht.replace(/\n/g, "<br />")}</p>
|
|
`,
|
|
});
|
|
|
|
return { success: true };
|
|
} catch (error) {
|
|
console.error("Fehler beim Senden der Kontaktanfrage:", error);
|
|
return {
|
|
success: false,
|
|
error: "Die Nachricht konnte nicht gesendet werden. Bitte versuchen Sie es später erneut.",
|
|
};
|
|
}
|
|
} |