Show error when role-based email is used

[MAILPOET-2101]
This commit is contained in:
Pavel Dohnal
2019-06-19 15:12:27 +02:00
committed by M. Shull
parent 561649b25e
commit 51cfb48c75
4 changed files with 54 additions and 2 deletions

View File

@@ -126,7 +126,7 @@ jQuery(document).ready(() => {
jQuery('#subscribers_data_import_results:visible').hide();
// show parse statistics if any duplicate/invalid records were found
if (subscribers.invalid.length || subscribers.duplicate.length) {
if (subscribers.invalid.length || subscribers.duplicate.length || subscribers.role.length) {
// count repeating e-mails inside duplicate array and present them in
// 'email (xN)' format
duplicates = {};
@@ -145,7 +145,7 @@ jQuery(document).ready(() => {
importResults = {
notice: MailPoet.I18n.t('importNoticeSkipped').replace(
'%1$s',
`<strong>${subscribers.invalid.length + subscribers.duplicate.length}</strong>`
`<strong>${subscribers.invalid.length + subscribers.duplicate.length + subscribers.role.length}</strong>`
),
invalid: (subscribers.invalid.length)
? MailPoet.I18n.t('importNoticeInvalid')
@@ -157,6 +157,11 @@ jQuery(document).ready(() => {
.replace('%1$s', `<strong>${subscribers.duplicate.length}</strong>`)
.replace('%2$s', subscribers.duplicate.join(', '))
: null,
role: (subscribers.role.length)
? MailPoet.I18n.t('importNoticeRoleBased')
.replace('%1$s', `<strong>${subscribers.role.length.toLocaleString()}</strong>`)
.replace('%2$s', subscribers.role.join(', '))
: null,
};
jQuery('#subscribers_data_parse_results').html(
subscribersDataParseResultsTemplate(importResults)

View File

@@ -3,6 +3,42 @@
import jQuery from 'jquery';
import _ from 'underscore';
const ROLE_EMAILS = [
'abuse',
'compliance',
'devnull',
'dns',
'ftp',
'hostmaster',
'inoc',
'ispfeedback',
'ispsupport',
'list-request',
'list',
'maildaemon',
'noc',
'no-reply',
'noreply',
'null',
'phish',
'phishing',
'postmaster',
'privacy',
'registrar',
'root',
'security',
'spam',
'sysadmin',
'undisclosed-recipients',
'unsubscribe',
'usenet',
'uucp',
'webmaster',
'www',
];
const isRoleEmail = email => ROLE_EMAILS.findIndex(element => email.startsWith(element)) >= 0;
const detectAndCleanupEmail = (emailString) => {
let test;
// decode HTML entities
@@ -31,6 +67,9 @@ const detectAndCleanupEmail = (emailString) => {
if (!window.mailpoet_email_regex.test(email)) {
return false;
}
if (isRoleEmail(email)) {
return false;
}
return email;
};
@@ -39,6 +78,7 @@ function sanitizeCSVData(csvData) {
const parsedEmails = [];
const duplicateEmails = [];
const invalidEmails = [];
const roleEmails = [];
let emailColumnPosition = null;
let columnCount = null;
let isHeaderFound = false;
@@ -82,6 +122,8 @@ function sanitizeCSVData(csvData) {
email = detectAndCleanupEmail(rowData[emailColumnPosition]);
if (_.has(parsedEmails, email)) {
duplicateEmails.push(email);
} else if (isRoleEmail(rowData[emailColumnPosition])) {
roleEmails.push(rowData[emailColumnPosition]);
} else if (!window.mailpoet_email_regex.test(email)) {
invalidEmails.push(rowData[emailColumnPosition]);
} else {
@@ -116,6 +158,7 @@ function sanitizeCSVData(csvData) {
subscribersCount: processedSubscribers.length,
duplicate: duplicateEmails,
invalid: invalidEmails,
role: roleEmails,
};
}
return null;

View File

@@ -44,6 +44,7 @@
'noValidRecords': __('No valid records were found. This file needs to be formatted in a CSV style (comma-separated). Look at some [link]examples on our support site.[/link]'),
'importNoticeSkipped': __('%1$s records had issues and were skipped.'),
'importNoticeInvalid': __('%1$s emails are not valid: %2$s'),
'importNoticeRoleBased': _x('%1$s role-based addresses are not permitted: %2$s', 'Error message when importing addresses like postmaster@domain.com'),
'importNoticeDuplicate': __('%1$s emails appear more than once in your file: %2$s'),
'hideDetails': __('Hide details'),
'showDetails': __('Show more details'),

View File

@@ -14,6 +14,9 @@
{{#if invalid}}
<p>{{{invalid}}}</p>
{{/if}}
{{#if role}}
<p>{{{role}}}</p>
{{/if}}
</div>
</div>
</script>