【发布时间】:2019-09-30 22:05:05
【问题描述】:
我正在尝试使用 nodemailer 在 nodejs 中发送电子邮件。目前我将把手配置为模板,并使用 nodemailer-express-handlebars 作为模板引擎。我想动态读取上传文件夹中可用的文件并将它们作为附件发送。但我不知道怎么做。请帮帮我
import { FeedbackFileEntity } from
'../../shared/entities/feedback.file.entity';
import hbs = require('nodemailer-express-handlebars');
import fs = require('fs');
import { getConnection } from 'typeorm';
import { DaoException } from '../../shared/exceptionHandler/dao.exception';
import { AppEnvServiceInstance } from
'../../shared/services/app.env.service';
import nodemailer = require('nodemailer');
import * as path from 'path';
import { promisify } from 'util';
// This is the router to upload files to database
// this works fine
export const feedbackFileUploadDataLayer = async(fileMeta, fileBody) => {
console.log('file buffer is', fileMeta);
console.log('file meta path', fileMeta.path);
fileEntity.$fileName = fileBody.fileName;
const manager = await getConnection('postgresConnection').manager;
console.log('before triggering save');
return new Promise((resolve, reject) => {
manager.save(fileEntity).then(data => {
console.log('Saved the data successfully', data);
resolve('Saved the fileContent');
}).catch(err => {
console.log('error saving thge data', err);
reject(new DaoException(481, 'Error in saving the file',
'DaoException'));
});
});
};
// this is the place where I will be implementing logic to generate new
files
// currently I am trying to read the files that was uploaded above from
./uploads folder
export const generateFilesAndEmailDataLayer = async () => {
console.log('inside data layer');
// console.log("Preview URL: %s",
nodemailer.getTestMessageUrl(transportObject));
const result = sendEmail();
console.log('returned result', result);
return result;
};
const sendEmail = () => {
// create mail account - in ethereal
const accnt = {
user: 'XXXX',
pass: 'XXXXX'
}
// configure smptp
const transport = nodemailer.createTransport({
host: 'smtp.ethereal.email',
port: 587,
secure: false,
auth: {
user: accnt.user,
pass: accnt.pass
}
});
const emailTemplateOptions = {
defaultLayout: 'email.default',
layoutDir:
path.resolve(__dirname+'./../../../../views/email/layouts/'),
partialsDir:
path.resolve(__dirname+'./../../../../views/email/partials/'),
extName: 'hbs'
}
let options = {
viewEngine: {
extname: '.handlebars',
layoutsDir:
path.resolve(__dirname+'./../../../../views/email/'),
defaultLayout : 'template',
partialsDir :
path.resolve(__dirname+'./../../../../views/email/partials/')
},
viewPath: path.resolve(__dirname+'./../../../../views/email/'),
extName: '.handlebars'
};
transport.use('compile', hbs(options));
var mail = {
from: 'XXXX',
to:
AppEnvServiceInstance.getConfigurationSettings().$SMTP_MAIL_RECEIPIENTS,
subject: 'Feedback Generated Files',
template: 'email.body',
attachments: fileArrayFunction,
context: {
variable1 : 'value1',
variable2 : 'value2',
array1: ['JOhn', 'som', 'tet']
}
}
console.log('evfore sending email', fileArrayFunction);
transport.sendMail(mail, (err, info) => {
if(!err) {
console.log('info', info);
return(info);
}else {
console.log('err', err);
return(err);
}
});
// e
}
const fileArrayFunction = () => {
const dirPath = path.join(__dirname+'./../../../../assests/uploads/');
const filesArray = [];
const rAsync = promisify(fs.readFile);
const rAsyncDir = promisify(fs.readdir);
// return new Promise((resolve, reject) => {
// rAsyncDir(dirPath).then(data => {
// console.log('durectory parth read', data);
// data.array.forEach(element => {
// console.log('each element is', element);
// rAsync(element).then(content => {
// filesArray.push({fileName: element,
content:content});
// })
// });
// resolve(filesArray);
// }).catch(err => {
// console.log(err);
// reject(err);
// });
// });
fs.readdirSync(dirPath).forEach(item => {
console.log('each item dur', item);
const content = fs.readFileSync(dirPath+item);
filesArray.push({filename: item, content:content});
})
return filesArray;
}
partials 目录,默认布局都可以正常工作。它们非常基础。这是主要的电子邮件模板 email.body.handlebars
<h4>Main Body Here</h4>
{{variable1}} <br/>
{{variable2}}
我可以发送不带附件的电子邮件,但如果添加此文件,您会看到编译时错误,说明 transport.sendEmail() 无法使用 mail 常量,因为它包含附件作为函数而不是常量数组。请帮助我。我想在文件增长时读取文件并动态发送出去
【问题讨论】:
标签: node.js typescript nodemailer express-handlebars