Javascript 为什么我的附件没有发送到Node.js?

Javascript 为什么我的附件没有发送到Node.js?,javascript,node.js,reactjs,email-attachments,Javascript,Node.js,Reactjs,Email Attachments,我在尝试从电子邮件表单发送图像附件时仍然遇到问题。我希望用户提交一些信息,然后他们通过客户端上传一个图像,然后当他们点击提交时,图像会以电子邮件的形式发送给我。我一直没能让这个工作,我不知道为什么。我已经到处找了好几天了,看教程,阅读文档,玩游戏,阅读答案,并试图弄明白这一点,但很明显,我不明白如何实现代码,使附件与电子邮件一起出现,并在电子邮件中打开时在其中包含图像。有人能帮我吗?这是我的代码,谢谢你: const express = require("express");

我在尝试从电子邮件表单发送图像附件时仍然遇到问题。我希望用户提交一些信息,然后他们通过客户端上传一个图像,然后当他们点击提交时,图像会以电子邮件的形式发送给我。我一直没能让这个工作,我不知道为什么。我已经到处找了好几天了,看教程,阅读文档,玩游戏,阅读答案,并试图弄明白这一点,但很明显,我不明白如何实现代码,使附件与电子邮件一起出现,并在电子邮件中打开时在其中包含图像。有人能帮我吗?这是我的代码,谢谢你:

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 fileUpload=require(“快速文件上传”);
const nodemailer=require(“nodemailer”);
常量app=express();
const creds=require(“./config”);
const cors=要求(“cors”);
use(express.urlencoded({extended:false}));
使用(express.json());
app.use(fileUpload());
应用程序使用(cors());
app.post(“/api/form)”,(请求、回复)=>{
nodeEmailer.createTestAccount((错误,帐户)=>{
常量htmlEmail=`
联系方式
  • 名称:${req.body.Name}
  • 电子邮件:${req.body.Email}
消息 ${req.body.message}

`; 让transport=nodeEmailer.createTransport({ 主持人:“some.service.email”, 港口:**, 认证:{ 用户:creds.user, 通行证:信用证,通行证, }, }); 让邮件选项={ 来自:test@test.com", 至:receiveTest@test.com", 答复:“test@test.com", 主题:“测试消息”, 文本:req.body.message, html:htmlEmail, 附件:[//问题区域。这不会出现在已发送的电子邮件中。 { 文件名:“AdImage.jpg”, 内容:req.body.file, contentType:“图像/jpg”, }, ], }; transport.sendMail(邮件选项,(错误,信息)=>{ 如果(错误){ res.json({ 状态:“失败”, }); }否则{ res.json({ 状态:“成功”, }); } }); }); }); const PORT=process.env.PORT | | 3001; 应用程序侦听(端口,()=>{ log(`Server监听端口${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", (req, res) => {
  nodemailer.createTestAccount((err, 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",
      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: [
        {
          filename: req.files.file.name,
          content: new Buffer.from(req.files.file.name, "utf-8"),
        },
      ],
    };

    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(“快速文件上传”);
const nodemailer=require(“nodemailer”);
常量app=express();
const creds=require(“./config”);
const cors=要求(“cors”);
常数fs=要求(“fs”);
use(bodyParser.json());
use(bodyParser.urlencoded({extended:false}));
use(express.urlencoded({extended:false}));
使用(express.json());
app.use(fileUpload());
应用程序使用(cors());
app.post(“/api/form)”,(请求、回复)=>{
nodeEmailer.createTestAccount((错误,帐户)=>{
log(req.files.file);
常量htmlEmail=`
联系方式
  • 名称:${req.body.Name}
  • 电子邮件:${req.body.Email}
消息 ${req.body.message}

`; 让transport=nodeEmailer.createTransport({ 主持人:“some.service.email”, 港口:**, 认证:{ 用户:creds.user, 通行证:信用证,通行证, }, }); 让邮件选项={ 来自:test@test.com", 至:receiveTest@test.com", 答复:“test@test.com", 主题:“测试消息”, 文本:req.body.message, html:htmlEmail, 附件:[ { 文件名:req.files.file.name, 内容:新缓冲区.from(req.files.file.name,“utf-8”), }, ], }; transport.sendMail(邮件选项,(错误,信息)=>{ 如果(错误){ res.json({ 状态:“失败”, }); }否则{ res.json({ 状态:“成功”, }); } }); }); }); const PORT=process.env.PORT | | 3001; 应用程序侦听(端口,()=>{ log(`Server监听端口${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]
name:'myFile.jpg',
[0]数据:,
[0]尺寸:992960,
[0]编码:“7bit”,
[0]临时文件路径:“”,
[0]截断:false,
[0]mimetype:'image/jpeg',
[0]md5:'f383f6170d8a66f90be655690ee3f51e',
[0]mv:[功能:mv]

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

对于要表达的post请求,您必须使用主体解析器,这与get请求不同。这里有一个来自npm:


向下滚动npm页面,找到一些关于如何使用它的示例。

您正在使用内容。根据文档
内容
所需的缓冲文件。你的
req.body.file
是缓冲区类型吗?我不知道。它是一个图像文件。如何知道图像文件的内容类型,特别是jpeg?NodeEmailer文档对此并不十分清楚。@ShubhamVerma Ok,所以我在服务器端执行了
console.log
,服务器正在读取该文件。我假设它是一个缓冲区,但我不知道。日志显示:
name:'myfile.jpg',[0]数据:,[0]大小:992960,[0]编码:'7bit',[0]tempFilePath:'',[0]截断:false,[0]mimetype:'image/jpeg',[0]md5:'f383f6170d8a66f90be655690ee3f51e',[0]mv因此一切看起来都是正确的,但我不确定如何设置缓冲区实例。有什么建议吗?我试着使用了几个身体分析器,比如“巴士男孩”和“身体分析器”,但我无法让它们正常工作。能否提供一个用于发送实际图像的主体解析器示例?我所能找到的例子中没有一个是像jpgs这样的图像的工作例子,只有文本fi