Added basic mailer that can send pw reset mails
This commit is contained in:
		
							
								
								
									
										96
									
								
								src/Mailer.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								src/Mailer.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,96 @@
 | 
				
			|||||||
 | 
					import fs from "fs";
 | 
				
			||||||
 | 
					import Handlebars from 'handlebars';
 | 
				
			||||||
 | 
					import i18next from "i18next";
 | 
				
			||||||
 | 
					import Backend from 'i18next-fs-backend';
 | 
				
			||||||
 | 
					import nodemailer from 'nodemailer';
 | 
				
			||||||
 | 
					import { MailOptions } from 'nodemailer/lib/json-transport';
 | 
				
			||||||
 | 
					import Mail from 'nodemailer/lib/mailer';
 | 
				
			||||||
 | 
					import path from 'path';
 | 
				
			||||||
 | 
					import { config } from './config';
 | 
				
			||||||
 | 
					import { MailServerConfigError } from './errors/MailErrors';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * This class is responsible for all things pdf creation.
 | 
				
			||||||
 | 
					 * This uses the html templates from src/templates.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export class Mailer {
 | 
				
			||||||
 | 
					    private templateDir = path.join(__dirname, '/templates');
 | 
				
			||||||
 | 
					    private transport: Mail;
 | 
				
			||||||
 | 
					    private static interpolations = { eventname: config.eventname }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Main constructor.
 | 
				
			||||||
 | 
					     * Initializes i18n(ext), Handlebars and puppeteer.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					        this.init();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Main constructor.
 | 
				
			||||||
 | 
					     * Initializes i18n(ext), Handlebars and puppeteer.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public async init() {
 | 
				
			||||||
 | 
					        await i18next
 | 
				
			||||||
 | 
					            .use(Backend)
 | 
				
			||||||
 | 
					            .init({
 | 
				
			||||||
 | 
					                fallbackLng: 'en',
 | 
				
			||||||
 | 
					                lng: 'en',
 | 
				
			||||||
 | 
					                backend: {
 | 
				
			||||||
 | 
					                    loadPath: path.join(__dirname, '/locales/{{lng}}.json')
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        await Handlebars.registerHelper('__',
 | 
				
			||||||
 | 
					            function (str) {
 | 
				
			||||||
 | 
					                return i18next.t(str, Mailer.interpolations).toString();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        this.transport = nodemailer.createTransport({
 | 
				
			||||||
 | 
					            host: config.mail_server,
 | 
				
			||||||
 | 
					            port: config.mail_port,
 | 
				
			||||||
 | 
					            auth: {
 | 
				
			||||||
 | 
					                user: config.mail_user,
 | 
				
			||||||
 | 
					                pass: config.mail_password
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.transport.verify(function (error, success) {
 | 
				
			||||||
 | 
					            if (error) {
 | 
				
			||||||
 | 
					                throw new MailServerConfigError();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					 * Function for sending a test mail from the test mail template.
 | 
				
			||||||
 | 
					 * @param to_address The address the mail will be sent to. Should always get pulled from a user object.
 | 
				
			||||||
 | 
					 * @param token The requested password reset token - will be combined with the app_url to generate a password reset link.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					    public async sendResetMail(to_address: string, token: string, locale: string = "en") {
 | 
				
			||||||
 | 
					        await i18next.changeLanguage(locale);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const reset_link = `${config.app_url}/reset/${(Buffer.from(token)).toString("base64")}`
 | 
				
			||||||
 | 
					        const template_html = Handlebars.compile(fs.readFileSync(__dirname + '/static/mail_templates/pw-reset.html', { encoding: 'utf8' }));
 | 
				
			||||||
 | 
					        const template_txt = Handlebars.compile(fs.readFileSync(__dirname + '/static/mail_templates/pw-reset.html', { encoding: 'utf8' }));
 | 
				
			||||||
 | 
					        const body_html = template_html({ recipient_mail: to_address, copyright_owner: config.copyright_owner, link_imprint: `${config.app_url}/imprint`, link_privacy: `${config.app_url}/privacy`, reset_link });
 | 
				
			||||||
 | 
					        const body_txt = template_txt({ recipient_mail: to_address, copyright_owner: config.copyright_owner, link_imprint: `${config.app_url}/imprint`, link_privacy: `${config.app_url}/privacy`, reset_link });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const mail: MailOptions = {
 | 
				
			||||||
 | 
					            to: to_address,
 | 
				
			||||||
 | 
					            subject: i18next.t("subject_reset", Mailer.interpolations).toString(),
 | 
				
			||||||
 | 
					            text: body_txt,
 | 
				
			||||||
 | 
					            html: body_html
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        await this.sendMail(mail);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Wrapper function for sending a mail via this object's transporter.
 | 
				
			||||||
 | 
					     * @param mail MailOptions object containing the 
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public async sendMail(mail: MailOptions) {
 | 
				
			||||||
 | 
					        mail.from = config.mail_from;
 | 
				
			||||||
 | 
					        await this.transport.sendMail(mail);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user