diff --git a/apps/backend/.env b/apps/backend/.env index e14d869..d18f69a 100644 --- a/apps/backend/.env +++ b/apps/backend/.env @@ -11,4 +11,6 @@ SMTP_USER=6af2bf58132d12 SMTP_PASS=1253b2fe0fc47a SMTP_FROM=Playzer BETTER_AUTH_SECRET=R1MfeeeekXSNdE65hOhhr0Mt0KLwczYr -BETTER_AUTH_URL=http://localhost:3000 \ No newline at end of file +BETTER_AUTH_URL=http://localhost:3000 +MAILTRAP_API_TOKEN=2c040e2e577dc48909d3206dd2d47fc6 +MAIL_SANDBOX=true \ No newline at end of file diff --git a/apps/backend/.gitignore b/apps/backend/.gitignore index 506e4c3..5697a92 100644 --- a/apps/backend/.gitignore +++ b/apps/backend/.gitignore @@ -1,2 +1,3 @@ # deps node_modules/ +prisma.config.prod.ts \ No newline at end of file diff --git a/apps/backend/package.json b/apps/backend/package.json index c152452..3be8e97 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -21,6 +21,7 @@ "better-auth": "^1.6.4", "dotenv": "^17.4.1", "hono": "4.12.10", + "mailtrap": "^4.5.1", "nodemailer": "^8.0.5", "pg": "^8.20.0", "pino": "10.3.1", diff --git a/apps/backend/src/lib/mailer.ts b/apps/backend/src/lib/mailer.ts index d10d38f..50434b6 100644 --- a/apps/backend/src/lib/mailer.ts +++ b/apps/backend/src/lib/mailer.ts @@ -1,29 +1,24 @@ import nodemailer from 'nodemailer'; +import { MailtrapTransport } from 'mailtrap'; + +const TOKEN = Bun.env.MAILTRAP_API_TOKEN; let cachedTransporter: ReturnType | null = null; function getTransporter() { if (cachedTransporter) return cachedTransporter; - const smtpHost = Bun.env.SMTP_HOST; - const smtpPort = Number(Bun.env.SMTP_PORT ?? 587); - const smtpUser = Bun.env.SMTP_USER; - const smtpPass = Bun.env.SMTP_PASS; - - if (!smtpHost || !smtpUser || !smtpPass) { - throw new Error('Missing SMTP env vars. Set SMTP_HOST, SMTP_PORT, SMTP_USER and SMTP_PASS.'); + if (!TOKEN) { + throw new Error('Missing MAILTRAP_API_TOKEN env var.'); } - cachedTransporter = nodemailer.createTransport({ - host: smtpHost, - port: smtpPort, - secure: smtpPort === 465, - auth: { - user: smtpUser, - pass: smtpPass, - }, - }); - + cachedTransporter = nodemailer.createTransport( + MailtrapTransport({ + token: TOKEN, + sandbox: Bun.env.MAIL_SANDBOX === 'true', + testInboxId: 1114587 + }) + ); return cachedTransporter; } diff --git a/bun.lock b/bun.lock index 0f20b6b..5686ad0 100644 --- a/bun.lock +++ b/bun.lock @@ -24,6 +24,7 @@ "better-auth": "^1.6.4", "dotenv": "^17.4.1", "hono": "4.12.10", + "mailtrap": "^4.5.1", "nodemailer": "^8.0.5", "pg": "^8.20.0", "pino": "10.3.1", @@ -1048,6 +1049,8 @@ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + "mailtrap": ["mailtrap@4.5.1", "", { "dependencies": { "axios": ">=0.27", "qs": "^6.15.0" }, "peerDependencies": { "@types/nodemailer": "^6.4.9", "nodemailer": "^7.0.7" }, "optionalPeers": ["@types/nodemailer", "nodemailer"] }, "sha512-ABMvAk41q9iteM3Iga9ZaNrR/3RppGEPcYihihv6qnwvmFcE16mKcXSbuIRl3V5tRR5ZRQ4+BuUeZO2Y9xuxRA=="], + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="],