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

使用Nodemailer时TLS连接建立前套接字断开错误求助

解决OVH SMTP邮件发送的TLS连接错误

问题根源

你的错误是因为Nodemailer配置错误导致TLS握手失败,加上部分代码细节问题:

  1. service字段误用:ssl0.ovh.net是OVH的SMTP主机地址,不是Nodemailer预定义的服务名(比如'Outlook'),Nodemailer无法识别该值,导致连接配置混乱。
  2. TLS配置错误:tls选项里的键名错误(tls:'TLSv1.2'是无效配置),且指定了已被淘汰的SSLv3加密套件,OVH服务器不支持该套件,直接导致连接断开。
  3. 代码细节问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:25:41