From d651cca039de962321645e906ad47a1587d90f4d Mon Sep 17 00:00:00 2001 From: Andris Reinman Date: Thu, 8 Sep 2016 15:31:38 +0300 Subject: [PATCH] Updated installation script --- lib/mailer.js | 5 +++++ routes/settings.js | 2 +- routes/webhooks.js | 41 +++++++++++++++++++++++++++++++++++++ setup/install.sh | 9 +++++++++ views/settings.hbs | 50 ++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 104 insertions(+), 3 deletions(-) diff --git a/lib/mailer.js b/lib/mailer.js index 2310662c..6c568d1b 100644 --- a/lib/mailer.js +++ b/lib/mailer.js @@ -41,6 +41,11 @@ module.exports.sendMail = (mail, template, callback) => { }); } + if (!mail.headers) { + mail.headers = {}; + } + mail.headers['X-Sending-Zone'] = 'transactional'; + getTemplate(template.html, (err, htmlRenderer) => { if (err) { return callback(err); diff --git a/routes/settings.js b/routes/settings.js index 8826d3a0..72e63546 100644 --- a/routes/settings.js +++ b/routes/settings.js @@ -13,7 +13,7 @@ let upload = multer(); let settings = require('../lib/models/settings'); -let allowedKeys = ['service_url', 'smtp_hostname', 'smtp_port', 'smtp_encryption', 'smtp_disable_auth', 'smtp_user', 'smtp_pass', 'admin_email', 'smtp_log', 'smtp_max_connections', 'smtp_max_messages', 'smtp_self_signed', 'default_from', 'default_address', 'default_subject', 'default_homepage', 'default_postaddress', 'default_sender', 'verp_hostname', 'verp_use', 'disable_wysiwyg', 'pgp_private_key', 'pgp_passphrase', 'ua_code', 'shoutout', 'disable_confirmations', 'smtp_throttling']; +let allowedKeys = ['service_url', 'smtp_hostname', 'smtp_port', 'smtp_encryption', 'smtp_disable_auth', 'smtp_user', 'smtp_pass', 'admin_email', 'smtp_log', 'smtp_max_connections', 'smtp_max_messages', 'smtp_self_signed', 'default_from', 'default_address', 'default_subject', 'default_homepage', 'default_postaddress', 'default_sender', 'verp_hostname', 'verp_use', 'disable_wysiwyg', 'pgp_private_key', 'pgp_passphrase', 'ua_code', 'shoutout', 'disable_confirmations', 'smtp_throttling', 'dkim_api_key', 'dkim_private_key', 'dkim_selector', 'dkim_domain']; router.all('/*', (req, res, next) => { if (!req.user) { diff --git a/routes/webhooks.js b/routes/webhooks.js index 7a0b7c7b..5f9e3e0a 100644 --- a/routes/webhooks.js +++ b/routes/webhooks.js @@ -4,6 +4,7 @@ let express = require('express'); let router = new express.Router(); let request = require('request'); let campaigns = require('../lib/models/campaigns'); +let settings = require('../lib/models/settings'); let log = require('npmlog'); let multer = require('multer'); let uploads = multer(); @@ -286,4 +287,44 @@ router.post('/zone-mta', (req, res, next) => { }); }); +router.post('/zone-mta/sender-config', (req, res) => { + if (!req.query.api_token) { + return res.json({ + error: 'api_token value not set' + }); + } + settings.list(['dkim_api_key', 'dkim_private_key', 'dkim_selector', 'dkim_domain'], (err, configItems) => { + if (err) { + return res.json({ + error: err.message + }); + } + + if (configItems.dkimApiKey !== req.query.api_token) { + return res.json({ + error: 'invalid api_token value' + }); + } + + configItems.dkimSelector = (configItems.dkimSelector || '').trim(); + configItems.dkimPrivateKey = (configItems.dkimPrivateKey || '').trim(); + + if (!configItems.dkimSelector || !configItems.dkimPrivateKey) { + // empty response + return res.json({}); + } + + let from = (req.body.from || '').trim(); + let domain = from.split('@').pop().toLowerCase().trim(); + + res.json({ + keys: { + domainName: configItems.dkimDomain || domain, + keySelector: configItems.dkimSelector, + privateKey: configItems.dkimPrivateKey + } + }); + }); +}); + module.exports = router; diff --git a/setup/install.sh b/setup/install.sh index 01d37efb..a33a3899 100755 --- a/setup/install.sh +++ b/setup/install.sh @@ -26,6 +26,7 @@ fi HOSTNAME="${HOSTNAME:-`hostname`}" MYSQL_PASSWORD=`pwgen -1` +DKIM_API_KEY=`pwgen -1` # Setup MySQL user for Mailtrain mysql -u root -e "CREATE USER 'mailtrain'@'localhost' IDENTIFIED BY '$MYSQL_PASSWORD';" @@ -57,6 +58,7 @@ INSERT INTO \`settings\` (\`key\`, \`value\`) VALUES ('smtp_encryption','NONE') INSERT INTO \`settings\` (\`key\`, \`value\`) VALUES ('smtp_port','587') ON DUPLICATE KEY UPDATE \`value\`='587'; INSERT INTO \`settings\` (\`key\`, \`value\`) VALUES ('default_homepage','http://$HOSTNAME/') ON DUPLICATE KEY UPDATE \`value\`='http://$HOSTNAME/'; INSERT INTO \`settings\` (\`key\`, \`value\`) VALUES ('service_url','http://$HOSTNAME/') ON DUPLICATE KEY UPDATE \`value\`='http://$HOSTNAME/'; +INSERT INTO \`settings\` (\`key\`, \`value\`) VALUES ('dkim_api_key','http://$DKIM_API_KEY/') ON DUPLICATE KEY UPDATE \`value\`='http://$DKIM_API_KEY/'; EOT # Add new user for the mailtrain daemon to run as @@ -131,6 +133,13 @@ cat >> config/production.json <
- +
@@ -312,7 +312,53 @@
- This value is optional. if you do not provide a private key GPG encrypted messages are sent without signing. + This value is optional. If you do not provide a private key GPG encrypted messages are sent without signing. +
+ + + + +
+ + DKIM Signing by ZoneMTA + + +

+ If you are using ZoneMTA then Mailtrain can provide a DKIM key for signing all outgoing messages. Other services usually provide their own means to DKIM sign your messages +

+

+ Do not use sensitive keys here. The private key is not encrypted in the database. +

+ +
+ +
+ + Secret value known to ZoneMTA for requesting DKIM key information. If this value was generated by the Mailtrain installation script then you can keep it as it is +
+
+ +
+ +
+ + Leave blank to use the sender email address domain +
+
+ +
+ +
+ + Signing is disabled without a valid selector value +
+
+ +
+ +
+ + This value is optional. If you do not provide a private key then messages are not signed.