import { type NextRequest, NextResponse } from "next/server"; import nodemailer from "nodemailer"; import SMTPTransport from "nodemailer/lib/smtp-transport"; import Mail from "nodemailer/lib/mailer"; import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); export async function POST(request: NextRequest) { try { const body = (await request.json()) as { email: string; name: string; subject: string; message: string; }; const { email, name, subject, message } = body; console.log('π§ Email request received:', { email, name, subject, messageLength: message.length }); // Validate input if (!email || !name || !subject || !message) { console.error('β Validation failed: Missing required fields'); return NextResponse.json( { error: "Alle Felder sind erforderlich" }, { status: 400 }, ); } // Validate email format const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { console.error('β Validation failed: Invalid email format'); return NextResponse.json( { error: "UngΓΌltige E-Mail-Adresse" }, { status: 400 }, ); } // Validate message length if (message.length < 10) { console.error('β Validation failed: Message too short'); return NextResponse.json( { error: "Nachricht muss mindestens 10 Zeichen lang sein" }, { status: 400 }, ); } const user = process.env.MY_EMAIL ?? ""; const pass = process.env.MY_PASSWORD ?? ""; console.log('π Environment check:', { hasEmail: !!user, hasPassword: !!pass, emailHost: user.split('@')[1] || 'unknown' }); if (!user || !pass) { console.error("β Missing email/password environment variables"); return NextResponse.json( { error: "E-Mail-Server nicht konfiguriert" }, { status: 500 }, ); } const transportOptions: SMTPTransport.Options = { host: "mail.dk0.dev", port: 587, secure: false, // Port 587 uses STARTTLS, not SSL/TLS requireTLS: true, auth: { type: "login", user, pass, }, // Increased timeout settings for better reliability connectionTimeout: 30000, // 30 seconds greetingTimeout: 30000, // 30 seconds socketTimeout: 60000, // 60 seconds // Additional TLS options for better compatibility tls: { rejectUnauthorized: false, // Allow self-signed certificates ciphers: 'SSLv3' } }; console.log('π Creating transport with options:', { host: transportOptions.host, port: transportOptions.port, secure: transportOptions.secure, user: user.split('@')[0] + '@***' // Hide full email in logs }); const transport = nodemailer.createTransport(transportOptions); // Verify transport configuration with retry logic let verificationAttempts = 0; const maxVerificationAttempts = 3; let verificationSuccess = false; while (verificationAttempts < maxVerificationAttempts && !verificationSuccess) { try { verificationAttempts++; console.log(`π SMTP verification attempt ${verificationAttempts}/${maxVerificationAttempts}`); await transport.verify(); console.log('β SMTP connection verified successfully'); verificationSuccess = true; } catch (verifyError) { console.error(`β SMTP verification attempt ${verificationAttempts} failed:`, verifyError); if (verificationAttempts >= maxVerificationAttempts) { console.error('β All SMTP verification attempts failed'); return NextResponse.json( { error: "E-Mail-Server-Verbindung fehlgeschlagen" }, { status: 500 }, ); } // Wait before retry await new Promise(resolve => setTimeout(resolve, 2000)); } } const mailOptions: Mail.Options = { from: `"Portfolio Contact" <${user}>`, to: "contact@dk0.dev", // Send to your contact email replyTo: email, subject: `Portfolio Kontakt: ${subject}`, html: `
Von deinem Portfolio
Kontaktanfrage
${email}
${subject}
${message}
Diese E-Mail wurde automatisch von deinem Portfolio generiert.
Dennis Konkol Portfolio β’ dki.one
${new Date().toLocaleString('de-DE', { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' })}