mirror of
https://github.com/docmost/docmost.git
synced 2026-06-10 01:52:43 +08:00
66 lines
2.2 KiB
TypeScript
66 lines
2.2 KiB
TypeScript
import { Inject, Injectable } from '@nestjs/common';
|
|
import { MAIL_DRIVER_TOKEN } from './mail.constants';
|
|
import { MailDriver } from './drivers/interfaces/mail-driver.interface';
|
|
import { MailMessage } from './interfaces/mail.message';
|
|
import { EnvironmentService } from '../environment/environment.service';
|
|
import { InjectQueue } from '@nestjs/bullmq';
|
|
import { QueueName, QueueJob } from '../queue/constants';
|
|
import { Queue } from 'bullmq';
|
|
import { render } from 'react-email';
|
|
|
|
@Injectable()
|
|
export class MailService {
|
|
constructor(
|
|
@Inject(MAIL_DRIVER_TOKEN) private mailDriver: MailDriver,
|
|
private readonly environmentService: EnvironmentService,
|
|
@InjectQueue(QueueName.EMAIL_QUEUE) private emailQueue: Queue,
|
|
) {}
|
|
|
|
async sendEmail(message: MailMessage): Promise<void> {
|
|
if (this.isRecipientBlocked(message.to)) {
|
|
return;
|
|
}
|
|
|
|
if (message.template) {
|
|
// in case this method is used directly. we do not send the tsx template from queue
|
|
message.html = await render(message.template, {
|
|
pretty: true,
|
|
});
|
|
message.text = await render(message.template, { plainText: true });
|
|
}
|
|
|
|
let from = this.environmentService.getMailFromAddress();
|
|
if (message.from) {
|
|
from = message.from;
|
|
}
|
|
|
|
const sender = `${this.environmentService.getMailFromName()} <${from}> `;
|
|
await this.mailDriver.sendMail({ from: sender, ...message });
|
|
}
|
|
|
|
async sendToQueue(message: MailMessage): Promise<void> {
|
|
if (this.isRecipientBlocked(message.to)) {
|
|
return;
|
|
}
|
|
|
|
if (message.template) {
|
|
// transform the React object because it gets lost when sent via the queue
|
|
message.html = await render(message.template, {
|
|
pretty: true,
|
|
});
|
|
message.text = await render(message.template, {
|
|
plainText: true,
|
|
});
|
|
delete message.template;
|
|
}
|
|
await this.emailQueue.add(QueueJob.SEND_EMAIL, message);
|
|
}
|
|
|
|
private isRecipientBlocked(to: string): boolean {
|
|
const blocked = this.environmentService.getMailBlockedRecipientDomains();
|
|
if (blocked.length === 0) return false;
|
|
const domain = to?.split('@')[1]?.toLowerCase();
|
|
return !!domain && blocked.includes(domain);
|
|
}
|
|
}
|