使用Nodemailer和本地服务器时遭遇Error 405请求方法不允许问题
解决POST请求405 Method Not Allowed错误
核心问题:Next.js API路由写法不匹配
你的api/sendEmail/route.js用的是Pages Router的API路由写法(默认导出handler函数并判断req.method),但如果你的项目是Next.js 13+的App Router架构,这种写法不会被识别,导致服务器无法处理POST请求,返回405错误。
修复步骤
1. 修正API路由文件(App Router写法)
把api/sendEmail/route.js改成App Router要求的格式,单独导出POST函数:
import nodemailer from 'nodemailer'; export async function POST(req) { // 敏感环境变量不要加NEXT_PUBLIC_前缀,避免暴露给客户端 const username = process.env.BURNER_USERNAME; const password = process.env.BURNER_PASSWORD; const myEmail = process.env.PERSONAL_EMAIL; // 解析请求体(App Router的req需要await读取) const { name, email, message } = await req.json(); // 创建Nodemailer transporter(不需要第一个"SMTP"参数) const transporter = nodemailer.createTransport({ host: "sandbox.smtp.mailtrap.io", port: 2525, auth: { user: username, pass: password, }, }); try { // 补充完整邮件发送逻辑 await transporter.sendMail({ from: email, to: myEmail, subject: `新订单:${name}`, text: message, }); return new Response(JSON.stringify({ success: true }), { status: 200 }); } catch (err) { return new Response(JSON.stringify({ success: false, error: err.message }), { status: 500 }); } }
2. 完善前端请求的Headers
在OrderForm.js的fetch请求中添加Content-Type头,确保服务器能正确解析JSON格式的请求体:
const res = await fetch("/api/sendEmail", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(order), }); if (res.ok) { router.refresh(); router.push("/custom-order/order-submitted"); } else { const errData = await res.json(); console.error("提交失败:", errData.error || res.statusText); }
3. 修正环境变量(重要)
你当前的邮箱密码等敏感信息用了NEXT_PUBLIC_前缀,会被打包到客户端代码中,存在安全风险。去掉前缀,只保留BURNER_USERNAME、BURNER_PASSWORD、PERSONAL_EMAIL,这些变量只会在服务器端生效。
额外检查点
- 确认你的项目架构:如果是Pages Router,API文件应该放在
pages/api/sendEmail.js,而不是app/api/sendEmail/route.js;如果是App Router,确保app目录存在且路由文件路径正确。 - 重启开发服务器,确保环境变量和代码修改生效。
内容的提问来源于stack exchange,提问作者tinyluc
相关产品推荐
相关产品推荐

