const fs = require('fs') const axios = require('axios') const unified = require('unified') const markdown = require('remark-parse') const remark2rehype = require('remark-rehype') const format = require('rehype-format') const html = require('rehype-stringify') const mustache = require('mustache') const nodemailer = require('nodemailer') const testers = require('./testers') const backend = process.env.FS_BACKEND const asHtml = async (text) => { let content = await unified().use(markdown).use(remark2rehype).use(format).use(html).process(text) return content.contents } const getToken = async () => { let res = await axios.post(`${backend}login`, { username: process.env.FS_USER, password: process.env.FS_PASSWORD, }) if (res.data) return res.data.token else if (res.err) return console.log(err) } const getSubscribers = async (test = true) => { if (test) return testers let token = await getToken() let res = await axios.get(`${backend}admin/subscribers`, { headers: { Authorization: 'Bearer ' + token }, }) if (res.data) return res.data else return false } const send = async (test = true) => { const template = fs.readFileSync(`${__dirname}/../templates/newsletter.html`, 'utf8') const text = fs.readFileSync(`${__dirname}/../newsletter/${process.env.NL_EDITION}/en.md`, 'utf8') const subscribers = await getSubscribers(test) const content = await asHtml(text) const inject = { content } const smtp = nodemailer.createTransport({ host: process.env.SMTP_HOST, auth: { user: process.env.SMTP_USER, pass: process.env.SMTP_PASS, }, }) let i = 1 let subs = subscribers.length for (let sub of subscribers) { // If your SMTP relay start rate-limiting midway through // you can use this if loop to start just after the last // successful delivery if (i > 0) { let unsub = `${backend}unsubscribe/${sub.ehash}` inject.unsubscribe = unsub let body = mustache.render(template, inject) console.log(`${i}/${subs} Sending to ${sub.email}`) await smtp.sendMail({ from: '"FreeSewing" ', to: sub.email, subject: 'FreeSewing newsletter: Spring 2021', headers: { Language: 'en', 'List-Owner': 'joost@joost.at', 'List-Subscribe': 'https://freesewing.org/community/newsletter/', 'List-Unsubscribe': unsub, }, text, html: body, }) } i++ } } const sendTest = () => send(true) const sendReal = () => send(false) module.exports = { sendTest, sendReal, }