// helper module to send emails with nodemailer const fs = require("fs"); const { MailtrapClient } = require("mailtrap"); const nodemailer = require("nodemailer"); const CON = require("./const"); const CAL = require("./calendar"); // const { google } = require("googleapis"); // const OAuth2 = google.auth.OAuth2; const { Shift, Publisher, PrismaClient } = require("@prisma/client"); const TOKEN = process.env.TOKEN || "a7d7147a530235029d74a4c2f228e6ad"; const SENDER_EMAIL = "pw@d-popov.com"; const sender = { name: "JW Cart: Shift Info", email: SENDER_EMAIL }; const client = new MailtrapClient({ token: TOKEN }); const mailtrapTestClient = new MailtrapClient({ username: '8ec69527ff2104',//not working now password: 'c7bc05f171c96c' }); // ------------------ Email sending ------------------ var lastResult = null; function setResult(result) { lastResult = result; } exports.GetLastResult = function () { return lastResult; }; exports.SendEmail = async function (to, subject, text, html) { const message = { from: sender, to, subject, text, html, }; }; exports.SendEmailHandlebars = async function (to, templateName, model) { // Ensure the sender and mailtrapTestClient are correctly defined or imported // Load and compile the main template const mainTemplateSource = fs.readFileSync(path.join(__dirname, 'src', 'templates', 'emails', 'main.hbs'), 'utf8'); const mainTemplate = Handlebars.compile(mainTemplateSource); // Dynamically load and compile the specified template const templateSource = fs.readFileSync(path.join(__dirname, 'src', 'templates', 'emails', `${templateName}.hbs`), 'utf8'); // Extract subject and optional text version from the template source const subjectMatch = templateSource.match(/{{!-- Subject: (.*) --}}/); const textMatch = templateSource.match(/{{!-- Text: ([\s\S]*?) --}}/); const subject = subjectMatch ? subjectMatch[1].trim() : 'Default Subject'; const textVersion = textMatch ? textMatch[1].trim() : null; // Remove the subject and text annotations from the template source const cleanTemplateSource = templateSource.replace(/{{!-- Subject: .* --}}/, '').replace(/{{!-- Text: [\s\S]*? --}}/, ''); // Compile the cleaned template const template = Handlebars.compile(cleanTemplateSource); // Render the specified template with the provided model const templateHtml = template(model); // Render the main template, inserting the specific template HTML const html = mainTemplate({ body: templateHtml }); // Generate a plain text version if not explicitly provided const text = textVersion || html.replace(/<[^>]*>?/gm, ''); // Simple regex to strip HTML tags. Might need refinement. const message = { from: sender, // Ensure 'sender' is defined to, subject, text, html, }; // Assuming mailtrapTestClient is correctly set up to send emails await mailtrapTestClient .send(message) .then(console.log) .catch(console.error); }; exports.SendEmail_Test = async function (to, subject, text, html) { const message = { from: sender, to, subject, text, html, }; await mailtrapTestClient .send(message) .then(console.log, console.error, setResult); } // https://mailtrap.io/blog/sending-emails-with-nodemailer/ exports.SendTestEmail = async function (to) { // await client // .send({ // from: sender, // to: [{ email: RECIPIENT_EMAIL }], // subject: "Hello from Mailtrap!", // text: "Welcome to Mailtrap Sending!",Shift Info" // }) // .then(console.log, console.error, setResult); // return lastResult; const welcomeImage = fs.readFileSync( path.join(CON.contentPath, "welcome.png") ); await client .send({ category: "test", custom_variables: { hello: "world", year: 2022, anticipated: true, }, from: sender, to: [{ email: to }], subject: "Hello from Mailtrap!", html: `

Congrats for sending test email with Mailtrap!

Inspect it using the tabs you see above and learn how this email can be improved.

Inspect with Tabs

Now send your email using our fake SMTP server and integration of your choice!

Good luck! Hope it works.

`, attachments: [ { filename: "welcome.png", content_id: "welcome.png", disposition: "inline", content: welcomeImage, }, ], }) .then(console.log, console.error, setResult); }; exports.SendEmail_NewShifts = async function (publisher, shifts) { if (shifts.length == 0) return; var date = new Date(shifts[0].startTime); //generate ICS calendar links for all shifts const icsLink = CAL.GenerateICS(shifts); const shftStr = shifts .map((s) => { return ` ${CON.weekdaysBG[s.startTime.getDay()] } ${CON.GetDateFormat(s.startTime)} ${s.cartEvent.location.name } ${CON.GetTimeFormat(s.startTime)} - ${CON.GetTimeFormat( s.endTime )}`; }) .join("\n"); await client.send({ from: sender, to: [ { email: "dobromir.popov@gmail.com",//publisher.email, name: publisher.firstName + " " + publisher.lastName, }, ], subject: "[CCC]: вашите смени през " + CON.monthNamesBG[date.getMonth()], text: "Здравейте, " + publisher.firstName + " " + publisher.lastName + "!\n\n" + "Ти регистриран да получавате известия за нови смени на количка.\n" + `За месец ${CON.monthNamesBG[date.getMonth()]} имате следните смени:\n` + ` ${shftStr} \n\n\n` + "Поздрави,\n" + "Специално Свидетелстване София", attachments: [ { filename: "calendar.ics", content_id: "calendar.ics", disposition: "inline", content: icsLink, }, ], }) .then(console.log, console.error, setResult); };