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
相关产品推荐
相关产品推荐

