You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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后台完成验证,避免被拦截
  • 单独测试邮件发送:写一个简单的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:22:08