123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- var pug = require('pug');
- var nodemailer = require('nodemailer');
- var settings = require('./settings');
-
- // Web server
- var bodyParser = require('body-parser');
- var express = require('express');
- var app = express();
-
- // Logging
- var printit = require('printit');
- var log = printit({
- prefix: 'SMAM',
- date: true
- });
-
-
- // nodemailer initial configuration
- var transporter = nodemailer.createTransport(settings.mailserver);
-
-
- // Serve static (JS + HTML) files
- app.use(express.static('front'));
- // Body parsing
- app.use(bodyParser.urlencoded({ extended: true }));
- app.use(bodyParser.json());
-
-
- // A request on /send with user input = mail to be sent
- app.post('/send', function(req, res, next) {
- // Count the failures
- let status = {
- failed: 0,
- total: settings.recipients.length
- };
-
- // params will be used as:
- // - values for html generation from the pug template
- // - parameters for sending the mail(s)
- let params = {
- subject: req.body.subj,
- from: req.body.name + ' <' + req.body.addr + '>',
- html: req.body.text
- };
-
- // Replacing the mail's content with HTML from the pug template
- // Commenting the line below will bypass the generation and only user the
- // text entered by the user
- params.html = pug.renderFile('template.pug', params);
-
- log.info('Sending message from ' + params.from);
-
- // Send the email to all users
- sendMails(params, function(err, infos) {
- if(err) {
- log.error(err)
- }
- logStatus(infos);
- }, function() {
- res.header('Access-Control-Allow-Origin', '*');
- if(status.failed === status.total) {
- res.status(500).send()
- } else {
- res.status(200).send();
- }
- })
- });
-
-
- // Use either the default port or the one chosen by the user (PORT env variable)
- var port = process.env.PORT || 1970;
- // Start the server
- app.listen(port, function() {
- log.info('Server started on port ' + port);
- });
-
-
- // Send mails to the recipients specified in the JSON settings file
- // content: object containing mail params
- // {
- // subject: String
- // from: String (following RFC 1036 (https://tools.ietf.org/html/rfc1036#section-2.1.1))
- // html: String
- // }
- // update(next, infos): Called each time a mail is sent with the infos provided
- // by nodemailer
- // done(): Called once each mail has been sent
- function sendMails(params, update, done) {
- let mails = settings.recipients.map((recipient) => {
- // Promise for each recipient to send each mail asynchronously
- return new Promise((sent) => {
- params.to = recipient;
- // Send the email
- transporter.sendMail(params, (err, infos) => {
- if(err) {
- return update(err, recipient);
- }
- update(null, infos);
- // Promise callback
- sent();
- });
- });
- });
- // Run all the promises (= send all the mails)
- Promise.all(mails).then(done);
- }
-
-
- // Produces log from the infos provided by nodemailer
- // infos: infos provided by nodemailer
- // return: nothing
- function logStatus(infos) {
- if(infos.accepted.length !== 0) {
- log.info('Message sent to ' + infos.accepted[0]);
- }
- if(infos.rejected.length !== 0) {
- status.failed++;
- log.info('Message failed to send to ' + infos.rejected[0]);
- }
- }
|