62 lines
No EOL
1.6 KiB
TypeScript
62 lines
No EOL
1.6 KiB
TypeScript
"use server"
|
|
|
|
import { z } from 'zod'
|
|
import { Resend } from 'resend'
|
|
import { isSpam } from '@/utils/detectSpam'
|
|
|
|
/**
|
|
* Send email through Resend API
|
|
*
|
|
* @param toEmail
|
|
* @param prevState
|
|
* @param formData
|
|
*/
|
|
export async function send(toEmail: string, prevState: any, formData: FormData) {
|
|
|
|
const schema = z.object({
|
|
email: z.string().email(),
|
|
subject: z.string(),
|
|
name: z.string(),
|
|
message: z.string()
|
|
});
|
|
|
|
const validatedFields = schema.safeParse({
|
|
name: formData.get("name"),
|
|
email: formData.get("email"),
|
|
subject: formData.get("subject"),
|
|
message: formData.get("message"),
|
|
})
|
|
|
|
if (!validatedFields.success) {
|
|
return {
|
|
errors: validatedFields.error.flatten().fieldErrors,
|
|
message: "Nicht alle Felder waren gültig"
|
|
}
|
|
}
|
|
|
|
if (isSpam(validatedFields.data.message)) {
|
|
return {
|
|
message: "Ihre Nachricht wurde als unerwünschte Werbung eingestuft und nicht gesendet."
|
|
}
|
|
}
|
|
|
|
try {
|
|
const resend = new Resend(process.env.RESEND_API_KEY);
|
|
const resp = await resend.emails.send({
|
|
from: 'noreply@dreikoenige.berlin',
|
|
replyTo: validatedFields.data.email,
|
|
to: toEmail,
|
|
subject: `Über Kontaktformular: ${validatedFields.data.subject}`,
|
|
text: `Nachricht von ${validatedFields.data.name} (${validatedFields.data.email}): \n\n ${validatedFields.data.message}`
|
|
});
|
|
console.log(resp);
|
|
} catch (e) {
|
|
console.error(e);
|
|
return { message: "Fehler beim senden der Nachricht." };
|
|
}
|
|
|
|
return {
|
|
message: "Ihre Nachricht wurde erfolgreich übermittelt"
|
|
}
|
|
|
|
} |