mail.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import nodemailer from "nodemailer";
  2. import path from "path";
  3. import fs from "fs";
  4. import { resetMailText, verifyMailText } from "./text";
  5. import { CustomError } from "../utils";
  6. import env from "../env";
  7. const mailConfig = {
  8. host: env.MAIL_HOST,
  9. port: env.MAIL_PORT,
  10. secure: env.MAIL_SECURE,
  11. auth: {
  12. user: env.MAIL_USER,
  13. pass: env.MAIL_PASSWORD
  14. }
  15. };
  16. const transporter = nodemailer.createTransport(mailConfig);
  17. export default transporter;
  18. // Read email templates
  19. const resetEmailTemplatePath = path.join(__dirname, "template-reset.html");
  20. const verifyEmailTemplatePath = path.join(__dirname, "template-verify.html");
  21. const resetEmailTemplate = fs
  22. .readFileSync(resetEmailTemplatePath, { encoding: "utf-8" })
  23. .replace(/{{domain}}/gm, env.DEFAULT_DOMAIN)
  24. .replace(/{{site_name}}/gm, env.SITE_NAME);
  25. const verifyEmailTemplate = fs
  26. .readFileSync(verifyEmailTemplatePath, { encoding: "utf-8" })
  27. .replace(/{{domain}}/gm, env.DEFAULT_DOMAIN)
  28. .replace(/{{site_name}}/gm, env.SITE_NAME);
  29. export const verification = async (user: User) => {
  30. const mail = await transporter.sendMail({
  31. from: env.MAIL_FROM || env.MAIL_USER,
  32. to: user.email,
  33. subject: "Verify your account",
  34. text: verifyMailText
  35. .replace(/{{verification}}/gim, user.verification_token)
  36. .replace(/{{domain}}/gm, env.DEFAULT_DOMAIN)
  37. .replace(/{{site_name}}/gm, env.SITE_NAME),
  38. html: verifyEmailTemplate
  39. .replace(/{{verification}}/gim, user.verification_token)
  40. .replace(/{{domain}}/gm, env.DEFAULT_DOMAIN)
  41. .replace(/{{site_name}}/gm, env.SITE_NAME)
  42. });
  43. if (!mail.accepted.length) {
  44. throw new CustomError("Couldn't send verification email. Try again later.");
  45. }
  46. };
  47. export const resetPasswordToken = async (user: User) => {
  48. const mail = await transporter.sendMail({
  49. from: env.MAIL_FROM || env.MAIL_USER,
  50. to: user.email,
  51. subject: "Reset your password",
  52. text: resetMailText
  53. .replace(/{{resetpassword}}/gm, user.reset_password_token)
  54. .replace(/{{domain}}/gm, env.DEFAULT_DOMAIN),
  55. html: resetEmailTemplate
  56. .replace(/{{resetpassword}}/gm, user.reset_password_token)
  57. .replace(/{{domain}}/gm, env.DEFAULT_DOMAIN)
  58. });
  59. if (!mail.accepted.length) {
  60. throw new CustomError(
  61. "Couldn't send reset password email. Try again later."
  62. );
  63. }
  64. };