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

Express.js+Postman报错:getaddrinfo ENOTFOUND smpt.mailtrap.io 求解决

密码重置邮件发送失败问题排查

问题场景

我正在实现密码重置功能:生成重置令牌后,向用户发送包含令牌链接的邮件。相关代码、请求信息及错误响应如下:

相关代码

1. authController 中的 forgotPassword 函数

//forgot password  => /api/v1/password/forgot

exports.forgotPassword = catchAsynErrors(async(req, res, next) => {
    
    const user = await User.findOne({ email: req.body.email });

    if(!user){
        return next(new ErrorHandler('User not found with this email', 404));
    }

    //get reset token
    const resetToken = user.getResetPasswordToken();
    await user.save({validateBeforeSave: false});

    // create reset password url
    const resetUrl = `${req.protocol}://${req.get('host')}/api/v1/password/reset/${resetToken}`;

    const message = `Your password reset token:\n\n${resetUrl}\n\n If you have not requested this email, please ignore it.`

    try {
        await sendEmail({
            email: user.email,
            subject: 'ShopIt password recovery',
            message 
        }) 

        res.status(200).json({
            success: true,
            message: `Email sent to: ${user.email}`
        })

    } catch (error) {
        user.resetPasswordToken = undefined;
        user.resetPasswordExpire = undefined;
        
        await user.save({validateBeforeSave: false});
        return next(new ErrorHandler(error.message, 500))
    }
})

2. User 模型中的 getResetPasswordToken 方法

// generate password reset token
userSchema.methods.getResetPasswordToken = function() {
    //generate token
    const resetToken = crypto.randomBytes(20).toString('hex');

    //hash and set to resetPasswordToken
    this.resetPasswordToken = crypto.createHash('sha256').update(resetToken).digest('hex')

    // set token expiration date
    this.resetPasswordExpire = Date.now() + 30 * 60 * 1000
    return resetToken

}

请求信息

通过Postman向 http://localhost:4000/api/v1/password/forgot 发送POST请求,请求体:

{
"email": "example@email.com"
}

错误响应

{
"success": false,
 "error": {
    "statusCode": 500
},
"errMessage": "getaddrinfo ENOTFOUND smpt.mailtrap.io",
"stack": "Error: getaddrinfo ENOTFOUND smpt.mailtrap.io\n    at D:\\pruebas de programación\\Proyectazo\\backend\\controllers\\authController.js:93:21\n    at processTicksAndRejections (node:internal/process/task_queues:96:5)"

}

已尝试操作

  • 手动设置IPv4地址(如192.168.1.45)及DNS服务器为1.1.1.1、1.0.0.1,网络正常但错误依旧,已恢复DHCP配置
  • 尝试发送邮件至真实或虚假邮箱,结果无差别

解决思路

  • 优先修正SMTP域名拼写:错误信息中的smpt.mailtrap.io存在拼写错误,正确的Mailtrap SMTP服务器地址应为smtp.mailtrap.io(注意是smtp而非smpt),检查sendEmail工具类的配置域名是否写错
  • 验证Mailtrap配置完整性:确认SMTP端口、用户名、密码是否与Mailtrap控制台提供的信息完全一致,避免凭证或端口错误导致连接失败
  • 测试网络连通性:在终端执行ping smtp.mailtrap.io或telnet smtp.mailtrap.io 2525(对应Mailtrap常用端口),确认本地网络能正常访问该服务器
  • 排查防火墙/代理拦截:临时关闭本地防火墙,或配置代理规则允许访问Mailtrap的SMTP端口,排除网络拦截问题
  • 极简脚本测试:编写独立的邮件发送测试脚本,直接调用sendEmail发送邮件,排除业务代码逻辑干扰,验证核心邮件发送功能是否正常

内容的提问来源于stack exchange,提问作者Tort

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:05:26