mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-14 11:50:31 +00:00
116 lines
2.2 KiB
TypeScript
116 lines
2.2 KiB
TypeScript
import fs from 'fs';
|
|
import Mustache from 'mustache';
|
|
import { Container } from 'typedi';
|
|
import path from 'path';
|
|
import { IMailable } from '@/interfaces';
|
|
|
|
interface IMailAttachment {
|
|
filename: string;
|
|
path: string;
|
|
cid: string;
|
|
}
|
|
|
|
export default class Mail {
|
|
view: string;
|
|
subject: string;
|
|
to: string;
|
|
from: string = `${process.env.MAIL_FROM_NAME} ${process.env.MAIL_FROM_ADDRESS}`;
|
|
data: { [key: string]: string | number };
|
|
attachments: IMailAttachment[];
|
|
|
|
/**
|
|
* Mail options.
|
|
*/
|
|
private get mailOptions() {
|
|
return {
|
|
to: this.to,
|
|
from: this.from,
|
|
subject: this.subject,
|
|
html: this.render(this.data),
|
|
attachments: this.attachments,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Sends the given mail to the target address.
|
|
*/
|
|
public send() {
|
|
return new Promise((resolve, reject) => {
|
|
const Mail = Container.get('mail');
|
|
|
|
Mail.sendMail(this.mailOptions, (error) => {
|
|
if (error) {
|
|
reject(error);
|
|
return;
|
|
}
|
|
resolve(true);
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Set send mail to address.
|
|
* @param {string} to -
|
|
*/
|
|
setTo(to: string) {
|
|
this.to = to;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets from address to the mail.
|
|
* @param {string} from
|
|
* @return {}
|
|
*/
|
|
private setFrom(from: string) {
|
|
this.from = from;
|
|
return this;
|
|
}
|
|
|
|
setAttachments(attachments: IMailAttachment[]) {
|
|
this.attachments = attachments;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Set mail subject.
|
|
* @param {string} subject
|
|
*/
|
|
setSubject(subject: string) {
|
|
this.subject = subject;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Set view directory.
|
|
* @param {string} view
|
|
*/
|
|
setView(view: string) {
|
|
this.view = view;
|
|
return this;
|
|
}
|
|
|
|
setData(data) {
|
|
this.data = data;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Renders the view template with the given data.
|
|
* @param {object} data
|
|
* @return {string}
|
|
*/
|
|
render(data): string {
|
|
const viewContent = this.getViewContent();
|
|
return Mustache.render(viewContent, data);
|
|
}
|
|
|
|
/**
|
|
* Retrieve view content from the view directory.
|
|
*/
|
|
private getViewContent(): string {
|
|
const filePath = path.join(global.__views_dir, `/${this.view}`);
|
|
return fs.readFileSync(filePath, 'utf8');
|
|
}
|
|
}
|