Merge branch 'master' of github.com:Mailtrain-org/mailtrain

Conflicts:
	languages/de_DE.po
This commit is contained in:
Tomas Bures 2017-05-04 17:58:55 -04:00
commit 11990d62b2
10 changed files with 743 additions and 362 deletions

View file

@ -103,6 +103,12 @@ db=5
enabled=false
port=2525
host="0.0.0.0"
# With DMARC, the Return-Path and From address must match the same domain.
# By default we get around this by using the VERP address in the Sender header,
# with the side effect that some email clients diplay an ugly "on behalf of" message.
# You can safely disable this Sender header if you're not using DMARC or your
# VERP hostname is in the same domain as the From address.
# disablesenderheader=true
[testserver]
# Starts a vanity server that redirects all mail to /dev/null

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -6,7 +6,8 @@ let templates = require('../lib/models/templates');
let campaigns = require('../lib/models/campaigns');
module.exports = {
getResource
getResource,
getMergeTagsForResource
};
function getResource(type, id, callback) {
@ -53,7 +54,7 @@ function getMergeTagsForResource(resource, callback) {
return callback(err.message || err);
}
if (!resource.list) {
if (!Number(resource.list)) {
return callback(null, defaultMergeTags);
}
@ -62,7 +63,17 @@ function getMergeTagsForResource(resource, callback) {
return callback(err.message || err);
}
callback(null, defaultMergeTags.concat(listMergeTags));
if (resource.type !== 2) {
return callback(null, defaultMergeTags.concat(listMergeTags));
}
helpers.getRSSMergeTags((err, rssMergeTags) => {
if (err) {
return callback(err.message || err);
}
callback(null, defaultMergeTags.concat(listMergeTags, rssMergeTags));
});
});
});
}

View file

@ -50,7 +50,9 @@ module.exports.fetch = (url, callback) => {
date: item.date || item.pubdate || item.pubDate || new Date(),
guid: item.guid || item.link,
link: item.link,
content: item.description || item.summary
content: item.description || item.summary,
summary: item.summary || item.description,
image_url: item.image.url
};
entries.push(entry);
}

View file

@ -16,6 +16,7 @@ let hbs = require('hbs');
module.exports = {
getDefaultMergeTags,
getRSSMergeTags,
getListMergeTags,
captureFlashMessages,
injectCustomFormData,
@ -60,6 +61,32 @@ function getDefaultMergeTags(callback) {
}]);
}
function getRSSMergeTags(callback) {
// Using a callback for the sake of future-proofness
callback(null, [{
key: 'RSS_ENTRY',
value: _('content from an RSS entry')
}, {
key: 'RSS_ENTRY_TITLE',
value: _('RSS entry title')
}, {
key: 'RSS_ENTRY_DATE',
value: _('RSS entry date')
}, {
key: 'RSS_ENTRY_LINK',
value: _('RSS entry link')
}, {
key: 'RSS_ENTRY_CONTENT',
value: _('content from an RSS entry')
}, {
key: 'RSS_ENTRY_SUMMARY',
value: _('RSS entry summary')
}, {
key: 'RSS_ENTRY_IMAGE_URL',
value: _('RSS entry image URL')
}]);
}
function getListMergeTags(listId, callback) {
lists.get(listId, (err, list) => {
if (err) {

View file

@ -9,7 +9,7 @@ let campaigns = require('../lib/models/campaigns');
let subscriptions = require('../lib/models/subscriptions');
let settings = require('../lib/models/settings');
let tools = require('../lib/tools');
let helpers = require('../lib/helpers');
let editorHelpers = require('../lib/editor-helpers.js');
let striptags = require('striptags');
let passport = require('../lib/passport');
let htmlescape = require('escape-html');
@ -186,30 +186,19 @@ router.get('/edit/:id', passport.csrfProtection, (req, res, next) => {
view = 'campaigns/edit';
}
helpers.getDefaultMergeTags((err, defaultMergeTags) => {
editorHelpers.getMergeTagsForResource(campaign, (err, mergeTags) => {
if (err) {
req.flash('danger', err.message || err);
return res.redirect('/');
}
helpers.getListMergeTags(campaign.list, (err, listMergeTags) => {
if (err) {
req.flash('danger', err.message || err);
return res.redirect('/');
}
campaign.mergeTags = defaultMergeTags.concat(listMergeTags);
campaign.type === 2 && campaign.mergeTags.push({
key: 'RSS_ENTRY',
value: _('content from an RSS entry')
});
campaign.mergeTags = mergeTags;
res.render(view, campaign);
});
});
});
});
});
});
});
router.post('/edit', passport.parseForm, passport.csrfProtection, (req, res) => {

View file

@ -132,8 +132,11 @@ function checkEntries(parent, entries, callback) {
let entryId = result.insertId;
let html = (parent.html || '').toString().trim();
if (/\[RSS_ENTRY\]/i.test(html)) {
html = html.replace(/\[RSS_ENTRY\]/, entry.content);
if (/\[RSS_ENTRY[\w]*\]/i.test(html)) {
html = html.replace(/\[RSS_ENTRY\]/, entry.content); //for backward compatibility
Object.keys(entry).forEach(key => {
html = html.replace('\[RSS_ENTRY_'+key.toUpperCase()+'\]', entry[key])
});
} else {
html = entry.content + html;
}

View file

@ -318,6 +318,7 @@ function formatMessage(message, callback) {
}
let useVerp = config.verp.enabled && configItems.verpUse && configItems.verpHostname;
let useVerpSenderHeader = useVerp && config.verp.disablesenderheader !== true;
fields.list(list.id, (err, fieldList) => {
if (err) {
return callback(err);
@ -389,7 +390,7 @@ function formatMessage(message, callback) {
name: [].concat(message.subscription.firstName || []).concat(message.subscription.lastName || []).join(' '),
address: message.subscription.email
},
sender: useVerp ? campaignAddress + '@' + configItems.verpHostname : false,
sender: useVerpSenderHeader ? campaignAddress + '@' + configItems.verpHostname : false,
envelope: useVerp ? {
from: campaignAddress + '@' + configItems.verpHostname,

View file

@ -71,8 +71,6 @@
</div>
</div>
{{> merge_tag_reference}}
<div class="form-group">
<label for="template" class="col-sm-2 control-label">{{#translate}}RSS Feed Url{{/translate}}</label>
<div class="col-sm-10">
@ -81,6 +79,8 @@
</div>
</div>
{{> merge_tag_reference}}
{{#if disableWysiwyg}}
{{> codeeditor}}
{{else}}