bai19940321 2024-02-15 01:27 采纳率: 9.5%
浏览 3
已结题

VUE3发送邮件问题

大锅们,帮忙看看,本地测试发送邮件带图片也没有问题,上传到linux服务器后发送邮件没有问题,上传图片没有问题,但发送的邮件如果带有图片,就有问题,报502错误,问题来自:upload.array('images')。我应该怎么解决。


const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, './uploads/');
  },
  filename: function (req, file, cb) {
    cb(null, file.originalname);
  },
});
const upload = multer({ storage: storage });
 
app.post('/feedback', upload.array('images'), (req, res) => {
let transporter = nodemailer.createTransport({
  host: 'smtp.163.com',
  port: 465,
  secureConnection: true,
  auth: {
    user: 'xxsderrs@163.com',
    pass: 'RMXTOKUENXOWYJLA',
  }
});
let mailOptions = {
  from: 'xxsderrs@163.com',
  to: 'lfdsfwee@163.com',
  subject: 'Hello',
  html: `
      <p>用户反馈:${req.body.text}</p>
      <p>联系邮箱:${req.body.email}</p>
      <p>上传的图片:</p> `,
       attachments: req.files.map((file) => ({
             filename: file.originalname,
             path: file.path,
           })), 
  };
 
  transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
      res.json({
        code: 500,
        message: '发送失败',
      });
    } else {
      res.json({
        code: 200,
        message: '发送成功',
      });
    } 
  });
});


  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-02-15 01:28
    关注

    引自免费微信小程序:皆我百晓生

    根据您的描述,您在本地测试环境下通过Vue3和Node.js服务端成功发送了带有图片的邮件。然而,在将此服务部署到Linux服务器后,当尝试发送带有图片附件的邮件时,会返回502错误。

    502 Bad Gateway 错误通常表示您的应用程序(即Node.js服务器)作为网关或代理服务器时,从上游服务器(此处是SMTP服务器163.com)收到了无效响应。这可能是由于网络问题、SMTP服务器配置不正确,或者文件路径在部署到Linux服务器后不再有效导致的。

    针对您的情况,请按照以下步骤进行排查:

    1. 检查服务器上的文件权限: 确保上传的图片文件具有正确的读取权限。在Linux中,您可以使用chmod命令设置文件夹及其内容的权限,例如:

      chmod -R 755 ./uploads/
      
    2. 验证图片文件路径: 确认上传的图片是否确实存储到了Linux服务器上指定的位置,并且在发送邮件时能够访问到这个路径。可以尝试打印出file.path来查看实际使用的路径是否正确。

    3. 网络连接与SMTP服务器配置: 请确认服务器到SMTP服务器(smtp.163.com)的网络连接通畅无阻,以及SMTP端口465是否被防火墙允许。另外,有些SMTP服务器可能需要特定的安全设置,如SSL/TLS加密,您已设置了secureConnection: true,但也可以尝试明确指定transporttls

      let transporter = nodemailer.createTransport({
        host: 'smtp.163.com',
        port: 465,
        secure: true, // 使用SSL加密,默认情况下,Nodemailer会在465端口自动启用SSL
        auth: {
          user: 'xxsderrs@163.com',
          pass: 'RMXTOKUENXOWYJLA',
        }
      });
      
    4. 日志输出和调试: 增加更多的日志输出,以便了解具体的错误信息。在transporter.sendMail回调函数内部,添加对错误对象的详细输出:

      transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
          console.error('Error occurred while sending mail:', error.message);
          res.json({
            code: 500,
            message: '发送失败',
          });
        } else {
          console.log('Message sent successfully: ', info.response);
          res.json({
            code: 200,
            message: '发送成功',
          });
        } 
      });
      

    如果以上步骤都进行了检查和调整,问题仍未解决,请考虑以下额外的可能性:

    • 检查您的邮箱账户设置,确认是否允许第三方应用发送邮件。
    • 确认您用于发送邮件的API密钥或授权码是否正确有效,某些邮箱服务商要求使用授权码而非密码。
    • 如果您的邮件发送频率过高,可能会触发反垃圾邮件策略,导致发送失败。

    最后,请务必关注并遵循网易163邮箱或其他SMTP服务提供商的API调用限制及安全策略。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月15日
  • 创建了问题 2月15日