使用Nodemailer时TLS连接建立前套接字断开错误求助
解决OVH SMTP邮件发送的TLS连接错误
问题根源
你的错误是因为Nodemailer配置错误导致TLS握手失败,加上部分代码细节问题:
service字段误用:ssl0.ovh.net是OVH的SMTP主机地址,不是Nodemailer预定义的服务名(比如'Outlook'),Nodemailer无法识别该值,导致连接配置混乱。- TLS配置错误:
tls选项里的键名错误(tls:'TLSv1.2'是无效配置),且指定了已被淘汰的SSLv3加密套件,OVH服务器不支持该套件,直接导致连接断开。 - 代码细节问题:
sendMail回调里引用了未定义的info变量,API调用未等待邮件发送Promise完成。
修复步骤
1. 修正Nodemailer Transport配置
把service换成host,并正确配置TLS参数:
offreEmail : function (brand,model,date,id,email){ return new Promise((resolve,reject)=>{ let readHTMLFile = function (path, callback) { fs.readFile(path, { encoding: 'utf-8' }, function (err, html) { if (err) { callback(err); reject(err); // 替换throw err为reject,避免未捕获异常 } else { callback(null, html); } }); }; // 修正Transport配置 let transporter = nodemailer.createTransport({ host: 'ssl0.ovh.net', // 替换service为host port : 587, secure: false, // 587端口使用STARTTLS,secure设为false auth: { user: process.env.MAILER_EMAIL, pass: process.env.MAILER_PASSWORD }, tls: { minVersion: 'TLSv1.2', // 正确指定最小TLS版本 // 移除SSLv3配置,OVH服务器不支持该加密套件 } }); readHTMLFile('./Controllers/email/beefree-ec9f8b73xv.html', function (err, html) { if (err) { console.log(err); reject(err); return; } var template = handlebars.compile(html); var replacements = { brand: brand, model: model, date : date, id : id }; var htmlToSend = template(replacements); var mailOptions = { from: process.env.MAILER_EMAIL, to: email, subject: 'Votre offre a été reçue avec succès', html: htmlToSend }; transporter.sendMail(mailOptions, (error, response) =>{ if (error){ console.log(error); resolve(false); } else { console.log('Email sent: ' + response.response); // 修正info为response resolve(true); } }); }); }) },
2. 修正API调用中的Promise处理
确保等待邮件发送完成后再响应(可选,但可避免邮件发送未完成就返回响应的情况):
offre .save() .then(async result => { // 添加async关键字 await mailer.offreEmail(result.brand.toUpperCase(), result.model.toUpperCase(), result.date, result._id, result.email); res.status(200).json(result); photo_name = []; }) .catch(error => { res.status(400).json(error.message); photo_name = []; });
3. 额外优化建议
用util.promisify把fs.readFile转换成Promise风格代码,简化回调嵌套:
const { promisify } = require('util'); const readFile = promisify(fs.readFile); // 替换原有的readHTMLFile逻辑 const html = await readFile('./Controllers/email/beefree-ec9f8b73xv.html', 'utf-8');
验证要点
- 确认
process.env.MAILER_EMAIL和process.env.MAILER_PASSWORD是OVH邮箱的正确账号密码 - 检查服务器防火墙是否允许出站587端口的连接
- 可用telnet测试连接:
telnet ssl0.ovh.net 587,验证是否能正常建立连接
内容的提问来源于stack exchange,提问作者gary
相关产品推荐
相关产品推荐

