使用Next.js 13.4搭配NodeMailer时出现ESOCKET连接错误
邮件发送失败:ESOCKET连接错误(Next.js 13.4 + Nodemailer)
错误信息
{"message":"Error","error":{"errno":-4039,"code":"ESOCKET","syscall":"connect","address":"40.99.34.150","port":587,"command":"CONN"}}
我的API路由代码(Next.js 13.4)
export async function GET(request: NextRequest) { const transporter = nodemailer.createTransport({ service: "gmail", auth: { user: "<my-email>", pass: "<valid-password-of-the-above-email>", }, }); const data = { from: "<my-email>", to: "<other-email>", text: "What", html: "<html><body>hello</body></html>", subject: "hello", }; try { await transporter.sendMail(data); return NextResponse.json({ message: "OK" }, { status: 200 }); } catch (error) { return NextResponse.json({ message: "Error", error }, { status: 500 }); } }
现状说明
已尝试过相关问题的解决方案,但未解决问题,需要可行的修复方案或支持TypeScript + Next.js的邮件工具替代方案。
解决方案建议
1. 排查网络连接问题
ESOCKET错误核心是无法连接到Gmail的SMTP服务器(40.99.34.150:587),先确认:
- 本地/部署环境的防火墙、代理是否阻止了出站SMTP连接(587端口)
- 用
telnet 40.99.34.150 587或curl telnet://40.99.34.150:587测试连通性
2. 修正Gmail认证配置
Gmail目前不再支持直接使用账号密码进行SMTP认证,需调整为以下方式之一:
- 启用2FA并创建App密码:开启谷歌账号两步验证后,在账号安全设置中生成专门的App密码,替换代码中的
pass字段 - 使用OAuth2认证:配置Nodemailer的OAuth2客户端,适合更安全的生产环境
3. 调整Nodemailer配置
手动指定SMTP参数,替代service: "gmail"的自动配置,避免解析错误:
const transporter = nodemailer.createTransport({ host: "smtp.gmail.com", port: 587, secure: false, // 465端口用true,587用false auth: { user: "<my-email>", pass: "<your-app-password>", }, });
4. 部署环境检查
如果是在Vercel等平台部署,确认平台允许出站SMTP连接(Vercel默认支持,但部分小众平台可能有限制)
替代邮件工具推荐
如果Nodemailer配置仍有问题,可尝试以下原生支持TypeScript和Next.js的工具:
- Resend:API-first的邮件服务,无需配置SMTP,提供Next.js专属SDK,使用简单,适合现代前端项目
- Postmark:高可靠性的事务邮件服务,有官方TypeScript SDK,文档完善
- SendGrid:功能丰富的邮件服务,Twilio旗下,提供完整的TypeScript支持,适合批量邮件和事务邮件场景
内容的提问来源于stack exchange,提问作者krishnaacharyaa
相关产品推荐
相关产品推荐

