| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 | import { ReactiveCache } from '/imports/reactiveCache';import { TAPi18n } from '/imports/i18n';//var nodemailer = require('nodemailer');import EmailLocalization from '../lib/emailLocalization';// buffer each user's email text in a queue, then flush them in single emailMeteor.startup(() => {  Notifications.subscribe('email', (user, title, description, params) => {    // add quote to make titles easier to read in email text    const quoteParams = _.clone(params);    ['card', 'list', 'oldList', 'board', 'comment'].forEach(key => {      if (quoteParams[key]) quoteParams[key] = `"${params[key]}"`;    });    ['timeValue', 'timeOldValue'].forEach(key => {      quoteParams[key] = quoteParams[key] ? `${params[key]}` : '';    });    // Get user's preferred language    const lan = user.getLanguage();    const subject = TAPi18n.__(title, params, lan); // the original function has a fault, i believe the title should be used according to original author    const existing = user.getEmailBuffer().length > 0;    const htmlEnabled =      Meteor.settings.public &&      Meteor.settings.public.RICHER_CARD_COMMENT_EDITOR !== false;    const text = `${existing ? `\n${subject}\n` : ''}${      params.user    } ${TAPi18n.__(description, quoteParams, lan)}\n${params.url}`;    user.addEmailBuffer(htmlEnabled ? text.replace(/\n/g, '<br/>') : text);    // unlike setTimeout(func, delay, args),    // Meteor.setTimeout(func, delay) does not accept args :-(    // so we pass userId with closure    const userId = user._id;    Meteor.setTimeout(() => {      const user = ReactiveCache.getUser(userId);      // for each user, in the timed period, only the first call will get the cached content,      // other calls will get nothing      const texts = user.getEmailBuffer();      if (texts.length === 0) return;      // merge the cached content into single email and flush      const html = texts.join('<br/>\n\n');      user.clearEmailBuffer();      try {        // Use EmailLocalization utility to ensure the correct language is used        EmailLocalization.sendEmail({          to: user.emails[0].address.toLowerCase(),          from: Accounts.emailTemplates.from,          subject,          html,          language: user.getLanguage(),          userId: user._id        });      } catch (e) {        return;      }    }, process.env.EMAIL_NOTIFICATION_TIMEOUT || 30000);  });});
 |