The Docker runtime image only ships dist/, but mail-config.service.ts pointed at src/mail/mail-templates and nest-cli.json never copied the .hbs files into dist/ either. This was silently masked before because the return-before-sendMail bug meant the path was never touched; fixing that bug now surfaces it as a hard crash on boot (readFileSync throwing synchronously inside the MailerModule factory). Resolve the templates dir from __dirname instead, which is correct in both dev (src/mail) and the compiled image (dist/mail), and add the mail-templates .hbs files to nest-cli.json's asset copy list so they actually land in dist/.
54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
import * as path from 'path';
|
|
import * as fs from 'fs';
|
|
import * as handlebars from 'handlebars';
|
|
import { Injectable } from '@nestjs/common';
|
|
import { ConfigService } from '@nestjs/config';
|
|
import { MailerOptions, MailerOptionsFactory } from '@nestjs-modules/mailer';
|
|
import { HandlebarsAdapter } from '@nestjs-modules/mailer/dist/adapters/handlebars.adapter';
|
|
|
|
@Injectable()
|
|
export class MailConfigService implements MailerOptionsFactory {
|
|
constructor(private configService: ConfigService) {}
|
|
|
|
createMailerOptions(): MailerOptions {
|
|
// __dirname resolves to src/mail in dev (ts-node) and dist/mail in the
|
|
// built image, so this stays correct without depending on whether the
|
|
// process was started from a source or compiled checkout.
|
|
const templatesDir = path.join(__dirname, 'mail-templates');
|
|
|
|
handlebars.registerPartial(
|
|
'layout',
|
|
fs.readFileSync(
|
|
path.join(templatesDir, 'partials', 'layout.hbs'),
|
|
'utf-8',
|
|
),
|
|
);
|
|
|
|
return {
|
|
transport: {
|
|
host: this.configService.get('mail.host'),
|
|
port: this.configService.get('mail.port'),
|
|
ignoreTLS: this.configService.get('mail.ignoreTLS'),
|
|
secure: this.configService.get('mail.secure'),
|
|
requireTLS: this.configService.get('mail.requireTLS'),
|
|
auth: {
|
|
user: this.configService.get('mail.user'),
|
|
pass: this.configService.get('mail.password'),
|
|
},
|
|
},
|
|
defaults: {
|
|
from: `"${this.configService.get(
|
|
'mail.defaultName',
|
|
)}" <${this.configService.get('mail.defaultEmail')}>`,
|
|
},
|
|
template: {
|
|
dir: templatesDir,
|
|
adapter: new HandlebarsAdapter(),
|
|
options: {
|
|
strict: true,
|
|
},
|
|
},
|
|
} as MailerOptions;
|
|
}
|
|
}
|