Node.js отправляет электронное письмо с вложением изображения с помощью nodemailer

Я пытаюсь отправить электронное письмо из почтового запроса. Я использую Express и nodemailer. Меня смущает «fs». Мое электронное письмо отправляется, но изображение не включено в качестве вложения. Я проверил документы, но все они, похоже, отправляют статические файлы, а не файлы, которые передаются из запроса формы.

var smtpTransport = nodemailer.createTransport("SMTP",{
  service: "Gmail",
  auth: {
    user: "[email protected]",
    pass: "password_for_gmail_address"
  }
});

app.get('/', function(req, res){
    res.send('<form method="post" enctype="multipart/form-data">'
      + '<p>Post Title: <input type="text" name="title"/></p>'
      + '<p>Post Content: <input type="text" name="content"/></p>'
      + '<p>Image: <input type="file" name="image"/></p>'
      + '<p><input type="submit" value="Upload"/></p>'
      + '</form>');
  })

app.post('/', function(req, res, next){
  var mailOptions = {
    from: "[email protected]", // sender address
    to: "[email protected]", // list of receivers
    subject: req.body.title, // Subject line
    text: req.body.content, // plaintext body
    attachments:[
      {
        fileName: req.body.title,
        streamSource: req.files.image
      }
    ]
  }

  smtpTransport.sendMail(mailOptions, function(error, response){
    if(error){
      console.log(error);
      res.send('Failed');
    }else{
      console.log("Message sent: " + response.message);
      res.send('Worked');
    }
  });   
});

person PaulWoodIII    schedule 15.10.2012    source источник


Ответы (3)


Предполагая, что req.files.image является объектом File, а не читаемым потоком, вам необходимо создать поток чтения для него, который вы можете использовать во вложении:

streamSource: fs.createReadStream(req.files.image.path)
person JohnnyHK    schedule 15.10.2012
comment
Я сделал так, чтобы объект вложений выглядел так: «вложения: [{fileName: req.body.title+.jpg, streamSource: fs.createReadStream(req.files.image.path) }]» - person PaulWoodIII; 15.10.2012

это сработало для меня:

attachments: [{   // stream as an attachment
            filename: 'image.jpg',
            content: fs.createReadStream('/complete-path/image.jpg')
        }]
person BonnieMilian    schedule 22.05.2017

Вместо streamSource попробуйте использовать contents

contents: new Buffer(req.files.image, 'base64')
person vinayr    schedule 15.10.2012
comment
Это получило его как вложение, но мой почтовый клиент не обработал его как изображение. Я думаю, что это может сработать, но не так просто скопировать и вставить, как ответ JohnnyHK - спасибо! - person PaulWoodIII; 15.10.2012