import { Resend } from 'resend'; import nodemailer from 'nodemailer'; import * as dotenv from 'dotenv'; // Load environment variables dotenv.config(); const resend = new Resend(process.env.RESEND_API_KEY); function smtpEnabled(): boolean { return Boolean( process.env.SMTP_HOST && process.env.SMTP_USER && process.env.SMTP_PASS ); } async function testEmailSending() { console.log('๐งช Testing email sending configuration...\n'); // Check environment variables console.log('๐ Environment Variables:'); console.log(' EMAIL_PROVIDER:', process.env.EMAIL_PROVIDER || 'smtp (default)'); console.log(' SMTP_HOST:', process.env.SMTP_HOST || 'โ NOT SET'); console.log(' SMTP_PORT:', process.env.SMTP_PORT || '465 (default)'); console.log(' SMTP_SECURE:', process.env.SMTP_SECURE || 'true (default)'); console.log(' SMTP_USER:', process.env.SMTP_USER || 'โ NOT SET'); console.log(' SMTP_FROM_EMAIL:', process.env.SMTP_FROM_EMAIL || 'โ NOT SET'); console.log(' RESEND_API_KEY:', process.env.RESEND_API_KEY ? `${process.env.RESEND_API_KEY.substring(0, 10)}...` : 'โ NOT SET'); console.log(' RESEND_FROM_EMAIL:', process.env.RESEND_FROM_EMAIL || 'โ NOT SET'); console.log(' NEXTAUTH_URL:', process.env.NEXTAUTH_URL || 'โ NOT SET'); console.log(''); const toEmail = process.env.TEST_EMAIL_TO || process.env.SMTP_USER || process.env.RESEND_FROM_EMAIL; if (!toEmail) { console.error('โ Set TEST_EMAIL_TO or SMTP_USER in .env to run this test.'); process.exit(1); } if (smtpEnabled()) { console.log('๐ค Attempting SMTP test first...'); try { const transporter = nodemailer.createTransport({ host: process.env.SMTP_HOST, port: Number(process.env.SMTP_PORT || 465), secure: (process.env.SMTP_SECURE || 'true').toLowerCase() === 'true', auth: { user: process.env.SMTP_USER, pass: process.env.SMTP_PASS, }, }); const smtpFromEmail = process.env.SMTP_FROM_EMAIL || process.env.SMTP_USER!; const smtpFromName = process.env.SMTP_FROM_NAME; const smtpReplyTo = process.env.SMTP_REPLY_TO || smtpFromEmail; const smtpFrom = smtpFromName ? `${smtpFromName} <${smtpFromEmail}>` : smtpFromEmail; const info = await transporter.sendMail({ from: smtpFrom, to: toEmail, replyTo: smtpReplyTo, subject: 'SMTP test from PunimTag', text: 'SMTP test email from PunimTag viewer frontend.', }); console.log('โ SMTP test sent successfully'); console.log(' Message ID:', info.messageId); process.exit(0); } catch (smtpError: any) { console.error('โ ๏ธ SMTP test failed, will try Resend fallback.'); console.error(' SMTP error:', smtpError.message); } } else { console.log('โน๏ธ SMTP config not set, skipping SMTP test.'); } if (!process.env.RESEND_API_KEY || !process.env.RESEND_FROM_EMAIL) { console.error('โ Resend fallback not configured (RESEND_API_KEY/RESEND_FROM_EMAIL missing).'); process.exit(1); } const resendFrom = process.env.RESEND_FROM_EMAIL.trim().replace(/^["']|["']$/g, ''); console.log('๐ค Attempting Resend fallback test...'); try { const result = await resend.emails.send({ from: resendFrom, to: toEmail, subject: 'Resend fallback test from PunimTag', html: '
Resend fallback test email from PunimTag viewer frontend.
', }); if (result.error) { throw new Error(result.error.message || 'Unknown Resend API error'); } console.log('โ Resend fallback test sent successfully'); console.log(' Email ID:', result.data?.id); } catch (error: any) { console.error('โ Resend fallback failed:', error.message); process.exit(1); } } testEmailSending();