#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:
QRCode.toDataURL
это асинхронная функция, но вы пытаетесь использовать ее синхронно. Используйте обещания и Async / Await вместо функции обратного вызова.- Вы отправляете изображение в виде буфера, но оно должно быть в
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 в сообщении