为什么我的附件没有在Node.js中发送?

问题描述

尝试从电子邮件表单发送图像附件时,我仍然遇到问题。我要发生的事情是用户提交一些信息,然后他们通过客户端上传图像,然后当他们单击“提交”时,该图像将作为电子邮件发送给我。我无法使它正常工作,我也不知道为什么。我现在已经到处寻找了几天的时间,观看教程,阅读文档,玩转游戏,阅读答案并试图弄清楚这一点,但是显然我不理解如何实现代码以使附件与电子邮件一起显示并具有图像。当我在电子邮件中打开它时。有人能帮我吗?这是我的代码,谢谢:

const express = require("express");
const fileUpload = require("express-fileupload");
const nodemailer = require("nodemailer");
const app = express();
const creds = require("./config");
const cors = require("cors");

app.use(express.urlencoded({ extended: false }));
app.use(express.json());
app.use(fileUpload());
app.use(cors());

app.post("/api/form",(req,res) => {
  nodemailer.createTestAccount((err,account) => {
    const htmlEmail = `
      <h3>Contact Details</h3>
      <ul>
        <li>
          Name: ${req.body.name}
        </li>
        <li>
          Email: ${req.body.email}
        </li>     
      </ul>
       <h3>Message</h3>
      <p>${req.body.message}</p>
    `;

    let transport = nodemailer.createTransport({
      host: "some.service.email",port: ***,auth: {
        user: creds.USER,pass: creds.PASS,},});

    let mailOptions = {
      from: "test@test.com",to: "receiveTest@test.com",replyTo: "test@test.com",subject: "Test Message",text: req.body.message,html: htmlEmail,attachments: [ //The problem area. This won't appear in a sent email.
        {
          filename: "AdImage.jpg",content: req.body.file,contentType: "image/jpg",],};

    transport.sendMail(mailOptions,(err,info) => {
      if (err) {
        res.json({
          status: "fail",});
      } else {
        res.json({
          status: "success",});
      }
    });
  });
});

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

app.listen(PORT,() => {
  console.log(`Server listening on port ${PORT}`);
});

编辑: 所以我对代码进行了一些更改,如下所示:

const express = require("express");
const bodyParser = require("body-parser");
const fileUpload = require("express-fileupload");
const nodemailer = require("nodemailer");
const app = express();
const creds = require("./config");
const cors = require("cors");
const fs = require("fs");

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
app.use(fileUpload());
app.use(cors());

app.post("/api/form",account) => {
    console.log(req.files.file);
    const htmlEmail = `
      <h3>Contact Details</h3>
      <ul>
        <li>
          Name: ${req.body.name}
        </li>
        <li>
          Email: ${req.body.email}
        </li>     
      </ul>
       <h3>Message</h3>
      <p>${req.body.message}</p>
    `;

    let transport = nodemailer.createTransport({
      host: "some.service.email",attachments: [
        {
          filename: req.files.file.name,content: new Buffer.from(req.files.file.name,"utf-8"),() => {
  console.log(`Server listening on port ${PORT}`);
});

因此,现在我的电子邮件正在获取附件,但附件为空,如果我尝试下载它,则返回服务器错误。日志显示文件。它显示了这一点:

name: 'myFile.jpg',[0]   data: <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01 00 01 00 00 ff db 00 43 00 02 01 01 01 01 01 02 01 01 01 02 02 02 02 02 04 03 02 02 02 02 05 04 04 03 ... 992910 more bytes>,[0]   size: 992960,[0]   encoding: '7bit',[0]   tempFilePath: '',[0]   truncated: false,[0]   mimetype: 'image/jpeg',[0]   md5: 'f383f6170d8a66f90be655690ee3f51e',[0]   mv: [Function: mv]

我不明白为什么我仍然看不到附件中的实际图像。我还想念什么?谢谢。

解决方法

对于表达的后期请求,您必须使用正文解析器,这与get请求不同。这是npm中的一个:https://www.npmjs.com/package/body-parser

向下滚动npm页面以找到一些使用示例。