Тело Nodemailer с изображением qrcode

#node.js #nodemailer

#node.js #nodemailer

Вопрос:

Я создаю сервер с помощью Express и хочу отправлять почту с QRCode внутри тела

 var express = require('express');
var app = express();
var nodeMailer = require('nodemailer');
var sql = require("mssql");
var bodyParser = require('body-parser');
var QRCode = require('qrcode')
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 

app.post('/send-email', function (req, res) {
        QRCode.toDataURL('data invoice untuk di kirim melalui email', function (err, url) {
            let data = url.replace(/.*,/,'')
            var img = new Buffer(data,'base64')

        })
          let transporter = nodeMailer.createTransport({
              host: 'test',
              port: 587,
              secure: false,
              auth: {
                  user: 'tes',
                  pass: 'password'
              }
          });
          let mailOptions = {
              from: 'test', // sender address
              to: 'test', // list of receivers
              subject: 'Test Email Node JS', // Subject line
              text: 'Halo ini dari node js', // plain text body
              html: 'Halo ini barcodenya </br>'   img // html body
          };

          transporter.sendMail(mailOptions, (error, info) => {
              if (error) {
                  return console.log(error);
              }
              //console.log('Message %s sent: %s', info.messageId, info.response);
                  res.render('index');
              });
      });
  

Я получаю ошибку, которая img не определена.

Переменная img — это то, что представляет собой qr-код, и для строки она получит строку из SQL-запроса.

Есть какой-нибудь источник для этого?

Ответ №1:

  1. QRCode.toDataURL это асинхронная функция, но вы пытаетесь использовать ее синхронно. Используйте обещания и Async / Await вместо функции обратного вызова.
  2. Вы отправляете изображение в виде буфера, но оно должно быть в base64 с image tag

Вот изменения фрагмента кода,

 ...

app.post('/send-email', async function (req, res) {

    let img = await QRCode.toDataURL('data invoice untuk di kirim melalui email');

    let transporter = nodeMailer.createTransport({
        host: 'test',
        port: 587,
        secure: false,
        auth: {
            user: 'tes',
            pass: 'password'
        }
    });
    let mailOptions = {
        from: 'test', // sender address
        to: 'test', // list of receivers
        subject: 'Test Email Node JS', // Subject line
        text: 'Halo ini dari node js', // plain text body
        html: 'Halo ini barcodenya </br> <img src="'   img   '">' // html body
    };

    transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
            return console.log(error);
        }
        //console.log('Message %s sent: %s', info.messageId, info.response);
        res.render('index');
    });
});

...
  

Ответ №2:

в mailOptions вам нужно добавить attachDataUrls значение on true

 let mailOptions = {
    from: 'test', // sender address
    to: 'test', // list of receivers
    subject: 'Test Email Node JS', // Subject line
    text: 'Halo ini dari node js', // plain text body
    attachDataUrls: true,//to accept base64 content in messsage
    html: 'Halo ini barcodenya </br> <img src="'   img   '">' // html body
};
  

Комментарии:

1. В документах упоминается эта опция, но в пакете Typescript @types ее нет. Не уверен, смогу ли я его использовать…

Ответ №3:

Это ключ!!

attachDataUrls: true, // для приема содержимого base64 в сообщении