Я нашел ответ на это.
Итак, я пишу утилиту, подобную этой:
retrieveMailConstants(data) {
this.mailConstants = {
from: 'a634885.fmr.com',
to: AppEnvServiceInstance.getConfigurationSettings().$SMTP_MAIL_RECEIPIENTS,
subject: 'Test files - Feedback Generated Files',
template: 'email.body',
attachments: data,
context: {
variable1 : 'value1',
variable2 : 'value2',
array1: ['JOhn', 'som', 'tet']
}
}
return this.mailConstants;
}
Теперь данные в свойстве attachments должны быть разрешенными данными, либо разрешенными Promise, либо наблюдаемым разрешенным массивом данных.Я решил использовать наблюдаемые.Теперь мой вариант использования заключается в том, что мне нужно сгенерировать много файлов на основе информации о конфигурации из БД и сохранить эти сгенерированные файлы либо в БД, либо на отдельном сервере.На данный момент я решил сохранить их на локальном диске.Затем я читаю все файлы из этого местоположения, сохраняю их в массив и, наконец, помещаю этот массив в тему поведения
(обратите внимание, что я написал их в ts, вы можете легко преобразовать это в файл js илипередайте их)
import * as path from 'path';
import { Attachment } from 'nodemailer/lib/mailer';
import * as fs from 'fs';
import * as _ from 'lodash';
import { NodemailerAttachmentModel } from '../models/nodemailer.attachment.model';
import { BehaviorSubject, Observable, of, ConnectableObservable } from 'rxjs';
import {tap, map, filter, switchMap, share, publish, refCount, last, shareReplay}
from 'rxjs/operators';
let fileAttachmentSubject = new BehaviorSubject<Attachment[]>([]);
export const readFilesAndCreateAttachments = () => {
console.log('ibside create attachments');
console.log('dirname', __dirname);
const dirPath = path.join(__dirname+'./../../../../assests/uploads/');
console.log('dirparh is', dirPath);
const filesArray = new Array<Attachment>();
const fileList = fs.readdirSync(dirPath);
console.log('filelist is', fileList);
_.each(fileList, (filePath, i) => {
console.log('filepath in each is', filePath, 'index is', i, 'filelist each index', fileList[i]);
if(i+1 >= fileList.length){
// then it reached the end, time to call the observable list
console.log('before sending', filesArray);
setBehaviorSubject(filesArray);
} else {
console.log('path to read file is', dirPath+fileList[i]);
fs.readFile(dirPath+fileList[i], (err, data) => {
if(!err){
const fileInDir = new NodemailerAttachmentModel;
fileInDir.$content = data;
fileInDir.$filename = filePath;
filesArray.push(fileInDir);
console.log('inside else', filesArray.length, i,
fileList.length);
}
});
}
});
};
export const setBehaviorSubject = (filesArray: Attachment[]) => {
//fileAttachmentObs = from(filesArray).;
fileAttachmentSubject.next(filesArray);
console.log('subject is set', filesArray.length);
}
export const getBehaviorSubject = () => {
console.log('call to get subject');
return fileAttachmentSubject.asObservable();
}
Теперь я использую параметры почты, сконфигурированные для транспорта, для отправки электронной почты.Транспортная конфигурация здесь не показана.Это базовая информация о конфигурации, которую можно получить на сайте nodemailer
getBehaviorSubject().subscribe(data => {
console.log('data subscribed from subject', data);
console.log('only then going to mail');
let mailOptions = nodemailerConstantInstance.retrieveMailConstants(data);
console.log('before sending email');
transport.sendMail(mailOptions, (err, info) => {
if(!err) {
console.log('info', info);
resolve(info);
}else {
console.log('err', err);
reject(err);
}
});
Надеюсь, это кому-то полезно.