Next Auth(Auth.js)邮箱验证连接超时问题求助
Next Auth邮箱认证SMTP连接超时问题排查
问题现象
访问/api/auth/signin能正常显示登录表单,但输入邮箱提交后,页面加载40秒后连接中断,终端报SMTP连接超时错误。
当前配置
[...nextauth.js] 文件
import NextAuth from "next-auth"; import Email from "next-auth/providers/email"; import { PrismaAdapter } from "@auth/prisma-adapter"; import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); export default NextAuth({ adapter: PrismaAdapter(prisma), providers: [ Email({ server: { host: process.env.SMTP_HOST, port: Number(process.env.SMTP_PORT), auth: { user: process.env.SMTP_USER, pass: process.env.SMTP_PASSWORD, }, }, from: process.env.EMAIL_FROM, }), ], debug: true, });
.env 文件
DATABASE_URL="mysql://admin:admin@localhost:3306/<db_name>" SMTP_USER=apikey SMTP_PASSWORD="<My sendgrind API key>" SMTP_HOST=smtp.sendgrid.net SMTP_PORT=587 EMAIL_FROM="<An email address>"
错误日志
[next-auth][debug][adapter_getUserByEmail] { args: [ '<REDACTED>' ] } [next-auth][debug][adapter_createVerificationToken] { args: [ { identifier: '<REDACTED>', token: 'e9f23bcd33dc48c337bcd76b839919827d721181862aae6739e1ef5524e62720', expires: 2023-09-08T05:58:25.407Z } ] } [next-auth][error][SIGNIN_EMAIL_ERROR] https://next-auth.js.org/errors#signin_email_error Connection timeout { error: { message: 'Connection timeout', stack: 'Error: Connection timeout\n' + ' at SMTPConnection._formatError (/workspace/<REDACTED>/<REDACTED>/node_modules/nodemailer/lib/smtp-connection/index.js:790:19)\n' + ' at SMTPConnection._onError (/workspace/<REDACTED>/<REDACTED>/node_modules/nodemailer/lib/smtp-connection/index.js:776:20)\n' + ' at Timeout.<anonymous> (/workspace/<REDACTED>/<REDACTED>/node_modules/nodemailer/lib/smtp-connection/index.js:235:22)\n' + ' at listOnTimeout (node:internal/timers:569:17)\n' + ' at process.processTimers (node:internal/timers:512:7)', name: 'Error' }, providerId: 'email', message: 'Connection timeout' }
排查步骤
- 测试网络连通性:在服务器上执行
nc -zv smtp.sendgrid.net 587或telnet smtp.sendgrid.net 587,确认能正常连接到SendGrid的SMTP端口。如果不通,检查服务器防火墙、安全组是否放行587端口的出站请求,或者是否有网络代理限制。 - 验证SendGrid API密钥:确认SMTP_PASSWORD里的API密钥是完整且有效的,拥有发送邮件的权限,没有被禁用或过期。可以登录SendGrid后台查看密钥状态。
- 检查.env配置细节:
- 确保SMTP_USER确实是
apikey(SendGrid的SMTP用户名固定为这个) - SMTP_PASSWORD不要包含多余的空格或转义字符,尝试去掉.env里密码的引号再测试
- EMAIL_FROM的邮箱地址需要在SendGrid后台完成验证,避免被拦截
- 确保SMTP_USER确实是
- 单独测试邮件发送:写一个简单的nodemailer测试脚本,排除Next Auth的影响:
const nodemailer = require("nodemailer"); async function testEmail() { let transporter = nodemailer.createTransport({ host: "smtp.sendgrid.net", port: 587, auth: { user: "apikey", pass: "<你的SendGrid API密钥>", }, }); let info = await transporter.sendMail({ from: "<你的发件邮箱>", to: "<测试接收邮箱>", subject: "测试邮件", text: "测试内容", }); console.log("邮件发送成功: %s", info.messageId); } testEmail().catch(console.error); - 检查版本兼容性:确认
@auth/prisma-adapter和Next Auth(Auth.js)的版本匹配,避免版本不兼容导致的隐性问题。
内容的提问来源于stack exchange,提问作者Edgar Derby
相关产品推荐
相关产品推荐

