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

Nodemailer报connect ECONNREFUSED错误,请求排查解决方法

排查Nodemailer+Express邮件功能的ECONNREFUSED 127.0.0.1:465错误

在制作个人作品集时,用nodemailer、express和nodemon搭建邮件功能,配置客户端与服务端代码后出现connect ECONNREFUSED 127.0.0.1:465错误,调整端口及secure参数仍未解决,附上相关代码与错误信息,请求协助排查。

客户端代码

const contactForm = document.querySelector('.cnt-form');
let message = document.getElementById('message');
let name = document.getElementById('name');
let email = document.getElementById('email');
let subject = document.getElementById('subject');
let phone = document.getElementById('phone');
contactForm.addEventListener('submit', (e)=>{
    e.preventDefault();
    let formData = {
        message: message.value,
        name: name.value,
        email: email.value,
        subject: subject.value,
        phone: phone.value
    }
    let xhr = new XMLHttpRequest();
    xhr.open('POST', '/');
    xhr.setRequestHeader('content-type', 'application/json');
    xhr.onload = function(){
        console.log(xhr.responseText);
        if(xhr.responseText == 'success'){
            alert('Email Sent Successfully');
            message.value = '';
            name.value = '';
            email.value = '';
            subject.value = '';
            phone.value = '';
        }else{
            alert('Something went wrong!');
        }
    }
    xhr.send(JSON.stringify(formData));
});

服务端代码

const express = require('express');
const nodemailer = require('nodemailer');
const app = express();


const PORT = process.env.PORT || 5000;

app.use(express.static('public'));
app.use(express.json())
app.get('/', (req, res) => {
    res.sendFile(__dirname + '/public/index.html');
})
app.post('/', (req, res) => {
    console.log(req.body);
    const transporter = nodemailer.createTransport({
        service: 'smpt.gmail.com',
        port: 465,
        secure: true,
        auth: {
            user: 'xxxxxxxx',
            pass: 'xxxxxxxx'
            
        }
    })
    const mailOptions = {
        from: req.body.email,
        to: 'xxxx@mail.com',
        subject: `Message from ${req.body.email}:  ${req.body.subject}`,
        text: req.body.message,
        contact: req.body.phone
    }
    transporter.sendMail(mailOptions, (error, info)=>{
        if(error){
            console.log(error);
            res.send('error');
        }else{
            console.log('Email sent: ' + info.response);
            res.send('success');
        }
    })
});
app.listen(PORT, ()=>{
    console.log(`server running on port ${PORT}`);
});

错误信息

Error: connect ECONNREFUSED 127.0.0.1:465
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1494:16) {
  errno: -4078,
  code: 'ESOCKET',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 465,
  command: 'CONN'
}

排查与修复方案

  • 修正SMTP服务配置:服务端代码里service字段拼写错误,写成了smpt.gmail.com,正确写法是用预设服务名'Gmail',或者直接用host字段指定正确的SMTP域名smtp.gmail.com。错误的服务名会导致Nodemailer无法找到对应SMTP服务器,转而尝试连接本地127.0.0.1,引发拒绝连接错误。修正后的传输配置示例:
// 方式一:用预设服务名
const transporter = nodemailer.createTransport({
    service: 'Gmail',
    secure: true,
    auth: {
        user: '你的邮箱地址',
        pass: '你的授权密码'
    }
})

// 方式二:明确指定host和端口
const transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        user: '你的邮箱地址',
        pass: '你的授权密码'
    }
})
  • Gmail认证设置:
    • 如果开启了2步验证,必须使用应用专用密码替代普通登录密码;
    • 未开启2步验证的话,需要开启邮箱的低安全性应用访问(不推荐,建议优先用应用专用密码);
    • 确保user和pass填写正确,无多余字符。
  • 修正邮件内容字段:mailOptions里的contact不是Nodemailer的标准字段,不会被识别,要把电话信息整合到text里,比如:
text: `发送人:${req.body.name}\n邮箱:${req.body.email}\n电话:${req.body.phone}\n主题:${req.body.subject}\n消息:${req.body.message}`

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:23:13