diff --git a/lib/models/fields.js b/lib/models/fields.js
index 8fe5d6e8..0e955ad8 100644
--- a/lib/models/fields.js
+++ b/lib/models/fields.js
@@ -458,7 +458,7 @@ module.exports.getRow = (fieldList, values, useDate, showAll, onlyExisting) => {
value: Number(valueList[field.column]) || 0,
visible: !!field.visible,
mergeTag: field.key,
- mergeValue: Number(valueList[field.column]) || Number(field.defaultValue) || 0,
+ mergeValue: (Number(valueList[field.column]) || Number(field.defaultValue) || 0).toString(),
['type' + (field.type || '').toString().trim().replace(/(?:^|\-)([a-z])/g, (m, c) => c.toUpperCase())]: true
};
row.push(item);
diff --git a/lib/models/subscriptions.js b/lib/models/subscriptions.js
index 080acb5e..d9867c90 100644
--- a/lib/models/subscriptions.js
+++ b/lib/models/subscriptions.js
@@ -355,7 +355,7 @@ module.exports.getWithMergeTags = (listId, cid, callback) => {
TIMEZONE: subscription.tz || ''
};
- fields.getRow(fieldList, subscription, true, true).forEach(field => {
+ fields.getRow(fieldList, subscription, false, true).forEach(field => {
if (field.mergeTag) {
subscription.mergeTags[field.mergeTag] = field.mergeValue || '';
}
diff --git a/lib/tools.js b/lib/tools.js
index 2e7a32e2..f2d1bc32 100644
--- a/lib/tools.js
+++ b/lib/tools.js
@@ -200,17 +200,23 @@ function formatMessage(serviceUrl, campaign, list, subscription, message, filter
return links[key];
}
if (subscription.mergeTags.hasOwnProperty(key)) {
- return isHTML ? he.encode((subscription.mergeTags[key] || ''), {
+ let value = (subscription.mergeTags[key] || '').toString();
+ // FIXME https://github.com/Mailtrain-org/mailtrain/issues/192
+ return isHTML ? he.encode(value, {
useNamedReferences: true
- }) : subscription.mergeTags[key];
+ }) : value;
}
return false;
};
return message.replace(/\[([a-z0-9_]+)(?:\/([^\]]+))?\]/ig, (match, identifier, fallback) => {
identifier = identifier.toUpperCase();
- let value = (getValue(identifier) || fallback || '').trim();
- return value ? filter(value) : match;
+ let value = getValue(identifier);
+ if (value === false) {
+ return match;
+ }
+ value = (value || fallback || '').trim();
+ return filter(value);
});
}
@@ -310,4 +316,3 @@ function mergeTemplateIntoLayout(template, layout, callback) {
return done(template, layout);
}
}
-
diff --git a/services/sender.js b/services/sender.js
index d81b4315..040a8a13 100644
--- a/services/sender.js
+++ b/services/sender.js
@@ -332,7 +332,7 @@ function formatMessage(message, callback) {
};
let encryptionKeys = [];
- fields.getRow(fieldList, message.subscription, true, true).forEach(field => {
+ fields.getRow(fieldList, message.subscription, false, true).forEach(field => {
if (field.mergeTag) {
message.subscription.mergeTags[field.mergeTag] = field.mergeValue || '';
}
diff --git a/setup/sql/mailtrain-test.sql b/setup/sql/mailtrain-test.sql
index b04c1aa2..95af27a0 100644
--- a/setup/sql/mailtrain-test.sql
+++ b/setup/sql/mailtrain-test.sql
@@ -34,6 +34,23 @@ CREATE TABLE `campaign` (
KEY `status_index` (`status`),
KEY `subscription_index` (`subscription`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+CREATE TABLE `campaign__1` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `list` int(11) unsigned NOT NULL,
+ `segment` int(11) unsigned NOT NULL,
+ `subscription` int(11) unsigned NOT NULL,
+ `status` tinyint(4) unsigned NOT NULL DEFAULT '0',
+ `response` varchar(255) DEFAULT NULL,
+ `response_id` varchar(255) CHARACTER SET ascii DEFAULT NULL,
+ `updated` timestamp NULL DEFAULT NULL,
+ `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `list` (`list`,`segment`,`subscription`),
+ KEY `created` (`created`),
+ KEY `response_id` (`response_id`),
+ KEY `status_index` (`status`),
+ KEY `subscription_index` (`subscription`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `campaign_tracker` (
`list` int(11) unsigned NOT NULL,
`subscriber` int(11) unsigned NOT NULL,
@@ -46,6 +63,18 @@ CREATE TABLE `campaign_tracker` (
PRIMARY KEY (`list`,`subscriber`,`link`),
KEY `created_index` (`created`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+CREATE TABLE `campaign_tracker__1` (
+ `list` int(11) unsigned NOT NULL,
+ `subscriber` int(11) unsigned NOT NULL,
+ `link` int(11) NOT NULL,
+ `ip` varchar(100) CHARACTER SET ascii DEFAULT NULL,
+ `device_type` varchar(50) DEFAULT NULL,
+ `country` varchar(2) CHARACTER SET ascii DEFAULT NULL,
+ `count` int(11) unsigned NOT NULL DEFAULT '1',
+ `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`list`,`subscriber`,`link`),
+ KEY `created_index` (`created`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `campaigns` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`cid` varchar(255) CHARACTER SET ascii NOT NULL,
@@ -89,7 +118,8 @@ CREATE TABLE `campaigns` (
KEY `type_index` (`type`),
KEY `parent_index` (`parent`),
KEY `check_index` (`last_check`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
+INSERT INTO `campaigns` (`id`, `cid`, `type`, `parent`, `name`, `description`, `list`, `segment`, `template`, `source_url`, `editor_name`, `editor_data`, `last_check`, `check_status`, `from`, `address`, `reply_to`, `subject`, `html`, `html_prepared`, `text`, `status`, `scheduled`, `status_change`, `delivered`, `blacklisted`, `opened`, `clicks`, `unsubscribed`, `bounced`, `complained`, `created`, `open_tracking_disabled`, `click_tracking_disabled`) VALUES (1,'BkwHWgCWb',1,NULL,'Merge Tags','',1,0,0,'','codeeditor',NULL,NULL,NULL,'My Awesome Company','admin@example.com','','Test message','\r\n
\r\n - LINK_UNSUBSCRIBE
\r\n - [LINK_UNSUBSCRIBE]
\r\n - LINK_PREFERENCES
\r\n - [LINK_PREFERENCES]
\r\n - LINK_BROWSER
\r\n - [LINK_BROWSER]
\r\n - EMAIL
\r\n - [EMAIL]
\r\n - FIRST_NAME
\r\n - [FIRST_NAME]
\r\n - LAST_NAME
\r\n - [LAST_NAME]
\r\n - FULL_NAME
\r\n - [FULL_NAME]
\r\n - SUBSCRIPTION_ID
\r\n - [SUBSCRIPTION_ID]
\r\n - LIST_ID
\r\n - [LIST_ID]
\r\n - CAMPAIGN_ID
\r\n - [CAMPAIGN_ID]
\r\n - MERGE_TEXT
\r\n - [MERGE_TEXT]
\r\n - MERGE_NUMBER
\r\n - [MERGE_NUMBER]
\r\n - MERGE_WEBSITE
\r\n - [MERGE_WEBSITE]
\r\n - MERGE_GPG_PUBLIC_KEY
\r\n - [MERGE_GPG_PUBLIC_KEY/GPG Fallback Text]
\r\n - MERGE_MULTILINE_TEXT
\r\n - [MERGE_MULTILINE_TEXT]
\r\n - MERGE_JSON
\r\n - [MERGE_JSON]
\r\n - MERGE_DATE_MMDDYY
\r\n - [MERGE_DATE_MMDDYY]
\r\n - MERGE_DATE_DDMMYY
\r\n - [MERGE_DATE_DDMMYY]
\r\n - MERGE_BIRTHDAY_MMDD
\r\n - [MERGE_BIRTHDAY_MMDD]
\r\n - MERGE_BIRTHDAY_DDMM
\r\n - [MERGE_BIRTHDAY_DDMM]
\r\n - MERGE_DROP_DOWNS
\r\n - [MERGE_DROP_DOWNS]
\r\n - MERGE_CHECKBOXES
\r\n - [MERGE_CHECKBOXES]
\r\n
','\n\n - LINK_UNSUBSCRIBE
\n - [LINK_UNSUBSCRIBE]
\n - LINK_PREFERENCES
\n - [LINK_PREFERENCES]
\n - LINK_BROWSER
\n - [LINK_BROWSER]
\n - EMAIL
\n - [EMAIL]
\n - FIRST_NAME
\n - [FIRST_NAME]
\n - LAST_NAME
\n - [LAST_NAME]
\n - FULL_NAME
\n - [FULL_NAME]
\n - SUBSCRIPTION_ID
\n - [SUBSCRIPTION_ID]
\n - LIST_ID
\n - [LIST_ID]
\n - CAMPAIGN_ID
\n - [CAMPAIGN_ID]
\n - MERGE_TEXT
\n - [MERGE_TEXT]
\n - MERGE_NUMBER
\n - [MERGE_NUMBER]
\n - MERGE_WEBSITE
\n - [MERGE_WEBSITE]
\n - MERGE_GPG_PUBLIC_KEY
\n - [MERGE_GPG_PUBLIC_KEY/GPG Fallback Text]
\n - MERGE_MULTILINE_TEXT
\n - [MERGE_MULTILINE_TEXT]
\n - MERGE_JSON
\n - [MERGE_JSON]
\n - MERGE_DATE_MMDDYY
\n - [MERGE_DATE_MMDDYY]
\n - MERGE_DATE_DDMMYY
\n - [MERGE_DATE_DDMMYY]
\n - MERGE_BIRTHDAY_MMDD
\n - [MERGE_BIRTHDAY_MMDD]
\n - MERGE_BIRTHDAY_DDMM
\n - [MERGE_BIRTHDAY_DDMM]
\n - MERGE_DROP_DOWNS
\n - [MERGE_DROP_DOWNS]
\n - MERGE_CHECKBOXES
\n - [MERGE_CHECKBOXES]
\n
','',1,NOW(),NULL,0,0,0,0,0,0,0,NOW(),0,0);
CREATE TABLE `confirmations` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`cid` varchar(255) CHARACTER SET ascii NOT NULL,
@@ -119,7 +149,25 @@ CREATE TABLE `custom_fields` (
UNIQUE KEY `list` (`list`,`column`),
KEY `list_2` (`list`),
CONSTRAINT `custom_fields_ibfk_1` FOREIGN KEY (`list`) REFERENCES `lists` (`id`) ON DELETE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4;
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (1,1,'Text','MERGE_TEXT',NULL,'text',NULL,NULL,'custom_text_field_byiiqjrw',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (2,1,'Number','MERGE_NUMBER',NULL,'number',NULL,NULL,'custom_number_field_r1dd91awb',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (3,1,'Website','MERGE_WEBSITE',NULL,'website',NULL,NULL,'custom_website_field_rkq991cw',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (4,1,'GPG Public Key','MERGE_GPG_PUBLIC_KEY',NULL,'gpg',NULL,NULL,'custom_gpg_public_key_ryvj51cz',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (5,1,'Multiline Text','MERGE_MULTILINE_TEXT',NULL,'longtext',NULL,NULL,'custom_multiline_text_bjbfojawb',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (6,1,'JSON','MERGE_JSON',NULL,'json',NULL,NULL,'custom_json_skqjkcb',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (7,1,'Date (MM/DD/YY)','MERGE_DATE_MMDDYY',NULL,'date-us',NULL,NULL,'custom_date_mmddyy_rjkeojrzz',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (8,1,'Date (DD/MM/YY)','MERGE_DATE_DDMMYY',NULL,'date-eur',NULL,NULL,'custom_date_ddmmyy_ryedsk0wz',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (9,1,'Birthday (MM/DD)','MERGE_BIRTHDAY_MMDD',NULL,'birthday-us',NULL,NULL,'custom_birthday_mmdd_h18coj0zz',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (10,1,'Birthday (DD/MM)','MERGE_BIRTHDAY_DDMM',NULL,'birthday-eur',NULL,NULL,'custom_birthday_ddmm_r1g3s1czz',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (11,1,'Drop Downs','MERGE_DROP_DOWNS',NULL,'dropdown',NULL,NULL,NULL,1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (12,1,'Drop Down Opt 1','MERGE_DROP_DOWN_OPT_1',NULL,'option',11,NULL,'custom_dd_option_1_b1wwn1rzw',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (13,1,'Drop Down Opt 2','MERGE_DROP_DOWN_OPT_2',NULL,'option',11,NULL,'custom_drop_down_opt_2_hkzd2jcww',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (14,1,'Drop Down Opt 3','MERGE_DROP_DOWN_OPT_3',NULL,'option',11,NULL,'custom_drop_down_opt_3_rjghnyrz',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (15,1,'Checkboxes','MERGE_CHECKBOXES',NULL,'checkbox',NULL,NULL,NULL,1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (16,1,'Checkbox Option 1','MERGE_CHECKBOX_OPTION_1',NULL,'option',15,NULL,'custom_checkbox_option_1_by_l0jcwz',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (17,1,'Checkbox Option 2','MERGE_CHECKBOX_OPTION_2',NULL,'option',15,NULL,'custom_checkbox_option_2_sjdprj0zz',1,NOW());
+INSERT INTO `custom_fields` (`id`, `list`, `name`, `key`, `default_value`, `type`, `group`, `group_template`, `column`, `visible`, `created`) VALUES (18,1,'Checkbox Option 3','MERGE_CHECKBOX_OPTION_3',NULL,'option',15,NULL,'custom_checkbox_option_3_bk2drjabz',1,NOW());
CREATE TABLE `custom_forms` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`list` int(11) unsigned NOT NULL,
@@ -199,7 +247,7 @@ CREATE TABLE `lists` (
UNIQUE KEY `cid` (`cid`),
KEY `name` (`name`(191))
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;
-INSERT INTO `lists` (`id`, `cid`, `default_form`, `name`, `description`, `subscribers`, `created`, `public_subscribe`, `unsubscription_mode`) VALUES (1,'Hkj1vCoJb',0,'#1 (one-step, no form)','',0,NOW(),1,0);
+INSERT INTO `lists` (`id`, `cid`, `default_form`, `name`, `description`, `subscribers`, `created`, `public_subscribe`, `unsubscription_mode`) VALUES (1,'Hkj1vCoJb',0,'#1 (one-step, no form)','',1,NOW(),1,0);
INSERT INTO `lists` (`id`, `cid`, `default_form`, `name`, `description`, `subscribers`, `created`, `public_subscribe`, `unsubscription_mode`) VALUES (2,'SktV4HDZ-',NULL,'#2 (one-step, with form)','',0,NOW(),1,1);
INSERT INTO `lists` (`id`, `cid`, `default_form`, `name`, `description`, `subscribers`, `created`, `public_subscribe`, `unsubscription_mode`) VALUES (3,'BkdvNBw-W',NULL,'#3 (two-step, no form)','',0,NOW(),1,2);
INSERT INTO `lists` (`id`, `cid`, `default_form`, `name`, `description`, `subscribers`, `created`, `public_subscribe`, `unsubscription_mode`) VALUES (4,'rJMKVrDZ-',NULL,'#4 (two-step, with form)','',0,NOW(),1,3);
@@ -356,6 +404,22 @@ CREATE TABLE `subscription__1` (
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`first_name` varchar(255) DEFAULT NULL,
`last_name` varchar(255) DEFAULT NULL,
+ `custom_text_field_byiiqjrw` varchar(255) DEFAULT NULL,
+ `custom_number_field_r1dd91awb` int(11) DEFAULT NULL,
+ `custom_website_field_rkq991cw` varchar(255) DEFAULT NULL,
+ `custom_gpg_public_key_ryvj51cz` text,
+ `custom_multiline_text_bjbfojawb` text,
+ `custom_json_skqjkcb` text,
+ `custom_date_mmddyy_rjkeojrzz` timestamp NULL DEFAULT NULL,
+ `custom_date_ddmmyy_ryedsk0wz` timestamp NULL DEFAULT NULL,
+ `custom_birthday_mmdd_h18coj0zz` timestamp NULL DEFAULT NULL,
+ `custom_birthday_ddmm_r1g3s1czz` timestamp NULL DEFAULT NULL,
+ `custom_dd_option_1_b1wwn1rzw` tinyint(4) unsigned NOT NULL DEFAULT '0',
+ `custom_drop_down_opt_2_hkzd2jcww` tinyint(4) unsigned NOT NULL DEFAULT '0',
+ `custom_drop_down_opt_3_rjghnyrz` tinyint(4) unsigned NOT NULL DEFAULT '0',
+ `custom_checkbox_option_1_by_l0jcwz` tinyint(4) unsigned NOT NULL DEFAULT '0',
+ `custom_checkbox_option_2_sjdprj0zz` tinyint(4) unsigned NOT NULL DEFAULT '0',
+ `custom_checkbox_option_3_bk2drjabz` tinyint(4) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
UNIQUE KEY `cid` (`cid`),
@@ -367,7 +431,8 @@ CREATE TABLE `subscription__1` (
KEY `latest_open` (`latest_open`),
KEY `latest_click` (`latest_click`),
KEY `created` (`created`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
+INSERT INTO `subscription__1` (`id`, `cid`, `email`, `opt_in_ip`, `opt_in_country`, `tz`, `imported`, `status`, `is_test`, `status_change`, `latest_open`, `latest_click`, `created`, `first_name`, `last_name`, `custom_text_field_byiiqjrw`, `custom_number_field_r1dd91awb`, `custom_website_field_rkq991cw`, `custom_gpg_public_key_ryvj51cz`, `custom_multiline_text_bjbfojawb`, `custom_json_skqjkcb`, `custom_date_mmddyy_rjkeojrzz`, `custom_date_ddmmyy_ryedsk0wz`, `custom_birthday_mmdd_h18coj0zz`, `custom_birthday_ddmm_r1g3s1czz`, `custom_dd_option_1_b1wwn1rzw`, `custom_drop_down_opt_2_hkzd2jcww`, `custom_drop_down_opt_3_rjghnyrz`, `custom_checkbox_option_1_by_l0jcwz`, `custom_checkbox_option_2_sjdprj0zz`, `custom_checkbox_option_3_bk2drjabz`) VALUES (1,'SJDW9J0Wb','keep.john.doe@mailtrain.org',NULL,NULL,'europe/zurich',NULL,1,1,NOW(),NOW(),NULL,NOW(),'John','Doe','Lorem Ipsum',42,'https://mailtrain.org','','Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.','',NOW(),NOW(),NOW(),NOW(),1,0,0,0,1,0);
CREATE TABLE `subscription__2` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`cid` varchar(255) CHARACTER SET ascii NOT NULL,