MailPoet Newsletters (New) - Version 3.0.0-beta.36.3.1

Version Description

  • 2017-07-18 =
  • Added: you can now duplicate any item in the email designer;
  • Improved: added filter to specify custom SMTP connection timeout value. Thanks, Rik;
  • Improved: added a custom filter to whitelist JS/CSS styles that are loaded by other plugins on MailPoet's pages;
  • Fixed: sending is not interrupted if a newsletter contains URLs with unicode characters. Thanks Sam!
  • Fixed: sent date is reset when newsletter is duplicated;
  • Fixed: SMTP sending frequency is properly updated when changed;
  • Fixed: newsletter/form/subscriber listings no longer throw an error on some PHP 5.3 hosts. Thanks, Jrme!
Download this release

Release Info

Developer wysija
Plugin Icon 128x128 MailPoet Newsletters (New)
Version 3.0.0-beta.36.3.1
Comparing to
See all releases

Code changes from version 3.0.0-beta.36.3.0 to 3.0.0-beta.36.3.1

assets/css/{admin.c73ddfe6.css → admin.06d5a0b9.css} RENAMED
@@ -2780,16 +2780,68 @@ textarea.parsley-error {
2780
  }
2781
  #mailpoet_settings .mailpoet_sending_methods {
2782
  margin: 25px 0 0 0;
2783
- }
2784
- #mailpoet_settings .mailpoet_sending_methods li {
2785
- float: left;
2786
- position: relative;
2787
- padding: 15px 15px 0 15px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2788
  margin: 0 25px 25px 0;
2789
- width: 300px;
2790
- height: 300px;
2791
  border: 1px solid #dedede;
2792
  background-color: #fff;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2793
  }
2794
  #mailpoet_settings .mailpoet_sending_methods h3 {
2795
  text-align: center;
@@ -2800,12 +2852,32 @@ textarea.parsley-error {
2800
  font-size: 14px;
2801
  }
2802
  #mailpoet_settings .mailpoet_sending_methods .mailpoet_status {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2803
  background-color: #2f2f2f;
2804
  color: #fff;
2805
- position: absolute;
2806
- bottom: 0;
2807
- left: 0;
2808
- right: 0;
2809
  -o-text-overflow: ellipsis;
2810
  text-overflow: ellipsis;
2811
  padding: 15px;
@@ -2823,30 +2895,42 @@ textarea.parsley-error {
2823
  #mailpoet_settings .mailpoet_sending_methods .mailpoet_active #mailpoet_mta_activate {
2824
  visibility: hidden;
2825
  }
2826
- #mailpoet_settings .mailpoet_sending_methods .mailpoet_actions {
2827
- bottom: 15px;
2828
- color: #fff;
2829
- padding: 0;
2830
- position: absolute;
2831
- right: 15px;
2832
- }
2833
- #mailpoet_settings .mailpoet_sending_methods .mailpoet_actions .button-secondary {
2834
- margin: 0 -6px -4px 0;
2835
  }
2836
- #mailpoet_settings .mailpoet_key_valid::before {
2837
  content: '✔ ';
2838
  }
2839
- #mailpoet_settings .mailpoet_key_invalid::before {
2840
  content: '✗ ';
2841
  }
2842
  @media screen and (max-width: 782px) {
2843
  #mailpoet_settings .form-table th {
2844
  width: auto;
2845
  }
2846
- #mailpoet_settings .mailpoet_sending_methods li {
2847
- float: none;
2848
- width: auto;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2849
  margin-right: 0;
 
 
2850
  }
2851
  }
2852
  .mailpoet_progress {
@@ -2998,6 +3082,24 @@ textarea.parsley-error {
2998
  .mailpoet-about-wrap .feature-section.two-col h3 {
2999
  margin-top: 0;
3000
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3001
  .mailpoet-about-wrap .feature-section h4 {
3002
  margin: 1.4em 0 0.6em 0;
3003
  font-size: 1em;
2780
  }
2781
  #mailpoet_settings .mailpoet_sending_methods {
2782
  margin: 25px 0 0 0;
2783
+ display: -webkit-box;
2784
+ display: -moz-box;
2785
+ display: -webkit-flex;
2786
+ display: -ms-flexbox;
2787
+ display: box;
2788
+ display: flex;
2789
+ -webkit-box-orient: horizontal;
2790
+ -moz-box-orient: horizontal;
2791
+ -o-box-orient: horizontal;
2792
+ -webkit-flex-direction: row;
2793
+ -ms-flex-direction: row;
2794
+ flex-direction: row;
2795
+ -webkit-box-pack: start;
2796
+ -moz-box-pack: start;
2797
+ -o-box-pack: start;
2798
+ -ms-flex-pack: start;
2799
+ -webkit-justify-content: flex-start;
2800
+ justify-content: flex-start;
2801
+ }
2802
+ #mailpoet_settings .mailpoet_sending_methods > li {
2803
+ -webkit-box-flex: 1;
2804
+ -moz-box-flex: 1;
2805
+ -o-box-flex: 1;
2806
+ -ms-box-flex: 1;
2807
+ box-flex: 1;
2808
+ -webkit-flex-grow: 1;
2809
+ flex-grow: 1;
2810
+ -webkit-flex-shrink: 1;
2811
+ flex-shrink: 1;
2812
+ display: -webkit-box;
2813
+ display: -moz-box;
2814
+ display: -webkit-flex;
2815
+ display: -ms-flexbox;
2816
+ display: box;
2817
+ display: flex;
2818
+ -webkit-box-orient: vertical;
2819
+ -moz-box-orient: vertical;
2820
+ -o-box-orient: vertical;
2821
+ -webkit-flex-direction: column;
2822
+ -ms-flex-direction: column;
2823
+ flex-direction: column;
2824
+ -webkit-flex-basis: 0;
2825
+ flex-basis: 0;
2826
  margin: 0 25px 25px 0;
 
 
2827
  border: 1px solid #dedede;
2828
  background-color: #fff;
2829
+ max-width: 500px;
2830
+ }
2831
+ #mailpoet_settings .mailpoet_sending_methods > li .mailpoet_sending_method_description {
2832
+ padding: 25px;
2833
+ -webkit-box-flex: 1;
2834
+ -moz-box-flex: 1;
2835
+ -o-box-flex: 1;
2836
+ -ms-box-flex: 1;
2837
+ box-flex: 1;
2838
+ -webkit-flex-grow: 1;
2839
+ flex-grow: 1;
2840
+ -webkit-flex-shrink: 0;
2841
+ flex-shrink: 0;
2842
+ }
2843
+ #mailpoet_settings .mailpoet_sending_methods > li:last-child {
2844
+ margin-right: 0;
2845
  }
2846
  #mailpoet_settings .mailpoet_sending_methods h3 {
2847
  text-align: center;
2852
  font-size: 14px;
2853
  }
2854
  #mailpoet_settings .mailpoet_sending_methods .mailpoet_status {
2855
+ display: -webkit-box;
2856
+ display: -moz-box;
2857
+ display: -webkit-flex;
2858
+ display: -ms-flexbox;
2859
+ display: box;
2860
+ display: flex;
2861
+ -webkit-box-orient: horizontal;
2862
+ -moz-box-orient: horizontal;
2863
+ -o-box-orient: horizontal;
2864
+ -webkit-flex-direction: row;
2865
+ -ms-flex-direction: row;
2866
+ flex-direction: row;
2867
+ -webkit-box-pack: justify;
2868
+ -moz-box-pack: justify;
2869
+ -o-box-pack: justify;
2870
+ -ms-flex-pack: justify;
2871
+ -webkit-justify-content: space-between;
2872
+ justify-content: space-between;
2873
+ -webkit-box-align: center;
2874
+ -moz-box-align: center;
2875
+ -o-box-align: center;
2876
+ -ms-flex-align: center;
2877
+ -webkit-align-items: center;
2878
+ align-items: center;
2879
  background-color: #2f2f2f;
2880
  color: #fff;
 
 
 
 
2881
  -o-text-overflow: ellipsis;
2882
  text-overflow: ellipsis;
2883
  padding: 15px;
2895
  #mailpoet_settings .mailpoet_sending_methods .mailpoet_active #mailpoet_mta_activate {
2896
  visibility: hidden;
2897
  }
2898
+ #mailpoet_settings ul.sending-method-benefits {
2899
+ list-style-type: none;
2900
+ margin-bottom: 2em;
2901
+ margin-top: 2em;
 
 
 
 
 
2902
  }
2903
+ #mailpoet_settings .mailpoet_success_item::before {
2904
  content: '✔ ';
2905
  }
2906
+ #mailpoet_settings .mailpoet_error_item::before {
2907
  content: '✗ ';
2908
  }
2909
  @media screen and (max-width: 782px) {
2910
  #mailpoet_settings .form-table th {
2911
  width: auto;
2912
  }
2913
+ #mailpoet_settings .mailpoet_sending_methods {
2914
+ -webkit-box-orient: horizontal;
2915
+ -moz-box-orient: horizontal;
2916
+ -o-box-orient: horizontal;
2917
+ -webkit-box-lines: multiple;
2918
+ -moz-box-lines: multiple;
2919
+ -o-box-lines: multiple;
2920
+ -webkit-flex-flow: row wrap;
2921
+ -ms-flex-flow: row wrap;
2922
+ flex-flow: row wrap;
2923
+ -webkit-box-pack: distribute;
2924
+ -moz-box-pack: distribute;
2925
+ -o-box-pack: distribute;
2926
+ -ms-flex-pack: distribute;
2927
+ -webkit-justify-content: space-around;
2928
+ justify-content: space-around;
2929
+ }
2930
+ #mailpoet_settings .mailpoet_sending_methods > li {
2931
  margin-right: 0;
2932
+ -webkit-flex-basis: auto;
2933
+ flex-basis: auto;
2934
  }
2935
  }
2936
  .mailpoet_progress {
3082
  .mailpoet-about-wrap .feature-section.two-col h3 {
3083
  margin-top: 0;
3084
  }
3085
+ .mailpoet-about-wrap .feature-section.one-col {
3086
+ width: 700px;
3087
+ margin: 0 auto;
3088
+ text-align: center;
3089
+ }
3090
+ .mailpoet-about-wrap .feature-section.one-col > a.button {
3091
+ margin-top: 2em;
3092
+ }
3093
+ .mailpoet-about-wrap .feature-section.one-col-left {
3094
+ width: 700px;
3095
+ margin: 0 auto;
3096
+ }
3097
+ .mailpoet-about-wrap .feature-section h2.mailpoet-feature-top {
3098
+ margin: 50px auto;
3099
+ }
3100
+ .mailpoet-about-wrap .feature-section .lead-description ~ p {
3101
+ margin-top: 3em;
3102
+ }
3103
  .mailpoet-about-wrap .feature-section h4 {
3104
  margin: 1.4em 0 0.6em 0;
3105
  font-size: 1em;
assets/css/manifest.json CHANGED
@@ -1,5 +1,5 @@
1
  {
2
- "admin.css": "admin.c73ddfe6.css",
3
  "importExport.css": "importExport.b3745466.css",
4
  "newsletter_editor.css": "newsletter_editor.aace9f8f.css",
5
  "public.css": "public.cae357df.css",
1
  {
2
+ "admin.css": "admin.06d5a0b9.css",
3
  "importExport.css": "importExport.b3745466.css",
4
  "newsletter_editor.css": "newsletter_editor.aace9f8f.css",
5
  "public.css": "public.cae357df.css",
assets/js/{admin.65d0dc6d.js → admin.f15adcea.js} RENAMED
@@ -9473,8 +9473,8 @@ webpackJsonp([0],[
9473
  if (this.props.onChange) {
9474
  return this.props.onChange(e);
9475
  } else {
9476
- var item = this.state.item,
9477
- field = e.target.name;
9478
 
9479
  item[field] = e.target.value;
9480
 
@@ -9487,8 +9487,9 @@ webpackJsonp([0],[
9487
  render: function render() {
9488
  var _this3 = this;
9489
 
 
9490
  if (this.getErrors() !== undefined) {
9491
- var errors = this.getErrors().map(function (error, index) {
9492
  return React.createElement(
9493
  'p',
9494
  { key: 'error-' + index, className: 'mailpoet_error' },
@@ -26409,8 +26410,8 @@ webpackJsonp([0],[
26409
  },
26410
  MailPoet.I18n.t('delete')
26411
  )
26412
- ),
26413
- thumbnail = '';
26414
 
26415
  if (typeof template.thumbnail === 'string' && template.thumbnail.length > 0) {
26416
  thumbnail = React.createElement(
@@ -26678,8 +26679,8 @@ webpackJsonp([0],[
26678
  }
26679
  },
26680
  handleFormChange: function handleFormChange(e) {
26681
- var item = this.state.item,
26682
- field = e.target.name;
26683
 
26684
  item[field] = e.target.value;
26685
 
@@ -26754,9 +26755,11 @@ webpackJsonp([0],[
26754
 
26755
  !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(2), __webpack_require__(273), __webpack_require__(278), __webpack_require__(274), __webpack_require__(422)], __WEBPACK_AMD_DEFINE_RESULT__ = function (React, jQuery, _, MailPoet, Hooks) {
26756
 
26757
- var currentTime = window.mailpoet_current_time || '00:00',
26758
- defaultDateTime = window.mailpoet_current_date + ' ' + '00:00:00';
26759
- timeOfDayItems = window.mailpoet_schedule_time_of_day, dateDisplayFormat = window.mailpoet_date_display_format, dateStorageFormat = window.mailpoet_date_storage_format;
 
 
26760
 
26761
  var datepickerTranslations = {
26762
  closeText: MailPoet.I18n.t('close'),
@@ -26775,15 +26778,15 @@ webpackJsonp([0],[
26775
 
26776
  onChange: function onChange(event) {
26777
  // Swap display format to storage format
26778
- var displayDate = event.target.value,
26779
- storageDate = this.getStorageDate(displayDate);
26780
 
26781
  event.target.value = storageDate;
26782
  this.props.onChange(event);
26783
  },
26784
  componentDidMount: function componentDidMount() {
26785
- var $element = jQuery(this.refs.dateInput),
26786
- that = this;
26787
  if ($element.datepicker) {
26788
  // Override jQuery UI datepicker Date parsing and formatting
26789
  jQuery.datepicker.parseDate = function (format, value) {
@@ -26952,8 +26955,8 @@ webpackJsonp([0],[
26952
  });
26953
  },
26954
  handleValueChange: function handleValueChange(event) {
26955
- var oldValue = this._getCurrentValue(),
26956
- newValue = {};
26957
  newValue[event.target.name] = event.target.value;
26958
 
26959
  return this.props.onValueChange({
@@ -26978,7 +26981,7 @@ webpackJsonp([0],[
26978
  };
26979
  },
26980
  render: function render() {
26981
- var schedulingOptions;
26982
 
26983
  if (this.isScheduled()) {
26984
  schedulingOptions = React.createElement(
9473
  if (this.props.onChange) {
9474
  return this.props.onChange(e);
9475
  } else {
9476
+ var item = this.state.item;
9477
+ var field = e.target.name;
9478
 
9479
  item[field] = e.target.value;
9480
 
9487
  render: function render() {
9488
  var _this3 = this;
9489
 
9490
+ var errors = undefined;
9491
  if (this.getErrors() !== undefined) {
9492
+ errors = this.getErrors().map(function (error, index) {
9493
  return React.createElement(
9494
  'p',
9495
  { key: 'error-' + index, className: 'mailpoet_error' },
26410
  },
26411
  MailPoet.I18n.t('delete')
26412
  )
26413
+ );
26414
+ var thumbnail = '';
26415
 
26416
  if (typeof template.thumbnail === 'string' && template.thumbnail.length > 0) {
26417
  thumbnail = React.createElement(
26679
  }
26680
  },
26681
  handleFormChange: function handleFormChange(e) {
26682
+ var item = this.state.item;
26683
+ var field = e.target.name;
26684
 
26685
  item[field] = e.target.value;
26686
 
26755
 
26756
  !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(2), __webpack_require__(273), __webpack_require__(278), __webpack_require__(274), __webpack_require__(422)], __WEBPACK_AMD_DEFINE_RESULT__ = function (React, jQuery, _, MailPoet, Hooks) {
26757
 
26758
+ var currentTime = window.mailpoet_current_time || '00:00';
26759
+ var defaultDateTime = window.mailpoet_current_date + ' ' + '00:00:00';
26760
+ var timeOfDayItems = window.mailpoet_schedule_time_of_day;
26761
+ var dateDisplayFormat = window.mailpoet_date_display_format;
26762
+ var dateStorageFormat = window.mailpoet_date_storage_format;
26763
 
26764
  var datepickerTranslations = {
26765
  closeText: MailPoet.I18n.t('close'),
26778
 
26779
  onChange: function onChange(event) {
26780
  // Swap display format to storage format
26781
+ var displayDate = event.target.value;
26782
+ var storageDate = this.getStorageDate(displayDate);
26783
 
26784
  event.target.value = storageDate;
26785
  this.props.onChange(event);
26786
  },
26787
  componentDidMount: function componentDidMount() {
26788
+ var $element = jQuery(this.refs.dateInput);
26789
+ var that = this;
26790
  if ($element.datepicker) {
26791
  // Override jQuery UI datepicker Date parsing and formatting
26792
  jQuery.datepicker.parseDate = function (format, value) {
26955
  });
26956
  },
26957
  handleValueChange: function handleValueChange(event) {
26958
+ var oldValue = this._getCurrentValue();
26959
+ var newValue = {};
26960
  newValue[event.target.name] = event.target.value;
26961
 
26962
  return this.props.onValueChange({
26981
  };
26982
  },
26983
  render: function render() {
26984
+ var schedulingOptions = undefined;
26985
 
26986
  if (this.isScheduled()) {
26987
  schedulingOptions = React.createElement(
assets/js/{admin_vendor.927b0f96.js → admin_vendor.e019c409.js} RENAMED
@@ -31207,7 +31207,7 @@ webpackJsonp([1],[
31207
 
31208
  var classes = classNames('tablenav-pages', { 'one-page': this.props.count <= this.props.limit });
31209
 
31210
- var numberOfItemsLabel;
31211
  if (this.props.count == 1) {
31212
  numberOfItemsLabel = MailPoet.I18n.t('numberOfItemsSingular');
31213
  } else {
31207
 
31208
  var classes = classNames('tablenav-pages', { 'one-page': this.props.count <= this.props.limit });
31209
 
31210
+ var numberOfItemsLabel = undefined;
31211
  if (this.props.count == 1) {
31212
  numberOfItemsLabel = MailPoet.I18n.t('numberOfItemsSingular');
31213
  } else {
assets/js/manifest.json CHANGED
@@ -1,10 +1,10 @@
1
  {
2
  "mp2migrator.js": "mp2migrator.f7fa3be5.js",
3
  "public.js": "public.0e89cdab.js",
4
- "admin.js": "admin.65d0dc6d.js",
5
- "admin_vendor.js": "admin_vendor.927b0f96.js",
6
  "form_editor.js": "form_editor.e0b22679.js",
7
  "mailpoet.js": "mailpoet.0ebf4b66.js",
8
- "newsletter_editor.js": "newsletter_editor.7d386d8d.js",
9
- "vendor.js": "vendor.c136ccd7.js"
10
  }
1
  {
2
  "mp2migrator.js": "mp2migrator.f7fa3be5.js",
3
  "public.js": "public.0e89cdab.js",
4
+ "admin.js": "admin.f15adcea.js",
5
+ "admin_vendor.js": "admin_vendor.e019c409.js",
6
  "form_editor.js": "form_editor.e0b22679.js",
7
  "mailpoet.js": "mailpoet.0ebf4b66.js",
8
+ "newsletter_editor.js": "newsletter_editor.cec09cf2.js",
9
+ "vendor.js": "vendor.6d57818a.js"
10
  }
assets/js/{newsletter_editor.7d386d8d.js → newsletter_editor.cec09cf2.js} RENAMED
@@ -34229,6 +34229,7 @@ webpackJsonp([4],{
34229
  modelEvents: {
34230
  'change': 'render',
34231
  'delete': 'deleteBlock',
 
34232
  },
34233
  events: {
34234
  "mouseenter": "showTools",
@@ -34319,6 +34320,9 @@ webpackJsonp([4],{
34319
  this.model.destroy();
34320
  }.bind(this));
34321
  },
 
 
 
34322
  transitionIn: function() {
34323
  return this._transition('slideDown', 'fadeIn', 'easeOut');
34324
  },
@@ -34357,11 +34361,13 @@ webpackJsonp([4],{
34357
  "click .mailpoet_delete_block_activate": "showDeletionConfirmation",
34358
  "click .mailpoet_delete_block_cancel": "hideDeletionConfirmation",
34359
  "click .mailpoet_delete_block_confirm": "deleteBlock",
 
34360
  },
34361
  // Markers of whether these particular tools will be used for this instance
34362
  tools: {
34363
  settings: true,
34364
  delete: true,
 
34365
  move: true,
34366
  },
34367
  getSettingsView: function() { return Module.BlockSettingsView; },
@@ -34398,6 +34404,11 @@ webpackJsonp([4],{
34398
  this.model.trigger('delete');
34399
  return false;
34400
  },
 
 
 
 
 
34401
  });
34402
 
34403
  Module.BlockSettingsView = Marionette.View.extend({
@@ -34642,6 +34653,7 @@ webpackJsonp([4],{
34642
  tools: {
34643
  settings: this.renderOptions.depth === 1,
34644
  delete: this.renderOptions.depth === 1,
 
34645
  move: this.renderOptions.depth === 1,
34646
  layerSelector: false,
34647
  },
34229
  modelEvents: {
34230
  'change': 'render',
34231
  'delete': 'deleteBlock',
34232
+ 'duplicate': 'duplicateBlock',
34233
  },
34234
  events: {
34235
  "mouseenter": "showTools",
34320
  this.model.destroy();
34321
  }.bind(this));
34322
  },
34323
+ duplicateBlock: function() {
34324
+ this.model.collection.add(this.model.toJSON(), {at: this.model.collection.findIndex(this.model)});
34325
+ },
34326
  transitionIn: function() {
34327
  return this._transition('slideDown', 'fadeIn', 'easeOut');
34328
  },
34361
  "click .mailpoet_delete_block_activate": "showDeletionConfirmation",
34362
  "click .mailpoet_delete_block_cancel": "hideDeletionConfirmation",
34363
  "click .mailpoet_delete_block_confirm": "deleteBlock",
34364
+ "click .mailpoet_duplicate_block": "duplicateBlock",
34365
  },
34366
  // Markers of whether these particular tools will be used for this instance
34367
  tools: {
34368
  settings: true,
34369
  delete: true,
34370
+ duplicate: true,
34371
  move: true,
34372
  },
34373
  getSettingsView: function() { return Module.BlockSettingsView; },
34404
  this.model.trigger('delete');
34405
  return false;
34406
  },
34407
+ duplicateBlock: function(event) {
34408
+ event.preventDefault();
34409
+ this.model.trigger('duplicate');
34410
+ return false;
34411
+ },
34412
  });
34413
 
34414
  Module.BlockSettingsView = Marionette.View.extend({
34653
  tools: {
34654
  settings: this.renderOptions.depth === 1,
34655
  delete: this.renderOptions.depth === 1,
34656
+ duplicate: true,
34657
  move: this.renderOptions.depth === 1,
34658
  layerSelector: false,
34659
  },
assets/js/{vendor.c136ccd7.js → vendor.6d57818a.js} RENAMED
@@ -76,7 +76,7 @@
76
  /******/ script.charset = 'utf-8';
77
  /******/ script.async = true;
78
 
79
- /******/ script.src = __webpack_require__.p + "" + ({"0":"admin","1":"admin_vendor","2":"form_editor","3":"mailpoet","4":"newsletter_editor"}[chunkId]||chunkId) + "." + {"0":"65d0dc6d","1":"927b0f96","2":"e0b22679","3":"0ebf4b66","4":"7d386d8d"}[chunkId] + ".chunk.js";
80
  /******/ head.appendChild(script);
81
  /******/ }
82
  /******/ };
76
  /******/ script.charset = 'utf-8';
77
  /******/ script.async = true;
78
 
79
+ /******/ script.src = __webpack_require__.p + "" + ({"0":"admin","1":"admin_vendor","2":"form_editor","3":"mailpoet","4":"newsletter_editor"}[chunkId]||chunkId) + "." + {"0":"f15adcea","1":"e019c409","2":"e0b22679","3":"0ebf4b66","4":"cec09cf2"}[chunkId] + ".chunk.js";
80
  /******/ head.appendChild(script);
81
  /******/ }
82
  /******/ };
lang/mailpoet.pot CHANGED
@@ -4,7 +4,7 @@ msgid ""
4
  msgstr ""
5
  "Project-Id-Version: \n"
6
  "Report-Msgid-Bugs-To: http://support.mailpoet.com/\n"
7
- "POT-Creation-Date: 2017-07-11 11:33:48+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -365,8 +365,8 @@ msgstr ""
365
  msgid "Export"
366
  msgstr ""
367
 
368
- #: lib/Config/Menu.php:222 lib/Config/Menu.php:223 views/update.html:20
369
- #: views/welcome.html:29
370
  msgid "Welcome"
371
  msgstr ""
372
 
@@ -1023,6 +1023,12 @@ msgstr ""
1023
  msgid "Daemon does not exist."
1024
  msgstr ""
1025
 
 
 
 
 
 
 
1026
  #: lib/Form/Block/Base.php:10
1027
  msgid "Please specify a valid email address."
1028
  msgstr ""
@@ -1201,12 +1207,12 @@ msgid "Unsupported Amazon SES region"
1201
  msgstr ""
1202
 
1203
  #: lib/Mailer/Methods/AmazonSES.php:64 lib/Mailer/Methods/PHPMail.php:36
1204
- #: lib/Mailer/Methods/SMTP.php:119 lib/Mailer/Methods/SendGrid.php:32
1205
  msgid "%s has returned an unknown error."
1206
  msgstr ""
1207
 
1208
  #: lib/Mailer/Methods/AmazonSES.php:66 lib/Mailer/Methods/PHPMail.php:38
1209
- #: lib/Mailer/Methods/SMTP.php:122 lib/Mailer/Methods/SendGrid.php:34
1210
  msgid "Unprocessed subscriber"
1211
  msgstr ""
1212
 
@@ -1227,12 +1233,12 @@ msgstr ""
1227
  msgid "Please specify a type."
1228
  msgstr ""
1229
 
1230
- #: lib/Models/Form.php:93 lib/Models/Newsletter.php:646
1231
  #: lib/Models/Segment.php:133 lib/Models/Subscriber.php:342
1232
  msgid "All"
1233
  msgstr ""
1234
 
1235
- #: lib/Models/Form.php:98 lib/Models/Newsletter.php:716
1236
  #: lib/Models/Segment.php:138 lib/Models/Subscriber.php:367 views/forms.html:66
1237
  #: views/newsletters.html:77 views/segments.html:50
1238
  #: views/subscribers/subscribers.html:37
@@ -1243,38 +1249,38 @@ msgstr ""
1243
  msgid "Another record already exists. Please specify a different \"%1$s\"."
1244
  msgstr ""
1245
 
1246
- #: lib/Models/Newsletter.php:388
1247
  msgid "Deleted list"
1248
  msgstr ""
1249
 
1250
- #: lib/Models/Newsletter.php:547 lib/Models/Subscriber.php:278
1251
  #: lib/Subscribers/ImportExport/Export/Export.php:170
1252
  msgid "All Lists"
1253
  msgstr ""
1254
 
1255
- #: lib/Models/Newsletter.php:658
1256
  #: views/newsletter/templates/blocks/posts/settingsSelection.hbs:12
1257
  msgid "Draft"
1258
  msgstr ""
1259
 
1260
- #: lib/Models/Newsletter.php:666
1261
  #: views/newsletter/templates/blocks/posts/settingsSelection.hbs:11
1262
  msgid "Scheduled"
1263
  msgstr ""
1264
 
1265
- #: lib/Models/Newsletter.php:674
1266
  msgid "Sending"
1267
  msgstr ""
1268
 
1269
- #: lib/Models/Newsletter.php:682
1270
  msgid "Sent"
1271
  msgstr ""
1272
 
1273
- #: lib/Models/Newsletter.php:696 views/newsletters.html:85
1274
  msgid "Active"
1275
  msgstr ""
1276
 
1277
- #: lib/Models/Newsletter.php:704
1278
  msgid "Not active"
1279
  msgstr ""
1280
 
@@ -1631,19 +1637,19 @@ msgstr ""
1631
  msgid "Accidentally unsubscribed?"
1632
  msgstr ""
1633
 
1634
- #: lib/Twig/Functions.php:88 views/settings/mta.html:1068
1635
  msgid "every minute"
1636
  msgstr ""
1637
 
1638
- #: lib/Twig/Functions.php:89 views/settings/mta.html:1069
1639
  msgid "every %1$d minutes"
1640
  msgstr ""
1641
 
1642
- #: lib/Twig/Functions.php:90 views/settings/mta.html:1070
1643
  msgid "every hour"
1644
  msgstr ""
1645
 
1646
- #: lib/Twig/Functions.php:91 views/settings/mta.html:1071
1647
  msgid "every %1$d hours"
1648
  msgstr ""
1649
 
@@ -1837,7 +1843,7 @@ msgstr ""
1837
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:221
1838
  #: views/premium.html:54 views/settings/advanced.html:90
1839
  #: views/settings/advanced.html:130 views/settings/bounce.html:190
1840
- #: views/settings/mta.html:602 views/settings/signup.html:34
1841
  #: views/subscribers/importExport/export.html:33
1842
  #: views/subscribers/importExport/import/step2.html:63
1843
  msgid "Yes"
@@ -1856,8 +1862,8 @@ msgstr ""
1856
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:227
1857
  #: views/premium.html:60 views/premium.html:61 views/settings/advanced.html:101
1858
  #: views/settings/advanced.html:141 views/settings/bounce.html:148
1859
- #: views/settings/bounce.html:179 views/settings/mta.html:559
1860
- #: views/settings/mta.html:613 views/settings/signup.html:46
1861
  #: views/subscribers/importExport/export.html:38
1862
  #: views/subscribers/importExport/import/step2.html:67
1863
  msgid "No"
@@ -2158,7 +2164,9 @@ msgstr ""
2158
  msgid "Edit"
2159
  msgstr ""
2160
 
2161
- #: views/forms.html:64 views/newsletters.html:80 views/segments.html:41
 
 
2162
  msgid "Duplicate"
2163
  msgstr ""
2164
 
@@ -2756,7 +2764,7 @@ msgstr ""
2756
  msgid "Cancel deletion"
2757
  msgstr ""
2758
 
2759
- #: views/newsletter/templates/blocks/base/toolsGeneric.hbs:6
2760
  msgid "Drag to move"
2761
  msgstr ""
2762
 
@@ -3286,8 +3294,8 @@ msgid ""
3286
  "number."
3287
  msgstr ""
3288
 
3289
- #: views/newsletters.html:131 views/settings/mta.html:104
3290
- #: views/settings/mta.html:668
3291
  msgid "Activate"
3292
  msgstr ""
3293
 
@@ -4129,11 +4137,11 @@ msgstr ""
4129
  msgid "Hostname"
4130
  msgstr ""
4131
 
4132
- #: views/settings/bounce.html:50 views/settings/mta.html:508
4133
  msgid "Login"
4134
  msgstr ""
4135
 
4136
- #: views/settings/bounce.html:67 views/settings/mta.html:531
4137
  msgid "Password"
4138
  msgstr ""
4139
 
@@ -4185,205 +4193,235 @@ msgstr ""
4185
  msgid "Is it working? Try to connect"
4186
  msgstr ""
4187
 
4188
- #: views/settings/mta.html:75
4189
  msgid "You're now sending with MailPoet!"
4190
  msgstr ""
4191
 
4192
- #: views/settings/mta.html:77
4193
  msgid "Great, you're all set up. Your emails will now be sent quickly and reliably!"
4194
  msgstr ""
4195
 
4196
- #: views/settings/mta.html:84
4197
  msgid "Solve all of your sending problems!"
4198
  msgstr ""
4199
 
4200
- #: views/settings/mta.html:86
4201
  msgid ""
4202
  "Let MailPoet send your emails and get the Premium features for as little as "
4203
  "10 dollars or euros per month."
4204
  msgstr ""
4205
 
4206
- #: views/settings/mta.html:92 views/welcome.html:50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4207
  msgid "Find out more"
4208
  msgstr ""
4209
 
4210
- #: views/settings/mta.html:96 views/settings/mta.html:119
4211
  msgid "Activated"
4212
  msgstr ""
4213
 
4214
- #: views/settings/mta.html:111
4215
  msgid "Other"
4216
  msgstr ""
4217
 
4218
- #: views/settings/mta.html:113
4219
  msgid "Send with your website or third party"
4220
  msgstr ""
4221
 
4222
- #: views/settings/mta.html:115
4223
  msgid ""
4224
  "Choose to send emails through your website (not recommended) or a third "
4225
  "party sender."
4226
  msgstr ""
4227
 
4228
  #: views/settings/mta.html:125
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4229
  msgid "Configure"
4230
  msgstr ""
4231
 
4232
- #: views/settings/mta.html:131
4233
  msgid ""
4234
  "Need help to pick? [link]Check out the comparison table of sending "
4235
  "methods[/link]."
4236
  msgstr ""
4237
 
4238
- #: views/settings/mta.html:145
4239
  msgid "Method"
4240
  msgstr ""
4241
 
4242
- #: views/settings/mta.html:155
4243
  msgid "Your web host / web server"
4244
  msgstr ""
4245
 
4246
- #: views/settings/mta.html:164
4247
  msgid "SMTP"
4248
  msgstr ""
4249
 
4250
- #: views/settings/mta.html:167
4251
  msgid "Select your provider"
4252
  msgstr ""
4253
 
4254
- #: views/settings/mta.html:192
4255
  msgid "Your web host"
4256
  msgstr ""
4257
 
4258
- #: views/settings/mta.html:208
4259
  msgid "Select your web host"
4260
  msgstr ""
4261
 
4262
- #: views/settings/mta.html:231
4263
  msgid "Sending frequency"
4264
  msgstr ""
4265
 
4266
- #: views/settings/mta.html:242
4267
  msgid "Recommended"
4268
  msgstr ""
4269
 
4270
- #: views/settings/mta.html:251
4271
  msgid "I'll set my own frequency"
4272
  msgstr ""
4273
 
4274
- #: views/settings/mta.html:275
4275
  msgid "emails"
4276
  msgstr ""
4277
 
4278
- #: views/settings/mta.html:292
4279
  msgid "recommended"
4280
  msgstr ""
4281
 
4282
- #: views/settings/mta.html:301
4283
  msgid ""
4284
  "<strong>Warning!</strong> Sending more than the recommended amount of "
4285
  "emails? You may break the terms of your web host or provider!"
4286
  msgstr ""
4287
 
4288
- #: views/settings/mta.html:303
4289
  msgid ""
4290
  "Please ask your host for the maximum number of emails you are allowed to "
4291
  "send per day."
4292
  msgstr ""
4293
 
4294
- #: views/settings/mta.html:317
4295
  msgid "SMTP Hostname"
4296
  msgstr ""
4297
 
4298
- #: views/settings/mta.html:320 views/settings/mta.html:461
4299
  msgid "e.g.: smtp.mydomain.com"
4300
  msgstr ""
4301
 
4302
- #: views/settings/mta.html:342
4303
  msgid "SMTP Port"
4304
  msgstr ""
4305
 
4306
- #: views/settings/mta.html:369
4307
  msgid "Region"
4308
  msgstr ""
4309
 
4310
- #: views/settings/mta.html:404
4311
  msgid "Access Key"
4312
  msgstr ""
4313
 
4314
- #: views/settings/mta.html:431
4315
  msgid "Secret Key"
4316
  msgstr ""
4317
 
4318
- #: views/settings/mta.html:458
4319
- msgid "Domain"
4320
- msgstr ""
4321
-
4322
- #: views/settings/mta.html:484
4323
  msgid "API Key"
4324
  msgstr ""
4325
 
4326
- #: views/settings/mta.html:554
4327
  msgid "Secure Connection"
4328
  msgstr ""
4329
 
4330
- #: views/settings/mta.html:585
4331
  msgid "Authentication"
4332
  msgstr ""
4333
 
4334
- #: views/settings/mta.html:588
4335
  msgid ""
4336
  "Leave this option set to Yes. Only a tiny portion of SMTP services prefer "
4337
  "Authentication to be turned off."
4338
  msgstr ""
4339
 
4340
- #: views/settings/mta.html:627
4341
  msgid "SPF Signature (Highly recommended!)"
4342
  msgstr ""
4343
 
4344
- #: views/settings/mta.html:630
4345
  msgid ""
4346
  "This improves your delivery rate by verifying that you're allowed to send "
4347
  "emails from your domain."
4348
  msgstr ""
4349
 
4350
- #: views/settings/mta.html:635
4351
  msgid ""
4352
  "SPF is set up in your DNS. Read your host's support documentation for more "
4353
  "information."
4354
  msgstr ""
4355
 
4356
- #: views/settings/mta.html:643
4357
  msgid "Test the sending method"
4358
  msgstr ""
4359
 
4360
- #: views/settings/mta.html:657
4361
  msgid "Send a test email"
4362
  msgstr ""
4363
 
4364
- #: views/settings/mta.html:673
4365
  msgid "or Cancel"
4366
  msgstr ""
4367
 
4368
- #: views/settings/mta.html:712
4369
  msgid ""
4370
  "The email could not be sent. Make sure the option \"Email notifications\" "
4371
  "has a FROM email address in the Basics tab."
4372
  msgstr ""
4373
 
4374
- #: views/settings/mta.html:725
4375
  msgid "This is a Sending Method Test"
4376
  msgstr ""
4377
 
4378
- #: views/settings/mta.html:727 views/settings/mta.html:728
4379
  msgid "Yup, it works! You can start blasting away emails to the moon."
4380
  msgstr ""
4381
 
4382
- #: views/settings/mta.html:737
4383
  msgid "The email has been sent! Check your inbox."
4384
  msgstr ""
4385
 
4386
- #: views/settings/mta.html:781
4387
  msgid "You have selected an invalid sending method."
4388
  msgstr ""
4389
 
@@ -4926,100 +4964,127 @@ msgid ""
4926
  msgstr ""
4927
 
4928
  #: views/update.html:13 views/welcome.html:22
4929
- msgid "Welcome to MailPoet"
4930
  msgstr ""
4931
 
4932
  #: views/update.html:15 views/welcome.html:24
4933
  msgid ""
4934
- "Thank you for helping us test and improve this new version of MailPoet. "
4935
- "You're one of our extra-special beta testers. We really appreciate your "
4936
- "help!"
4937
  msgstr ""
4938
 
4939
- #: views/update.html:21
4940
  msgid "What's New"
4941
  msgstr ""
4942
 
4943
- #: views/update.html:25
4944
  msgid "List of Changes"
4945
  msgstr ""
4946
 
4947
- #: views/update.html:37
4948
  msgid "See readme.txt for a changelog."
4949
  msgstr ""
4950
 
4951
- #: views/update.html:45 views/welcome.html:85
4952
- msgid "Awesome! Now, take me to MailPoet"
4953
  msgstr ""
4954
 
4955
- #: views/update.html:45
4956
- msgid "View all changes"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4957
  msgstr ""
4958
 
4959
- #: views/welcome.html:26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4960
  msgid "MailPoet Logo"
4961
  msgstr ""
4962
 
4963
- #: views/welcome.html:30
4964
  msgid "What's new"
4965
  msgstr ""
4966
 
4967
- #: views/welcome.html:42
4968
  msgid "Want to Make MailPoet Even Better?"
4969
  msgstr ""
4970
 
4971
- #: views/welcome.html:44
4972
  msgid "We Need Your Feedback!"
4973
  msgstr ""
4974
 
4975
- #: views/welcome.html:45
4976
  msgid ""
4977
  "As a beta tester, you have a very important job: to tell us what you think "
4978
  "about this new version. If you love it, tell us! If you hate it, let us "
4979
  "know! Any and all feedback is useful."
4980
  msgstr ""
4981
 
4982
- #: views/welcome.html:46
4983
  msgid ""
4984
  "To get in touch with us, simply click on the blue circle in the bottom "
4985
  "right corner of your screen. This button is visible on all MailPoet pages "
4986
  "on your WordPress dashboard."
4987
  msgstr ""
4988
 
4989
- #: views/welcome.html:49
4990
  msgid "Sharing is Caring"
4991
  msgstr ""
4992
 
4993
- #: views/welcome.html:50
4994
  msgid ""
4995
  "By sharing your data <i>anonymously</i> with us, you can help us understand "
4996
  "<i>how people use MailPoet</i> and <i>what sort of features they like and "
4997
  "don't like</i>."
4998
  msgstr ""
4999
 
5000
- #: views/welcome.html:55
5001
  msgid "Yes, I want to help!"
5002
  msgstr ""
5003
 
5004
- #: views/welcome.html:65 views/welcome.html:69
5005
  msgid "Subscribe To Our Newsletter"
5006
  msgstr ""
5007
 
5008
- #: views/welcome.html:66
5009
  msgid "About once a month, we send out a pretty cool newsletter ourselves."
5010
  msgstr ""
5011
 
5012
- #: views/welcome.html:67
5013
  msgid ""
5014
  "Sign up to get a curated selection of awesome links, tips and tricks for "
5015
  "using MailPoet, special offers, and important plugin updates!"
5016
  msgstr ""
5017
 
5018
- #: views/welcome.html:73
5019
  msgid "Learn the Ropes"
5020
  msgstr ""
5021
 
5022
- #: views/welcome.html:74
5023
  msgid ""
5024
  "New to MailPoet? Check out our brand new email course. Over the span of 3 "
5025
  "weeks, we'll teach you how to create and send your first MailPoet email "
4
  msgstr ""
5
  "Project-Id-Version: \n"
6
  "Report-Msgid-Bugs-To: http://support.mailpoet.com/\n"
7
+ "POT-Creation-Date: 2017-07-18 10:51:01+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
365
  msgid "Export"
366
  msgstr ""
367
 
368
+ #: lib/Config/Menu.php:222 lib/Config/Menu.php:223 views/update.html:23
369
+ #: views/welcome.html:32
370
  msgid "Welcome"
371
  msgstr ""
372
 
1023
  msgid "Daemon does not exist."
1024
  msgstr ""
1025
 
1026
+ #: lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php:95
1027
+ msgid ""
1028
+ "There was an error processing your newsletter during sending. If possible, "
1029
+ "please contact us and report this issue."
1030
+ msgstr ""
1031
+
1032
  #: lib/Form/Block/Base.php:10
1033
  msgid "Please specify a valid email address."
1034
  msgstr ""
1207
  msgstr ""
1208
 
1209
  #: lib/Mailer/Methods/AmazonSES.php:64 lib/Mailer/Methods/PHPMail.php:36
1210
+ #: lib/Mailer/Methods/SMTP.php:120 lib/Mailer/Methods/SendGrid.php:32
1211
  msgid "%s has returned an unknown error."
1212
  msgstr ""
1213
 
1214
  #: lib/Mailer/Methods/AmazonSES.php:66 lib/Mailer/Methods/PHPMail.php:38
1215
+ #: lib/Mailer/Methods/SMTP.php:123 lib/Mailer/Methods/SendGrid.php:34
1216
  msgid "Unprocessed subscriber"
1217
  msgstr ""
1218
 
1233
  msgid "Please specify a type."
1234
  msgstr ""
1235
 
1236
+ #: lib/Models/Form.php:93 lib/Models/Newsletter.php:649
1237
  #: lib/Models/Segment.php:133 lib/Models/Subscriber.php:342
1238
  msgid "All"
1239
  msgstr ""
1240
 
1241
+ #: lib/Models/Form.php:98 lib/Models/Newsletter.php:719
1242
  #: lib/Models/Segment.php:138 lib/Models/Subscriber.php:367 views/forms.html:66
1243
  #: views/newsletters.html:77 views/segments.html:50
1244
  #: views/subscribers/subscribers.html:37
1249
  msgid "Another record already exists. Please specify a different \"%1$s\"."
1250
  msgstr ""
1251
 
1252
+ #: lib/Models/Newsletter.php:391
1253
  msgid "Deleted list"
1254
  msgstr ""
1255
 
1256
+ #: lib/Models/Newsletter.php:550 lib/Models/Subscriber.php:278
1257
  #: lib/Subscribers/ImportExport/Export/Export.php:170
1258
  msgid "All Lists"
1259
  msgstr ""
1260
 
1261
+ #: lib/Models/Newsletter.php:661
1262
  #: views/newsletter/templates/blocks/posts/settingsSelection.hbs:12
1263
  msgid "Draft"
1264
  msgstr ""
1265
 
1266
+ #: lib/Models/Newsletter.php:669
1267
  #: views/newsletter/templates/blocks/posts/settingsSelection.hbs:11
1268
  msgid "Scheduled"
1269
  msgstr ""
1270
 
1271
+ #: lib/Models/Newsletter.php:677
1272
  msgid "Sending"
1273
  msgstr ""
1274
 
1275
+ #: lib/Models/Newsletter.php:685
1276
  msgid "Sent"
1277
  msgstr ""
1278
 
1279
+ #: lib/Models/Newsletter.php:699 views/newsletters.html:85
1280
  msgid "Active"
1281
  msgstr ""
1282
 
1283
+ #: lib/Models/Newsletter.php:707
1284
  msgid "Not active"
1285
  msgstr ""
1286
 
1637
  msgid "Accidentally unsubscribed?"
1638
  msgstr ""
1639
 
1640
+ #: lib/Twig/Functions.php:88 views/settings/mta.html:1055
1641
  msgid "every minute"
1642
  msgstr ""
1643
 
1644
+ #: lib/Twig/Functions.php:89 views/settings/mta.html:1056
1645
  msgid "every %1$d minutes"
1646
  msgstr ""
1647
 
1648
+ #: lib/Twig/Functions.php:90 views/settings/mta.html:1057
1649
  msgid "every hour"
1650
  msgstr ""
1651
 
1652
+ #: lib/Twig/Functions.php:91 views/settings/mta.html:1058
1653
  msgid "every %1$d hours"
1654
  msgstr ""
1655
 
1843
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:221
1844
  #: views/premium.html:54 views/settings/advanced.html:90
1845
  #: views/settings/advanced.html:130 views/settings/bounce.html:190
1846
+ #: views/settings/mta.html:589 views/settings/signup.html:34
1847
  #: views/subscribers/importExport/export.html:33
1848
  #: views/subscribers/importExport/import/step2.html:63
1849
  msgid "Yes"
1862
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:227
1863
  #: views/premium.html:60 views/premium.html:61 views/settings/advanced.html:101
1864
  #: views/settings/advanced.html:141 views/settings/bounce.html:148
1865
+ #: views/settings/bounce.html:179 views/settings/mta.html:546
1866
+ #: views/settings/mta.html:600 views/settings/signup.html:46
1867
  #: views/subscribers/importExport/export.html:38
1868
  #: views/subscribers/importExport/import/step2.html:67
1869
  msgid "No"
2164
  msgid "Edit"
2165
  msgstr ""
2166
 
2167
+ #: views/forms.html:64
2168
+ #: views/newsletter/templates/blocks/base/toolsGeneric.hbs:6
2169
+ #: views/newsletters.html:80 views/segments.html:41
2170
  msgid "Duplicate"
2171
  msgstr ""
2172
 
2764
  msgid "Cancel deletion"
2765
  msgstr ""
2766
 
2767
+ #: views/newsletter/templates/blocks/base/toolsGeneric.hbs:7
2768
  msgid "Drag to move"
2769
  msgstr ""
2770
 
3294
  "number."
3295
  msgstr ""
3296
 
3297
+ #: views/newsletters.html:131 views/settings/mta.html:109
3298
+ #: views/settings/mta.html:655
3299
  msgid "Activate"
3300
  msgstr ""
3301
 
4137
  msgid "Hostname"
4138
  msgstr ""
4139
 
4140
+ #: views/settings/bounce.html:50 views/settings/mta.html:495
4141
  msgid "Login"
4142
  msgstr ""
4143
 
4144
+ #: views/settings/bounce.html:67 views/settings/mta.html:518
4145
  msgid "Password"
4146
  msgstr ""
4147
 
4193
  msgid "Is it working? Try to connect"
4194
  msgstr ""
4195
 
4196
+ #: views/settings/mta.html:76
4197
  msgid "You're now sending with MailPoet!"
4198
  msgstr ""
4199
 
4200
+ #: views/settings/mta.html:78
4201
  msgid "Great, you're all set up. Your emails will now be sent quickly and reliably!"
4202
  msgstr ""
4203
 
4204
+ #: views/settings/mta.html:85
4205
  msgid "Solve all of your sending problems!"
4206
  msgstr ""
4207
 
4208
+ #: views/settings/mta.html:87
4209
  msgid ""
4210
  "Let MailPoet send your emails and get the Premium features for as little as "
4211
  "10 dollars or euros per month."
4212
  msgstr ""
4213
 
4214
+ #: views/settings/mta.html:89
4215
+ msgid "Reach the inbox, not the spam box."
4216
+ msgstr ""
4217
+
4218
+ #: views/settings/mta.html:90
4219
+ msgid "Send emails up to 20 times faster than other sending methods."
4220
+ msgstr ""
4221
+
4222
+ #: views/settings/mta.html:91
4223
+ msgid "SPF & DKIM signatures are already set up! No configuration required."
4224
+ msgstr ""
4225
+
4226
+ #: views/settings/mta.html:92
4227
+ msgid ""
4228
+ "Automatically remove invalid and bounced addresses (bounce handling) to "
4229
+ "keep your lists clean."
4230
+ msgstr ""
4231
+
4232
+ #: views/settings/mta.html:98 views/welcome.html:53
4233
  msgid "Find out more"
4234
  msgstr ""
4235
 
4236
+ #: views/settings/mta.html:102 views/settings/mta.html:133
4237
  msgid "Activated"
4238
  msgstr ""
4239
 
4240
+ #: views/settings/mta.html:119
4241
  msgid "Other"
4242
  msgstr ""
4243
 
4244
+ #: views/settings/mta.html:121
4245
  msgid "Send with your website or third party"
4246
  msgstr ""
4247
 
4248
+ #: views/settings/mta.html:123
4249
  msgid ""
4250
  "Choose to send emails through your website (not recommended) or a third "
4251
  "party sender."
4252
  msgstr ""
4253
 
4254
  #: views/settings/mta.html:125
4255
+ msgid "You\\'ll probably end up in spam."
4256
+ msgstr ""
4257
+
4258
+ #: views/settings/mta.html:126
4259
+ msgid "Sending speed is limited by your web host."
4260
+ msgstr ""
4261
+
4262
+ #: views/settings/mta.html:127
4263
+ msgid "Manual configuration of SPF and DKIM required."
4264
+ msgstr ""
4265
+
4266
+ #: views/settings/mta.html:128
4267
+ msgid "Bounce handling is available, but only with an extra add-on."
4268
+ msgstr ""
4269
+
4270
+ #: views/settings/mta.html:137
4271
  msgid "Configure"
4272
  msgstr ""
4273
 
4274
+ #: views/settings/mta.html:144
4275
  msgid ""
4276
  "Need help to pick? [link]Check out the comparison table of sending "
4277
  "methods[/link]."
4278
  msgstr ""
4279
 
4280
+ #: views/settings/mta.html:158
4281
  msgid "Method"
4282
  msgstr ""
4283
 
4284
+ #: views/settings/mta.html:168
4285
  msgid "Your web host / web server"
4286
  msgstr ""
4287
 
4288
+ #: views/settings/mta.html:177
4289
  msgid "SMTP"
4290
  msgstr ""
4291
 
4292
+ #: views/settings/mta.html:180
4293
  msgid "Select your provider"
4294
  msgstr ""
4295
 
4296
+ #: views/settings/mta.html:205
4297
  msgid "Your web host"
4298
  msgstr ""
4299
 
4300
+ #: views/settings/mta.html:221
4301
  msgid "Select your web host"
4302
  msgstr ""
4303
 
4304
+ #: views/settings/mta.html:244
4305
  msgid "Sending frequency"
4306
  msgstr ""
4307
 
4308
+ #: views/settings/mta.html:255
4309
  msgid "Recommended"
4310
  msgstr ""
4311
 
4312
+ #: views/settings/mta.html:264
4313
  msgid "I'll set my own frequency"
4314
  msgstr ""
4315
 
4316
+ #: views/settings/mta.html:288
4317
  msgid "emails"
4318
  msgstr ""
4319
 
4320
+ #: views/settings/mta.html:305
4321
  msgid "recommended"
4322
  msgstr ""
4323
 
4324
+ #: views/settings/mta.html:314
4325
  msgid ""
4326
  "<strong>Warning!</strong> Sending more than the recommended amount of "
4327
  "emails? You may break the terms of your web host or provider!"
4328
  msgstr ""
4329
 
4330
+ #: views/settings/mta.html:316
4331
  msgid ""
4332
  "Please ask your host for the maximum number of emails you are allowed to "
4333
  "send per day."
4334
  msgstr ""
4335
 
4336
+ #: views/settings/mta.html:330
4337
  msgid "SMTP Hostname"
4338
  msgstr ""
4339
 
4340
+ #: views/settings/mta.html:333
4341
  msgid "e.g.: smtp.mydomain.com"
4342
  msgstr ""
4343
 
4344
+ #: views/settings/mta.html:355
4345
  msgid "SMTP Port"
4346
  msgstr ""
4347
 
4348
+ #: views/settings/mta.html:382
4349
  msgid "Region"
4350
  msgstr ""
4351
 
4352
+ #: views/settings/mta.html:417
4353
  msgid "Access Key"
4354
  msgstr ""
4355
 
4356
+ #: views/settings/mta.html:444
4357
  msgid "Secret Key"
4358
  msgstr ""
4359
 
4360
+ #: views/settings/mta.html:471
 
 
 
 
4361
  msgid "API Key"
4362
  msgstr ""
4363
 
4364
+ #: views/settings/mta.html:541
4365
  msgid "Secure Connection"
4366
  msgstr ""
4367
 
4368
+ #: views/settings/mta.html:572
4369
  msgid "Authentication"
4370
  msgstr ""
4371
 
4372
+ #: views/settings/mta.html:575
4373
  msgid ""
4374
  "Leave this option set to Yes. Only a tiny portion of SMTP services prefer "
4375
  "Authentication to be turned off."
4376
  msgstr ""
4377
 
4378
+ #: views/settings/mta.html:614
4379
  msgid "SPF Signature (Highly recommended!)"
4380
  msgstr ""
4381
 
4382
+ #: views/settings/mta.html:617
4383
  msgid ""
4384
  "This improves your delivery rate by verifying that you're allowed to send "
4385
  "emails from your domain."
4386
  msgstr ""
4387
 
4388
+ #: views/settings/mta.html:622
4389
  msgid ""
4390
  "SPF is set up in your DNS. Read your host's support documentation for more "
4391
  "information."
4392
  msgstr ""
4393
 
4394
+ #: views/settings/mta.html:630
4395
  msgid "Test the sending method"
4396
  msgstr ""
4397
 
4398
+ #: views/settings/mta.html:644
4399
  msgid "Send a test email"
4400
  msgstr ""
4401
 
4402
+ #: views/settings/mta.html:660
4403
  msgid "or Cancel"
4404
  msgstr ""
4405
 
4406
+ #: views/settings/mta.html:699
4407
  msgid ""
4408
  "The email could not be sent. Make sure the option \"Email notifications\" "
4409
  "has a FROM email address in the Basics tab."
4410
  msgstr ""
4411
 
4412
+ #: views/settings/mta.html:712
4413
  msgid "This is a Sending Method Test"
4414
  msgstr ""
4415
 
4416
+ #: views/settings/mta.html:714 views/settings/mta.html:715
4417
  msgid "Yup, it works! You can start blasting away emails to the moon."
4418
  msgstr ""
4419
 
4420
+ #: views/settings/mta.html:724
4421
  msgid "The email has been sent! Check your inbox."
4422
  msgstr ""
4423
 
4424
+ #: views/settings/mta.html:768
4425
  msgid "You have selected an invalid sending method."
4426
  msgstr ""
4427
 
4964
  msgstr ""
4965
 
4966
  #: views/update.html:13 views/welcome.html:22
4967
+ msgid "Greetings, humans."
4968
  msgstr ""
4969
 
4970
  #: views/update.html:15 views/welcome.html:24
4971
  msgid ""
4972
+ "Thanks for using MailPoet! We really appreciate all of your love, "
4973
+ "affection, [link]and (good) plugin reviews.[/link]"
 
4974
  msgstr ""
4975
 
4976
+ #: views/update.html:24
4977
  msgid "What's New"
4978
  msgstr ""
4979
 
4980
+ #: views/update.html:28
4981
  msgid "List of Changes"
4982
  msgstr ""
4983
 
4984
+ #: views/update.html:39
4985
  msgid "See readme.txt for a changelog."
4986
  msgstr ""
4987
 
4988
+ #: views/update.html:41
4989
+ msgid "View all changes"
4990
  msgstr ""
4991
 
4992
+ #: views/update.html:48
4993
+ msgid "Do Your Part to Make MailPoet Better"
4994
+ msgstr ""
4995
+
4996
+ #: views/update.html:53
4997
+ msgid "Yes, share my data anonymously."
4998
+ msgstr ""
4999
+
5000
+ #: views/update.html:56
5001
+ msgid ""
5002
+ "By sharing your data with us, you can help us understand what our users "
5003
+ "like (and don't like)."
5004
+ msgstr ""
5005
+
5006
+ #: views/update.html:57
5007
+ msgid "We use it to prioritize and develop new plugin features."
5008
  msgstr ""
5009
 
5010
+ #: views/update.html:58
5011
+ msgid ""
5012
+ "Share your data to help shape the future of MailPoet! [link]Read "
5013
+ "more.[/link]"
5014
+ msgstr ""
5015
+
5016
+ #: views/update.html:68
5017
+ msgid "Care to Give Your Opinion?"
5018
+ msgstr ""
5019
+
5020
+ #: views/update.html:77 views/welcome.html:88
5021
+ msgid "Awesome! Now, take me to MailPoet"
5022
+ msgstr ""
5023
+
5024
+ #: views/welcome.html:29
5025
  msgid "MailPoet Logo"
5026
  msgstr ""
5027
 
5028
+ #: views/welcome.html:33
5029
  msgid "What's new"
5030
  msgstr ""
5031
 
5032
+ #: views/welcome.html:45
5033
  msgid "Want to Make MailPoet Even Better?"
5034
  msgstr ""
5035
 
5036
+ #: views/welcome.html:47
5037
  msgid "We Need Your Feedback!"
5038
  msgstr ""
5039
 
5040
+ #: views/welcome.html:48
5041
  msgid ""
5042
  "As a beta tester, you have a very important job: to tell us what you think "
5043
  "about this new version. If you love it, tell us! If you hate it, let us "
5044
  "know! Any and all feedback is useful."
5045
  msgstr ""
5046
 
5047
+ #: views/welcome.html:49
5048
  msgid ""
5049
  "To get in touch with us, simply click on the blue circle in the bottom "
5050
  "right corner of your screen. This button is visible on all MailPoet pages "
5051
  "on your WordPress dashboard."
5052
  msgstr ""
5053
 
5054
+ #: views/welcome.html:52
5055
  msgid "Sharing is Caring"
5056
  msgstr ""
5057
 
5058
+ #: views/welcome.html:53
5059
  msgid ""
5060
  "By sharing your data <i>anonymously</i> with us, you can help us understand "
5061
  "<i>how people use MailPoet</i> and <i>what sort of features they like and "
5062
  "don't like</i>."
5063
  msgstr ""
5064
 
5065
+ #: views/welcome.html:58
5066
  msgid "Yes, I want to help!"
5067
  msgstr ""
5068
 
5069
+ #: views/welcome.html:68 views/welcome.html:72
5070
  msgid "Subscribe To Our Newsletter"
5071
  msgstr ""
5072
 
5073
+ #: views/welcome.html:69
5074
  msgid "About once a month, we send out a pretty cool newsletter ourselves."
5075
  msgstr ""
5076
 
5077
+ #: views/welcome.html:70
5078
  msgid ""
5079
  "Sign up to get a curated selection of awesome links, tips and tricks for "
5080
  "using MailPoet, special offers, and important plugin updates!"
5081
  msgstr ""
5082
 
5083
+ #: views/welcome.html:76
5084
  msgid "Learn the Ropes"
5085
  msgstr ""
5086
 
5087
+ #: views/welcome.html:77
5088
  msgid ""
5089
  "New to MailPoet? Check out our brand new email course. Over the span of 3 "
5090
  "weeks, we'll teach you how to create and send your first MailPoet email "
lib/Config/Menu.php CHANGED
@@ -340,7 +340,7 @@ class Menu {
340
 
341
  $readme_file = Env::$path . '/readme.txt';
342
  if(is_readable($readme_file)) {
343
- $changelog = Readme::parseChangelog(file_get_contents($readme_file), 2);
344
  if($changelog) {
345
  $data['changelog'] = $changelog;
346
  }
340
 
341
  $readme_file = Env::$path . '/readme.txt';
342
  if(is_readable($readme_file)) {
343
+ $changelog = Readme::parseChangelog(file_get_contents($readme_file), 1);
344
  if($changelog) {
345
  $data['changelog'] = $changelog;
346
  }
lib/Config/Populator.php CHANGED
@@ -340,7 +340,7 @@ class Populator {
340
  if(!version_compare(get_option('mailpoet_db_version'), '3.0.0-beta.32', '<=')) {
341
  // Data conversion should only be performed only once, when migrating from
342
  // older version
343
- return;
344
  }
345
 
346
  $source_charset = $wpdb->get_var('SELECT @@GLOBAL.character_set_connection');
@@ -389,6 +389,8 @@ class Populator {
389
  implode(' AND ', $where_query)
390
  ));
391
  }
 
 
392
  }
393
 
394
  /*
@@ -401,7 +403,7 @@ class Populator {
401
 
402
  // perform once for versions below 3.0.0-beta.36.2.1
403
  if(version_compare(get_option('mailpoet_db_version'), '3.0.0-beta.36.2.1', '>=')) {
404
- return;
405
  }
406
 
407
  $column_list = array(
@@ -439,6 +441,8 @@ class Populator {
439
  MP_SENDING_QUEUES_TABLE,
440
  '`type` IN("' . join('" , "', $task_types) . '")'
441
  ));
 
 
442
  }
443
 
444
  /*
@@ -452,7 +456,7 @@ class Populator {
452
 
453
  // perform once for versions below 3.0.0-beta.36.2.1
454
  if(version_compare(get_option('mailpoet_db_version'), '3.0.0-beta.36.2.1', '>=')) {
455
- return;
456
  }
457
 
458
  $query = "UPDATE `%s` newsletters JOIN `%s` queues ON newsletters.id = queues.newsletter_id SET newsletters.sent_at = queues.processed_at";
@@ -461,5 +465,7 @@ class Populator {
461
  Newsletter::$_table,
462
  SendingQueue::$_table
463
  ));
 
 
464
  }
465
  }
340
  if(!version_compare(get_option('mailpoet_db_version'), '3.0.0-beta.32', '<=')) {
341
  // Data conversion should only be performed only once, when migrating from
342
  // older version
343
+ return false;
344
  }
345
 
346
  $source_charset = $wpdb->get_var('SELECT @@GLOBAL.character_set_connection');
389
  implode(' AND ', $where_query)
390
  ));
391
  }
392
+
393
+ return true;
394
  }
395
 
396
  /*
403
 
404
  // perform once for versions below 3.0.0-beta.36.2.1
405
  if(version_compare(get_option('mailpoet_db_version'), '3.0.0-beta.36.2.1', '>=')) {
406
+ return false;
407
  }
408
 
409
  $column_list = array(
441
  MP_SENDING_QUEUES_TABLE,
442
  '`type` IN("' . join('" , "', $task_types) . '")'
443
  ));
444
+
445
+ return true;
446
  }
447
 
448
  /*
456
 
457
  // perform once for versions below 3.0.0-beta.36.2.1
458
  if(version_compare(get_option('mailpoet_db_version'), '3.0.0-beta.36.2.1', '>=')) {
459
+ return false;
460
  }
461
 
462
  $query = "UPDATE `%s` newsletters JOIN `%s` queues ON newsletters.id = queues.newsletter_id SET newsletters.sent_at = queues.processed_at";
465
  Newsletter::$_table,
466
  SendingQueue::$_table
467
  ));
468
+
469
+ return true;
470
  }
471
  }
lib/Cron/Workers/SendingQueue/SendingQueue.php CHANGED
@@ -157,7 +157,7 @@ class SendingQueue {
157
  );
158
  // log error message and schedule retry/pause sending
159
  if($send_result['response'] === false) {
160
- MailerLog::processSendingError(
161
  $send_result['operation'],
162
  $send_result['error_message']
163
  );
157
  );
158
  // log error message and schedule retry/pause sending
159
  if($send_result['response'] === false) {
160
+ MailerLog::processError(
161
  $send_result['operation'],
162
  $send_result['error_message']
163
  );
lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php CHANGED
@@ -4,6 +4,7 @@ namespace MailPoet\Cron\Workers\SendingQueue\Tasks;
4
  use MailPoet\Cron\Workers\SendingQueue\Tasks\Links as LinksTask;
5
  use MailPoet\Cron\Workers\SendingQueue\Tasks\Posts as PostsTask;
6
  use MailPoet\Cron\Workers\SendingQueue\Tasks\Shortcodes as ShortcodesTask;
 
7
  use MailPoet\Models\Newsletter as NewsletterModel;
8
  use MailPoet\Models\NewsletterSegment as NewsletterSegmentModel;
9
  use MailPoet\Models\Setting;
@@ -88,6 +89,12 @@ class Newsletter {
88
  $queue->newsletter_rendered_subject = Shortcodes::process($newsletter->subject, $newsletter, null, $queue);
89
  $queue->newsletter_rendered_body = $rendered_newsletter;
90
  $queue->save();
 
 
 
 
 
 
91
  return $newsletter;
92
  }
93
 
4
  use MailPoet\Cron\Workers\SendingQueue\Tasks\Links as LinksTask;
5
  use MailPoet\Cron\Workers\SendingQueue\Tasks\Posts as PostsTask;
6
  use MailPoet\Cron\Workers\SendingQueue\Tasks\Shortcodes as ShortcodesTask;
7
+ use MailPoet\Mailer\MailerLog;
8
  use MailPoet\Models\Newsletter as NewsletterModel;
9
  use MailPoet\Models\NewsletterSegment as NewsletterSegmentModel;
10
  use MailPoet\Models\Setting;
89
  $queue->newsletter_rendered_subject = Shortcodes::process($newsletter->subject, $newsletter, null, $queue);
90
  $queue->newsletter_rendered_body = $rendered_newsletter;
91
  $queue->save();
92
+ if($queue->getErrors()) {
93
+ return MailerLog::processError(
94
+ 'queue_save',
95
+ __('There was an error processing your newsletter during sending. If possible, please contact us and report this issue.')
96
+ );
97
+ }
98
  return $newsletter;
99
  }
100
 
lib/Mailer/MailerLog.php CHANGED
@@ -75,7 +75,7 @@ class MailerLog {
75
  return self::resetMailerLog();
76
  }
77
 
78
- static function processSendingError($operation, $error_message) {
79
  $mailer_log = self::getMailerLog();
80
  (int)$mailer_log['retry_attempt']++;
81
  $mailer_log['retry_at'] = time() + self::RETRY_INTERVAL;
75
  return self::resetMailerLog();
76
  }
77
 
78
+ static function processError($operation, $error_message) {
79
  $mailer_log = self::getMailerLog();
80
  (int)$mailer_log['retry_attempt']++;
81
  $mailer_log['retry_at'] = time() + self::RETRY_INTERVAL;
lib/Mailer/Methods/SMTP.php CHANGED
@@ -17,7 +17,7 @@ class SMTP {
17
  public $reply_to;
18
  public $return_path;
19
  public $mailer;
20
- const SMTP_CONNECTION_TIMEOUT = 10; // seconds
21
 
22
  function __construct(
23
  $host, $port, $authentication, $login = null, $password = null, $encryption,
@@ -55,7 +55,8 @@ class SMTP {
55
  function buildMailer() {
56
  $transport = \Swift_SmtpTransport::newInstance(
57
  $this->host, $this->port, $this->encryption);
58
- $transport->setTimeout(self::SMTP_CONNECTION_TIMEOUT);
 
59
  if($this->authentication) {
60
  $transport
61
  ->setUsername($this->login)
@@ -129,4 +130,4 @@ class SMTP {
129
  $message = explode(PHP_EOL, $message);
130
  return $message[0];
131
  }
132
- }
17
  public $reply_to;
18
  public $return_path;
19
  public $mailer;
20
+ const SMTP_CONNECTION_TIMEOUT = 15; // seconds
21
 
22
  function __construct(
23
  $host, $port, $authentication, $login = null, $password = null, $encryption,
55
  function buildMailer() {
56
  $transport = \Swift_SmtpTransport::newInstance(
57
  $this->host, $this->port, $this->encryption);
58
+ $connection_timeout = Hooks::applyFilters('mailpoet_mailer_smtp_connection_timeout', self::SMTP_CONNECTION_TIMEOUT);
59
+ $transport->setTimeout($connection_timeout);
60
  if($this->authentication) {
61
  $transport
62
  ->setUsername($this->login)
130
  $message = explode(PHP_EOL, $message);
131
  return $message[0];
132
  }
133
+ }
lib/Models/Model.php CHANGED
@@ -170,6 +170,15 @@ class Model extends \Sudzy\ValidModel {
170
  return static::whereNotNull('deleted_at');
171
  }
172
 
 
 
 
 
 
 
 
 
 
173
  /**
174
  * Rethrow PDOExceptions to prevent exposing sensitive data in stack traces
175
  */
@@ -180,4 +189,4 @@ class Model extends \Sudzy\ValidModel {
180
  throw new \Exception($e->getMessage());
181
  }
182
  }
183
- }
170
  return static::whereNotNull('deleted_at');
171
  }
172
 
173
+ /**
174
+ * PHP 5.3 fix for incorrectly returned model results when using asArray() function.
175
+ * Jira reference: https://goo.gl/UZaMj5
176
+ * TODO: remove after phasing out PHP 5.3 support
177
+ */
178
+ function asArray() {
179
+ return call_user_func_array('parent::as_array', func_get_args());
180
+ }
181
+
182
  /**
183
  * Rethrow PDOExceptions to prevent exposing sensitive data in stack traces
184
  */
189
  throw new \Exception($e->getMessage());
190
  }
191
  }
192
+ }
lib/Models/Newsletter.php CHANGED
@@ -280,6 +280,9 @@ class Newsletter extends Model {
280
  // reset hash
281
  $duplicate->set('hash', null);
282
 
 
 
 
283
  $duplicate->save();
284
 
285
  if($duplicate->getErrors() === false) {
280
  // reset hash
281
  $duplicate->set('hash', null);
282
 
283
+ // reset sent at date
284
+ $duplicate->set('sent_at', null);
285
+
286
  $duplicate->save();
287
 
288
  if($duplicate->getErrors() === false) {
lib/Newsletter/Links/Links.php CHANGED
@@ -1,69 +1,52 @@
1
  <?php
2
  namespace MailPoet\Newsletter\Links;
3
 
4
- use MailPoet\Models\Subscriber;
5
- use MailPoet\Router\Router;
6
- use MailPoet\Router\Endpoints\Track as TrackEndpoint;
7
  use MailPoet\Models\NewsletterLink;
 
 
8
  use MailPoet\Newsletter\Shortcodes\Shortcodes;
 
 
9
  use MailPoet\Util\Helpers;
 
10
  use MailPoet\Util\Security;
11
 
12
  class Links {
13
  const DATA_TAG_CLICK = '[mailpoet_click_data]';
14
  const DATA_TAG_OPEN = '[mailpoet_open_data]';
15
-
16
  const LINK_TYPE_SHORTCODE = 'shortcode';
17
- const LINK_TYPE_LINK = 'link';
18
 
19
  static function process($content) {
20
  $extracted_links = self::extract($content);
21
  $processed_links = self::hash($extracted_links);
22
- return self::replace($content, $extracted_links, $processed_links);
23
  }
24
 
25
  static function extract($content) {
26
  $extracted_links = array();
27
- // adopted from WP's wp_extract_urls() function & modified to work on hrefs
28
- # match href=' or href="
29
- $regex = '#(?:href.*?=.*?)(["\']?)('
30
- # match http://
31
- . '(?:([\w-]+:)?//?)'
32
- # match everything except for special characters # until .
33
- . '[^\s()<>]+'
34
- . '[.]'
35
- # conditionally match everything except for special characters after .
36
- . '(?:'
37
- . '\([\w\d]+\)|'
38
- . '(?:'
39
- . '[^`!()\[\]{}:;\'".,<>«»“”‘’\s]|'
40
- . '(?:[:]\d+)?/?'
41
- . ')+'
42
- . ')'
43
- . ')\\1#';
44
- // extract shortcodes with [link:*] format
45
  $shortcodes = new Shortcodes();
46
- $shortcodes = $shortcodes->extract($content, $categories = array('link'));
 
 
 
47
  if($shortcodes) {
48
  $extracted_links = array_map(function($shortcode) {
49
  return array(
50
  'type' => Links::LINK_TYPE_SHORTCODE,
51
- 'html' => $shortcode,
52
  'link' => $shortcode
53
  );
54
  }, $shortcodes);
55
  }
56
- // extract urls with href="url" format
57
- preg_match_all($regex, $content, $matched_urls);
58
- $matched_urls_count = count($matched_urls[0]);
59
- if($matched_urls_count) {
60
- for($index = 0; $index < $matched_urls_count; $index++) {
61
- $extracted_links[] = array(
62
- 'type' => self::LINK_TYPE_LINK,
63
- 'html' => $matched_urls[0][$index],
64
- 'link' => $matched_urls[2][$index]
65
- );
66
- }
67
  }
68
  return array_unique($extracted_links, SORT_REGULAR);
69
  }
@@ -74,10 +57,11 @@ class Links {
74
  $hash = Security::generateHash();
75
  // Use URL as a key to map between extracted and processed links
76
  // regardless of their sequential position (useful for link skips etc.)
77
- $key = $extracted_link['link'];
78
- $processed_links[$key] = array(
 
79
  'hash' => $hash,
80
- 'url' => $extracted_link['link'],
81
  // replace link with a temporary data tag + hash
82
  // it will be further replaced with the proper track API URL during sending
83
  'processed_link' => self::DATA_TAG_CLICK . '-' . $hash
@@ -86,33 +70,30 @@ class Links {
86
  return $processed_links;
87
  }
88
 
89
- static function replace($content, $extracted_links, $processed_links) {
90
- foreach($extracted_links as $key => $extracted_link) {
91
- $key = $extracted_link['link'];
92
- if(!($hasReplacement = isset($processed_links[$key]['processed_link']))) {
93
- continue;
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  }
95
- $processed_link = $processed_links[$key]['processed_link'];
96
- // first, replace URL in the extracted HTML source with encoded link
97
- $processed_link_html_source = str_replace(
98
- $extracted_link['link'], $processed_link,
99
- $extracted_link['html']
100
- );
101
- // second, replace original extracted HTML source with processed URL source
102
- $content = str_replace(
103
- $extracted_link['html'], $processed_link_html_source, $content
104
- );
105
- // third, replace text version URL with processed link: [description](url)
106
- // regex is used to avoid replacing description URLs that are wrapped in round brackets
107
- // i.e., <a href="http://google.com">(http://google.com)</a> => [(http://google.com)](http://processed_link)
108
- $regex_escaped_extracted_link = preg_quote($extracted_link['link'], '/');
109
  $content = preg_replace(
110
- '/\[(.*?)\](\(' . $regex_escaped_extracted_link . '\))/',
111
- '[$1](' . $processed_link . ')',
112
  $content
113
  );
114
- // Clean up data used to generate a new link
115
- unset($processed_links[$key]['processed_link']);
116
  }
117
  return array(
118
  $content,
@@ -156,12 +137,12 @@ class Links {
156
 
157
  static function save(array $links, $newsletter_id, $queue_id) {
158
  foreach($links as $link) {
159
- if(empty($link['hash']) || empty($link['url'])) continue;
160
  $newsletter_link = NewsletterLink::create();
161
  $newsletter_link->newsletter_id = $newsletter_id;
162
  $newsletter_link->queue_id = $queue_id;
163
  $newsletter_link->hash = $link['hash'];
164
- $newsletter_link->url = $link['url'];
165
  $newsletter_link->save();
166
  }
167
  }
@@ -178,7 +159,7 @@ class Links {
178
  // convert either only link shortcodes or all hashes links if "convert all"
179
  // option is specified
180
  if($newsletter_link &&
181
- (preg_match('/\[link:/', $newsletter_link->url) || $convert_all)
182
  ) {
183
  $content = str_replace($link, $newsletter_link->url, $content);
184
  }
1
  <?php
2
  namespace MailPoet\Newsletter\Links;
3
 
 
 
 
4
  use MailPoet\Models\NewsletterLink;
5
+ use MailPoet\Models\Subscriber;
6
+ use MailPoet\Newsletter\Shortcodes\Categories\Link;
7
  use MailPoet\Newsletter\Shortcodes\Shortcodes;
8
+ use MailPoet\Router\Endpoints\Track as TrackEndpoint;
9
+ use MailPoet\Router\Router;
10
  use MailPoet\Util\Helpers;
11
+ use MailPoet\Util\pQuery\pQuery as DomParser;
12
  use MailPoet\Util\Security;
13
 
14
  class Links {
15
  const DATA_TAG_CLICK = '[mailpoet_click_data]';
16
  const DATA_TAG_OPEN = '[mailpoet_open_data]';
 
17
  const LINK_TYPE_SHORTCODE = 'shortcode';
18
+ const LINK_TYPE_URL = 'link';
19
 
20
  static function process($content) {
21
  $extracted_links = self::extract($content);
22
  $processed_links = self::hash($extracted_links);
23
+ return self::replace($content, $processed_links);
24
  }
25
 
26
  static function extract($content) {
27
  $extracted_links = array();
28
+ // extract link shortcodes
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  $shortcodes = new Shortcodes();
30
+ $shortcodes = $shortcodes->extract(
31
+ $content,
32
+ $categories = array(Link::CATEGORY_NAME)
33
+ );
34
  if($shortcodes) {
35
  $extracted_links = array_map(function($shortcode) {
36
  return array(
37
  'type' => Links::LINK_TYPE_SHORTCODE,
 
38
  'link' => $shortcode
39
  );
40
  }, $shortcodes);
41
  }
42
+ // extract HTML anchor tags
43
+ $DOM = DomParser::parseStr($content);
44
+ foreach($DOM->query('a') as $link) {
45
+ if(!$link->href) continue;
46
+ $extracted_links[] = array(
47
+ 'type' => self::LINK_TYPE_URL,
48
+ 'link' => $link->href
49
+ );
 
 
 
50
  }
51
  return array_unique($extracted_links, SORT_REGULAR);
52
  }
57
  $hash = Security::generateHash();
58
  // Use URL as a key to map between extracted and processed links
59
  // regardless of their sequential position (useful for link skips etc.)
60
+ $link = $extracted_link['link'];
61
+ $processed_links[$link] = array(
62
+ 'type' => $extracted_link['type'],
63
  'hash' => $hash,
64
+ 'link' => $link,
65
  // replace link with a temporary data tag + hash
66
  // it will be further replaced with the proper track API URL during sending
67
  'processed_link' => self::DATA_TAG_CLICK . '-' . $hash
70
  return $processed_links;
71
  }
72
 
73
+ static function replace($content, $processed_links) {
74
+ // replace HTML anchor tags
75
+ $DOM = DomParser::parseStr($content);
76
+ foreach($DOM->query('a') as $link) {
77
+ $link_to_replace = $link->href;
78
+ $replacement_link = (!empty($processed_links[$link_to_replace]['processed_link'])) ?
79
+ $processed_links[$link_to_replace]['processed_link'] :
80
+ null;
81
+ if(!$replacement_link) continue;
82
+ $link->setAttribute('href', $replacement_link);
83
+ }
84
+ $content = $DOM->__toString();
85
+ // replace link shortcodes and markdown links
86
+ foreach($processed_links as $processed_link) {
87
+ $link_to_replace = $processed_link['link'];
88
+ $replacement_link = $processed_link['processed_link'];
89
+ if($processed_link['type'] == self::LINK_TYPE_SHORTCODE) {
90
+ $content = str_replace($link_to_replace, $replacement_link, $content);
91
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  $content = preg_replace(
93
+ '/\[(.*?)\](\(' . preg_quote($link_to_replace, '/') . '\))/',
94
+ '[$1](' . $replacement_link . ')',
95
  $content
96
  );
 
 
97
  }
98
  return array(
99
  $content,
137
 
138
  static function save(array $links, $newsletter_id, $queue_id) {
139
  foreach($links as $link) {
140
+ if(empty($link['hash']) || empty($link['link'])) continue;
141
  $newsletter_link = NewsletterLink::create();
142
  $newsletter_link->newsletter_id = $newsletter_id;
143
  $newsletter_link->queue_id = $queue_id;
144
  $newsletter_link->hash = $link['hash'];
145
+ $newsletter_link->url = $link['link'];
146
  $newsletter_link->save();
147
  }
148
  }
159
  // convert either only link shortcodes or all hashes links if "convert all"
160
  // option is specified
161
  if($newsletter_link &&
162
+ (preg_match('/\[link:/', $newsletter_link->url) || $convert_all)
163
  ) {
164
  $content = str_replace($link, $newsletter_link->url, $content);
165
  }
lib/Newsletter/Renderer/Renderer.php CHANGED
@@ -124,7 +124,7 @@ class Renderer {
124
  }
125
 
126
  function renderTextVersion($template) {
127
- $template = utf8_encode($template);
128
  return @\Html2Text\Html2Text::convert($template);
129
  }
130
 
124
  }
125
 
126
  function renderTextVersion($template) {
127
+ $template = (mb_detect_encoding($template, 'UTF-8', true)) ? $template : utf8_encode($template);
128
  return @\Html2Text\Html2Text::convert($template);
129
  }
130
 
lib/Newsletter/Shortcodes/Categories/Link.php CHANGED
@@ -7,6 +7,8 @@ use MailPoet\Statistics\Track\Unsubscribes;
7
  use MailPoet\Subscription\Url as SubscriptionUrl;
8
 
9
  class Link {
 
 
10
  static function process(
11
  $action,
12
  $action_argument,
7
  use MailPoet\Subscription\Url as SubscriptionUrl;
8
 
9
  class Link {
10
+ const CATEGORY_NAME = 'link';
11
+
12
  static function process(
13
  $action,
14
  $action_argument,
lib/Util/ConflictResolver.php CHANGED
@@ -53,6 +53,7 @@ class ConflictResolver {
53
 
54
  function resolveStylesConflict() {
55
  $_this = $this;
 
56
  // unload all styles except from the list of allowed
57
  $dequeue_styles = function() use($_this) {
58
  global $wp_styles;
@@ -73,6 +74,7 @@ class ConflictResolver {
73
 
74
  function resolveScriptsConflict() {
75
  $_this = $this;
 
76
  // unload all scripts except from the list of allowed
77
  $dequeue_scripts = function() use($_this) {
78
  global $wp_scripts;
53
 
54
  function resolveStylesConflict() {
55
  $_this = $this;
56
+ $_this->permitted_assets_locations['styles'] = apply_filters('mailpoet_conflict_resolver_whitelist_style', $_this->permitted_assets_locations['styles']);
57
  // unload all styles except from the list of allowed
58
  $dequeue_styles = function() use($_this) {
59
  global $wp_styles;
74
 
75
  function resolveScriptsConflict() {
76
  $_this = $this;
77
+ $_this->permitted_assets_locations['scripts'] = apply_filters('mailpoet_conflict_resolver_whitelist_script', $_this->permitted_assets_locations['scripts']);
78
  // unload all scripts except from the list of allowed
79
  $dequeue_scripts = function() use($_this) {
80
  global $wp_scripts;
mailpoet.php CHANGED
@@ -4,7 +4,7 @@ if(!defined('ABSPATH')) exit;
4
 
5
  /*
6
  * Plugin Name: MailPoet
7
- * Version: 3.0.0-beta.36.3.0
8
  * Plugin URI: http://www.mailpoet.com
9
  * Description: Create and send beautiful email newsletters, autoresponders, and post notifications without leaving WordPress. This is a beta version of our brand new plugin!
10
  * Author: MailPoet
@@ -21,7 +21,7 @@ if(!defined('ABSPATH')) exit;
21
  */
22
 
23
  $mailpoet_plugin = array(
24
- 'version' => '3.0.0-beta.36.3.0',
25
  'filename' => __FILE__,
26
  'path' => dirname(__FILE__),
27
  'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',
4
 
5
  /*
6
  * Plugin Name: MailPoet
7
+ * Version: 3.0.0-beta.36.3.1
8
  * Plugin URI: http://www.mailpoet.com
9
  * Description: Create and send beautiful email newsletters, autoresponders, and post notifications without leaving WordPress. This is a beta version of our brand new plugin!
10
  * Author: MailPoet
21
  */
22
 
23
  $mailpoet_plugin = array(
24
+ 'version' => '3.0.0-beta.36.3.1',
25
  'filename' => __FILE__,
26
  'path' => dirname(__FILE__),
27
  'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: mailpoet, wysija
3
  Tags: newsletter, email, welcome email, post notification, autoresponder, signup, subscription, SMTP
4
  Requires at least: 4.6
5
  Tested up to: 4.8
6
- Stable tag: 3.0.0-beta.36.3.0
7
  Create and send beautiful emails and newsletters from WordPress.
8
 
9
  == Description ==
@@ -35,7 +35,7 @@ We consider this version to be a release candidate. In other words, it's pretty
35
 
36
  = Premium version available =
37
 
38
- [Get in touch](www.mailpoet.com/support/sales-pre-sales-questions/) if you are an existing customer and you want to switch.
39
 
40
  = Translations =
41
 
@@ -93,6 +93,15 @@ Our [support site](https://beta.docs.mailpoet.com) has plenty of articles. You c
93
 
94
  == Changelog ==
95
 
 
 
 
 
 
 
 
 
 
96
  = 3.0.0-beta.36.3.0 - 2017-07-11 =
97
  * Added: migration script for MailPoet 2 users now imports settings;
98
  * Fixed: emails are sorted by date sent instead of modified date; thanks Scott
3
  Tags: newsletter, email, welcome email, post notification, autoresponder, signup, subscription, SMTP
4
  Requires at least: 4.6
5
  Tested up to: 4.8
6
+ Stable tag: 3.0.0-beta.36.3.1
7
  Create and send beautiful emails and newsletters from WordPress.
8
 
9
  == Description ==
35
 
36
  = Premium version available =
37
 
38
+ [Get in touch](https://www.mailpoet.com/support/sales-pre-sales-questions/) if you are an existing customer and you want to switch.
39
 
40
  = Translations =
41
 
93
 
94
  == Changelog ==
95
 
96
+ = 3.0.0-beta.36.3.1 - 2017-07-18 =
97
+ * Added: you can now duplicate any item in the email designer;
98
+ * Improved: added filter to specify custom SMTP connection timeout value. Thanks, Rik;
99
+ * Improved: added a custom filter to whitelist JS/CSS styles that are loaded by other plugins on MailPoet's pages;
100
+ * Fixed: sending is not interrupted if a newsletter contains URLs with unicode characters. Thanks Sam!
101
+ * Fixed: sent date is reset when newsletter is duplicated;
102
+ * Fixed: SMTP sending frequency is properly updated when changed;
103
+ * Fixed: newsletter/form/subscriber listings no longer throw an error on some PHP 5.3 hosts. Thanks, Jérôme!
104
+
105
  = 3.0.0-beta.36.3.0 - 2017-07-11 =
106
  * Added: migration script for MailPoet 2 users now imports settings;
107
  * Fixed: emails are sorted by date sent instead of modified date; thanks Scott
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInitb11a845052e8e6ed50a7c81deac5e0dc::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit0cb1ee30fabb15d2899414384ee4767a::getLoader();
vendor/composer/ClassLoader.php CHANGED
@@ -374,13 +374,9 @@ class ClassLoader
374
 
375
  $first = $class[0];
376
  if (isset($this->prefixLengthsPsr4[$first])) {
377
- $subPath = $class;
378
- while (false !== $lastPos = strrpos($subPath, '\\')) {
379
- $subPath = substr($subPath, 0, $lastPos);
380
- $search = $subPath.'\\';
381
- if (isset($this->prefixDirsPsr4[$search])) {
382
- foreach ($this->prefixDirsPsr4[$search] as $dir) {
383
- $length = $this->prefixLengthsPsr4[$first][$search];
384
  if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
385
  return $file;
386
  }
374
 
375
  $first = $class[0];
376
  if (isset($this->prefixLengthsPsr4[$first])) {
377
+ foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
378
+ if (0 === strpos($class, $prefix)) {
379
+ foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
 
 
 
 
380
  if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
381
  return $file;
382
  }
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInitb11a845052e8e6ed50a7c81deac5e0dc
6
  {
7
  private static $loader;
8
 
@@ -19,15 +19,15 @@ class ComposerAutoloaderInitb11a845052e8e6ed50a7c81deac5e0dc
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInitb11a845052e8e6ed50a7c81deac5e0dc', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInitb11a845052e8e6ed50a7c81deac5e0dc', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
- call_user_func(\Composer\Autoload\ComposerStaticInitb11a845052e8e6ed50a7c81deac5e0dc::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
@@ -48,19 +48,19 @@ class ComposerAutoloaderInitb11a845052e8e6ed50a7c81deac5e0dc
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
- $includeFiles = Composer\Autoload\ComposerStaticInitb11a845052e8e6ed50a7c81deac5e0dc::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
- composerRequireb11a845052e8e6ed50a7c81deac5e0dc($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
- function composerRequireb11a845052e8e6ed50a7c81deac5e0dc($fileIdentifier, $file)
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit0cb1ee30fabb15d2899414384ee4767a
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit0cb1ee30fabb15d2899414384ee4767a', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit0cb1ee30fabb15d2899414384ee4767a', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
+ call_user_func(\Composer\Autoload\ComposerStaticInit0cb1ee30fabb15d2899414384ee4767a::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
+ $includeFiles = Composer\Autoload\ComposerStaticInit0cb1ee30fabb15d2899414384ee4767a::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
+ composerRequire0cb1ee30fabb15d2899414384ee4767a($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
+ function composerRequire0cb1ee30fabb15d2899414384ee4767a($fileIdentifier, $file)
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
  require $file;
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInitb11a845052e8e6ed50a7c81deac5e0dc
8
  {
9
  public static $files = array (
10
  '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
@@ -649,10 +649,10 @@ class ComposerStaticInitb11a845052e8e6ed50a7c81deac5e0dc
649
  public static function getInitializer(ClassLoader $loader)
650
  {
651
  return \Closure::bind(function () use ($loader) {
652
- $loader->prefixLengthsPsr4 = ComposerStaticInitb11a845052e8e6ed50a7c81deac5e0dc::$prefixLengthsPsr4;
653
- $loader->prefixDirsPsr4 = ComposerStaticInitb11a845052e8e6ed50a7c81deac5e0dc::$prefixDirsPsr4;
654
- $loader->prefixesPsr0 = ComposerStaticInitb11a845052e8e6ed50a7c81deac5e0dc::$prefixesPsr0;
655
- $loader->classMap = ComposerStaticInitb11a845052e8e6ed50a7c81deac5e0dc::$classMap;
656
 
657
  }, null, ClassLoader::class);
658
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit0cb1ee30fabb15d2899414384ee4767a
8
  {
9
  public static $files = array (
10
  '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
649
  public static function getInitializer(ClassLoader $loader)
650
  {
651
  return \Closure::bind(function () use ($loader) {
652
+ $loader->prefixLengthsPsr4 = ComposerStaticInit0cb1ee30fabb15d2899414384ee4767a::$prefixLengthsPsr4;
653
+ $loader->prefixDirsPsr4 = ComposerStaticInit0cb1ee30fabb15d2899414384ee4767a::$prefixDirsPsr4;
654
+ $loader->prefixesPsr0 = ComposerStaticInit0cb1ee30fabb15d2899414384ee4767a::$prefixesPsr0;
655
+ $loader->classMap = ComposerStaticInit0cb1ee30fabb15d2899414384ee4767a::$classMap;
656
 
657
  }, null, ClassLoader::class);
658
  }
views/newsletter/templates/blocks/base/toolsGeneric.hbs CHANGED
@@ -3,7 +3,8 @@
3
  <%= source('newsletter/templates/svg/block-tools/settings-column.svg') %>
4
  </a>{{/if}}{{#if tools.settings}}<a href="javascript:;" class="mailpoet_tool mailpoet_edit_block mailpoet_ignore_drag" title="<%= __('Edit settings') %>">
5
  <%= source('newsletter/templates/svg/block-tools/settings.svg') %>
6
- </a>{{/if}}{{#if tools.delete}}<div class="mailpoet_delete_block mailpoet_ignore_drag"><a href="javascript:;" class="mailpoet_tool mailpoet_delete_block_activate" title="<%= __('Delete') %>"><%= source('newsletter/templates/svg/block-tools/trash.svg') %></a><a href="javascript:;" class="mailpoet_delete_block_confirm" title="<%= __('Confirm deletion') %>"><%= __('Delete') %></a><a href="javascript:;" class="mailpoet_delete_block_cancel" title="<%= __('Cancel deletion') %>"><%= __('Cancel') %></a></div>{{/if}}{{#if tools.move}}<a href="javascript:;" class="mailpoet_tool mailpoet_move_block" title="<%= __('Drag to move') %>">
7
- <%= source('newsletter/templates/svg/block-tools/move.svg') %>
 
8
  </a>{{/if}}
9
  </div>
3
  <%= source('newsletter/templates/svg/block-tools/settings-column.svg') %>
4
  </a>{{/if}}{{#if tools.settings}}<a href="javascript:;" class="mailpoet_tool mailpoet_edit_block mailpoet_ignore_drag" title="<%= __('Edit settings') %>">
5
  <%= source('newsletter/templates/svg/block-tools/settings.svg') %>
6
+ </a>{{/if}}{{#if tools.delete}}<div class="mailpoet_delete_block mailpoet_ignore_drag"><a href="javascript:;" class="mailpoet_tool mailpoet_delete_block_activate" title="<%= __('Delete') %>"><%= source('newsletter/templates/svg/block-tools/trash.svg') %></a><a href="javascript:;" class="mailpoet_delete_block_confirm" title="<%= __('Confirm deletion') %>"><%= __('Delete') %></a><a href="javascript:;" class="mailpoet_delete_block_cancel" title="<%= __('Cancel deletion') %>"><%= __('Cancel') %></a></div>{{/if}}{{#if tools.duplicate}}<a href="javascript:;" class="mailpoet_tool mailpoet_duplicate_block" title="<%= __('Duplicate') %>">
7
+ <%= source('newsletter/templates/svg/block-tools/duplicate.svg') %></a>{{/if}}{{#if tools.move}}<a href="javascript:;" class="mailpoet_tool mailpoet_move_block" title="<%= __('Drag to move') %>">
8
+ <%= source('newsletter/templates/svg/block-tools/move.svg') %>
9
  </a>{{/if}}
10
  </div>
views/newsletter/templates/svg/block-tools/duplicate.svg ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg class="mailpoet_tool_icon" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="612px"
5
+ height="611.632px" viewBox="0 93.684 612 611.632" enable-background="new 0 93.684 612 611.632" xml:space="preserve">
6
+ <g id="Layer_1">
7
+ <g id="Layer_1_copy">
8
+ <circle fill="#FFFFFF" cx="306" cy="403.5" r="269.5"/>
9
+ <polygon id="_x3C_Slice_x3E__1_" fill="none" points="0,69.6 612,69.6 614,724.4 2,724.4 "/>
10
+ <g id="Layer_3">
11
+ </g>
12
+ </g>
13
+ <g id="Layer_2">
14
+ <path d="M171.5,536.834"/>
15
+ </g>
16
+ </g>
17
+ <g id="Layer_3_1_">
18
+ <g>
19
+ <path d="M360.207,425.951V303.128c0-3.426-2.789-6.212-6.215-6.212H156.618c-3.426,0-6.212,2.786-6.212,6.212v122.823
20
+ c0,3.425,2.787,6.212,6.212,6.212h197.374C357.418,432.163,360.207,429.376,360.207,425.951z"/>
21
+ <path d="M305.816,93.684C136.918,93.684,0,230.602,0,399.5c0,168.896,136.918,305.816,305.816,305.816
22
+ c168.896,0,305.815-136.919,305.815-305.816C611.633,230.602,474.714,93.684,305.816,93.684z M104.845,425.951V303.128
23
+ c0-28.547,23.226-51.772,51.773-51.772h197.374c28.548,0,51.772,23.225,51.772,51.772v122.823
24
+ c0,28.548-23.225,51.772-51.772,51.772H156.618C128.071,477.724,104.845,454.499,104.845,425.951z M499.041,514.872
25
+ c0,28.548-23.225,51.772-51.772,51.772H231.894c-28.547,0-51.772-23.225-51.772-51.772h45.56c0,3.428,2.787,6.213,6.212,6.213
26
+ h215.375c3.426,0,6.212-2.785,6.212-6.213v-140.82c0-3.427-2.786-6.212-6.212-6.212v-45.562c28.548,0,51.772,23.226,51.772,51.773
27
+ V514.872z"/>
28
+ </g>
29
+ </g>
30
+ </svg>
views/settings/mta.html CHANGED
@@ -54,76 +54,89 @@
54
  />
55
 
56
  <!-- smtp: available sending methods -->
57
- <ul class="mailpoet_sending_methods clearfix">
58
  <li
59
  data-group="mailpoet"
60
  <% if(settings.mta_group == 'mailpoet') %>class="mailpoet_active"<% endif %>
61
  >
62
- <h3>
63
- <img
64
- src="<%= assets_url %>/img/mailpoet_logo.png"
65
- alt="MailPoet"
66
- width="137"
67
- height="54"
68
- />
69
- </h3>
70
-
71
- <p
72
- class="mailpoet_description<% if(settings.mta_group != 'mailpoet') %> mailpoet_hidden<% endif %>"
73
- id="mailpoet_sending_method_active_text"
74
- >
75
- <strong><%= __("You're now sending with MailPoet!") %></strong>
76
- <br />
77
- <%= __("Great, you're all set up. Your emails will now be sent quickly and reliably!") %>
78
- </p>
79
-
80
- <p
81
- class="mailpoet_description<% if(settings.mta_group == 'mailpoet') %> mailpoet_hidden<% endif %>"
82
- id="mailpoet_sending_method_inactive_text"
83
- >
84
- <strong><%= __("Solve all of your sending problems!") %></strong>
85
- <br />
86
- <%= __("Let MailPoet send your emails and get the Premium features for as little as 10 dollars or euros per month.") %>
87
- <br/>
88
- <br/>
89
- <a
90
- href="<%= admin_url('admin.php?page=mailpoet-premium') %>"
91
- class="button button-primary"
92
- ><%= __('Find out more') %></a>
93
- </p>
94
-
 
 
 
 
 
 
95
  <div class="mailpoet_status">
96
  <span><%= __('Activated') %></span>
97
- </div>
98
 
99
- <div class="mailpoet_actions">
100
- <button
101
- type="button"
102
- class="mailpoet_sending_service_activate button-secondary"
103
  <% if(settings.mta_group == 'mailpoet' or not(mss_key_valid)) %> disabled="disabled"<% endif %>
104
- ><%= __('Activate') %></button>
 
105
  </div>
 
106
  </li>
107
  <li
108
  data-group="other"
109
  <% if(settings.mta_group == 'smtp' or settings.mta_group == 'website') %>class="mailpoet_active"<% endif %>
110
  >
111
- <h3><%= __('Other') %></h3>
112
- <p class="mailpoet_description">
113
- <strong><%= __('Send with your website or third party') %></strong>
114
- <br />
115
- <%= __('Choose to send emails through your website (not recommended) or a third party sender.') %>
116
- </p>
117
-
118
- <div class="mailpoet_status">
119
- <span><%= __('Activated') %></span>
120
- </div>
121
-
122
- <div class="mailpoet_actions">
123
- <a
124
- class="button-secondary"
125
- href="#mta/other"><%= __('Configure') %></a>
126
- </div>
 
 
 
 
 
 
127
  </li>
128
  </ul>
129
 
@@ -266,10 +279,10 @@
266
  type="number"
267
  min="1"
268
  max="1000"
269
- <% if(settings.mta_group == 'website') %>
270
- value="<%= settings.mta.frequency.emails %>"
271
  <% else %>
272
- value="<%= default_frequency.website.emails %>"
273
  <% endif %>
274
  />
275
  <%= __('emails') %>
@@ -445,32 +458,6 @@
445
  </td>
446
  </tr>
447
 
448
- <!-- smtp: domain -->
449
- <tr class="mailpoet_smtp_field" data-field="domain"
450
- <%
451
- if settings.mta_group != "smtp" or settings.smtp_provider != "manual"
452
- %>
453
- style="display:none;"
454
- <% endif %>
455
- >
456
- <th scope="row">
457
- <label for="settings[mta_domain]">
458
- <%= __('Domain') %>
459
- </label>
460
- <p class="description">
461
- <%= __('e.g.: smtp.mydomain.com') %>
462
- </p>
463
- </th>
464
- <td>
465
- <input
466
- type="text"
467
- class="regular-text"
468
- id="settings[mta_domain]"
469
- name="mta[domain]"
470
- value="<%= settings.mta.domain %>" />
471
- </td>
472
- </tr>
473
-
474
  <!-- smtp: api key -->
475
  <tr class="mailpoet_sendgrid_field" data-field="api_key"
476
  <%
54
  />
55
 
56
  <!-- smtp: available sending methods -->
57
+ <ul class="mailpoet_sending_methods">
58
  <li
59
  data-group="mailpoet"
60
  <% if(settings.mta_group == 'mailpoet') %>class="mailpoet_active"<% endif %>
61
  >
62
+ <div class="mailpoet_sending_method_description">
63
+ <h3>
64
+ <img
65
+ src="<%= assets_url %>/img/mailpoet_logo.png"
66
+ alt="MailPoet"
67
+ width="137"
68
+ height="54"
69
+ />
70
+ </h3>
71
+
72
+ <p
73
+ class="mailpoet_description<% if(settings.mta_group != 'mailpoet') %> mailpoet_hidden<% endif %>"
74
+ id="mailpoet_sending_method_active_text"
75
+ >
76
+ <strong><%= __("You're now sending with MailPoet!") %></strong>
77
+ <br />
78
+ <%= __("Great, you're all set up. Your emails will now be sent quickly and reliably!") %>
79
+ </p>
80
+
81
+ <div
82
+ class="mailpoet_description<% if(settings.mta_group == 'mailpoet') %> mailpoet_hidden<% endif %>"
83
+ id="mailpoet_sending_method_inactive_text"
84
+ >
85
+ <strong><%= __("Solve all of your sending problems!") %></strong>
86
+ <br />
87
+ <%= __("Let MailPoet send your emails and get the Premium features for as little as 10 dollars or euros per month.") %>
88
+ <ul class="sending-method-benefits mailpoet_success">
89
+ <li class="mailpoet_success_item"><%= __('Reach the inbox, not the spam box.') %>
90
+ <li class="mailpoet_success_item"><%= __('Send emails up to 20 times faster than other sending methods.') %>
91
+ <li class="mailpoet_success_item"><%= __('SPF & DKIM signatures are already set up! No configuration required.') %>
92
+ <li class="mailpoet_success_item"><%= __('Automatically remove invalid and bounced addresses (bounce handling) to keep your lists clean.') %>
93
+ </ul>
94
+ <a
95
+ href="<%= admin_url('admin.php?page=mailpoet-premium') %>"
96
+ class="button button-primary"
97
+ target="_blank"
98
+ ><%= __('Find out more') %></a>
99
+ </div>
100
+ </div>
101
  <div class="mailpoet_status">
102
  <span><%= __('Activated') %></span>
 
103
 
104
+ <div class="mailpoet_actions">
105
+ <button
106
+ type="button"
107
+ class="mailpoet_sending_service_activate button-secondary"
108
  <% if(settings.mta_group == 'mailpoet' or not(mss_key_valid)) %> disabled="disabled"<% endif %>
109
+ ><%= __('Activate') %></button>
110
+ </div>
111
  </div>
112
+
113
  </li>
114
  <li
115
  data-group="other"
116
  <% if(settings.mta_group == 'smtp' or settings.mta_group == 'website') %>class="mailpoet_active"<% endif %>
117
  >
118
+ <div class="mailpoet_sending_method_description">
119
+ <h3><%= __('Other') %></h3>
120
+ <div class="mailpoet_description">
121
+ <strong><%= __('Send with your website or third party') %></strong>
122
+ <br />
123
+ <%= __('Choose to send emails through your website (not recommended) or a third party sender.') %>
124
+ <ul class="sending-method-benefits mailpoet_error">
125
+ <li class="mailpoet_error_item"><%= __('You\'ll probably end up in spam.') %>
126
+ <li class="mailpoet_error_item"><%= __('Sending speed is limited by your web host.') %>
127
+ <li class="mailpoet_error_item"><%= __('Manual configuration of SPF and DKIM required.') %>
128
+ <li class="mailpoet_error_item"><%= __('Bounce handling is available, but only with an extra add-on.') %>
129
+ </ul>
130
+ </div>
131
+ </div>
132
+ <div class="mailpoet_status">
133
+ <span><%= __('Activated') %></span>
134
+ <div class="mailpoet_actions">
135
+ <a
136
+ class="button-secondary"
137
+ href="#mta/other"><%= __('Configure') %></a>
138
+ </div>
139
+ </div>
140
  </li>
141
  </ul>
142
 
279
  type="number"
280
  min="1"
281
  max="1000"
282
+ <% if(settings.mta.frequency.emails) %>
283
+ value="<%= settings.mta.frequency.emails %>"
284
  <% else %>
285
+ value="<%= default_frequency.website.emails %>"
286
  <% endif %>
287
  />
288
  <%= __('emails') %>
458
  </td>
459
  </tr>
460
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
461
  <!-- smtp: api key -->
462
  <tr class="mailpoet_sendgrid_field" data-field="api_key"
463
  <%
views/settings/premium.html CHANGED
@@ -25,22 +25,22 @@
25
  ><%= __('Verify') %></a>
26
  </div>
27
  <div
28
- class="mailpoet_premium_key_valid mailpoet_key_valid mailpoet_success<% if not(settings.premium.premium_key) or not(premium_key_valid) %> mailpoet_hidden<% endif %>"
29
  >
30
  <%= __('Your Premium key has been successfully validated.') %>
31
  </div>
32
  <div
33
- class="mailpoet_premium_key_invalid mailpoet_key_invalid mailpoet_error<% if not(settings.premium.premium_key) or premium_key_valid %> mailpoet_hidden<% endif %>"
34
  >
35
  <%= __('Your Premium key is invalid.') %>
36
  </div>
37
  <div
38
- class="mailpoet_mss_key_valid mailpoet_key_valid mailpoet_success<% if not(settings.mta.mailpoet_api_key) or not(mss_key_valid) %> mailpoet_hidden<% endif %>"
39
  >
40
  <%= __('Your MailPoet Sending Service key has been successfully validated.') %>
41
  </div>
42
  <div
43
- class="mailpoet_mss_key_invalid mailpoet_key_invalid mailpoet_error<% if not(settings.mta.mailpoet_api_key) or mss_key_valid %> mailpoet_hidden<% endif %>"
44
  >
45
  <%= __('Your MailPoet Sending Service key is invalid.') %>
46
  </div>
25
  ><%= __('Verify') %></a>
26
  </div>
27
  <div
28
+ class="mailpoet_premium_key_valid mailpoet_success_item mailpoet_success<% if not(settings.premium.premium_key) or not(premium_key_valid) %> mailpoet_hidden<% endif %>"
29
  >
30
  <%= __('Your Premium key has been successfully validated.') %>
31
  </div>
32
  <div
33
+ class="mailpoet_premium_key_invalid mailpoet_error_item mailpoet_error<% if not(settings.premium.premium_key) or premium_key_valid %> mailpoet_hidden<% endif %>"
34
  >
35
  <%= __('Your Premium key is invalid.') %>
36
  </div>
37
  <div
38
+ class="mailpoet_mss_key_valid mailpoet_success_item mailpoet_success<% if not(settings.mta.mailpoet_api_key) or not(mss_key_valid) %> mailpoet_hidden<% endif %>"
39
  >
40
  <%= __('Your MailPoet Sending Service key has been successfully validated.') %>
41
  </div>
42
  <div
43
+ class="mailpoet_mss_key_invalid mailpoet_error_item mailpoet_error<% if not(settings.mta.mailpoet_api_key) or mss_key_valid %> mailpoet_hidden<% endif %>"
44
  >
45
  <%= __('Your MailPoet Sending Service key is invalid.') %>
46
  </div>
views/update.html CHANGED
@@ -10,9 +10,12 @@
10
  </style>
11
 
12
  <div class="wrap mailpoet-about-wrap">
13
- <h1><%= __('Welcome to MailPoet') %> <%= settings.version %></h1>
14
 
15
- <p class="about-text"><%= __("Thank you for helping us test and improve this new version of MailPoet. You're one of our extra-special beta testers. We really appreciate your help!") %>
 
 
 
16
  </p>
17
  <div class="mailpoet-logo"><img src="<%= image_url('welcome_template/mailpoet-logo.png') %>" alt="MailPoet Logo" /></div>
18
 
@@ -21,8 +24,8 @@
21
  <a href="admin.php?page=mailpoet-update" class="nav-tab nav-tab-active"><%= __("What's New") %></a>
22
  </h2>
23
 
24
- <div id="mailpoet-changelog" clas="feature-section one-col">
25
- <h2><%= __("List of Changes") %></h2>
26
  <% if changelog %>
27
  <% for item in changelog %>
28
  <h3><%= item.version %></h3>
@@ -31,22 +34,50 @@
31
  <li><%= change %></li>
32
  <% endfor %>
33
  </ul>
34
- <br>
35
  <% endfor %>
36
  <% else %>
37
- <p style="text-align: center"><%= __("See readme.txt for a changelog.") %></p>
38
  <% endif %>
 
39
  </div>
40
 
41
  <hr>
42
 
43
- <div clas="feature-section one-col">
44
- <br>
45
- <p style="text-align: center"><a class="button button-primary" href="admin.php?page=mailpoet-newsletters"><%= __("Awesome! Now, take me to MailPoet") %> &rarr;</a> <a class="button button-secondary" href="https://wordpress.org/plugins/mailpoet/#developers" target="_blank"><%= __("View all changes") %> &rarr;</a></p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  </div>
47
 
48
- </div>
49
 
 
 
 
 
 
50
 
51
  <script type="text/javascript">
52
  jQuery(function($) {
@@ -56,7 +87,25 @@
56
  {'MailPoet Free version': window.mailpoet_version}
57
  );
58
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
  });
 
60
  </script>
61
  <% endblock %>
62
-
10
  </style>
11
 
12
  <div class="wrap mailpoet-about-wrap">
13
+ <h1><%= __('Greetings, humans.') %></h1>
14
 
15
+ <p class="about-text"><%= __('Thanks for using MailPoet! We really appreciate all of your love, affection, [link]and (good) plugin reviews.[/link]')
16
+ |replaceLinkTags('https://wordpress.org/support/plugin/wysija-newsletters/reviews/', {'target' : '_blank'})
17
+ |raw
18
+ %>
19
  </p>
20
  <div class="mailpoet-logo"><img src="<%= image_url('welcome_template/mailpoet-logo.png') %>" alt="MailPoet Logo" /></div>
21
 
24
  <a href="admin.php?page=mailpoet-update" class="nav-tab nav-tab-active"><%= __("What's New") %></a>
25
  </h2>
26
 
27
+ <div id="mailpoet-changelog" class="feature-section one-col-left">
28
+ <h2 class="mailpoet-feature-top"><%= __('List of Changes') %></h2>
29
  <% if changelog %>
30
  <% for item in changelog %>
31
  <h3><%= item.version %></h3>
34
  <li><%= change %></li>
35
  <% endfor %>
36
  </ul>
 
37
  <% endfor %>
38
  <% else %>
39
+ <p style="text-align: center"><%= __('See readme.txt for a changelog.') %></p>
40
  <% endif %>
41
+ <a class="button button-secondary" href="https://wordpress.org/plugins/mailpoet/#developers" target="_blank"><%= __('View all changes') %> &rarr;</a>
42
  </div>
43
 
44
  <hr>
45
 
46
+ <% if(not settings.analytics.enabled) %>
47
+ <div class="feature-section one-col">
48
+ <h2><%= __('Do Your Part to Make MailPoet Better') %></h2>
49
+ <div class="lead-description">
50
+
51
+ <label>
52
+ <input type="checkbox" id="mailpoet_analytics_enabled" value="1">&nbsp;
53
+ <%= __('Yes, share my data anonymously.') %>
54
+ </label>
55
+ </div>
56
+ <p><%= __("By sharing your data with us, you can help us understand what our users like (and don't like).") %>
57
+ <%= __('We use it to prioritize and develop new plugin features.') %><br>
58
+ <%= __('Share your data to help shape the future of MailPoet! [link]Read more.[/link]')
59
+ |replaceLinkTags('http://docs.mailpoet.com/article/36-share-your-data', {'target' : '_blank'})
60
+ |raw
61
+ %>
62
+ </div>
63
+
64
+ <hr>
65
+ <% endif %>
66
+
67
+ <div class="feature-section one-col">
68
+ <h2><%= __('Care to Give Your Opinion?') %></h2>
69
+
70
+ <script type="text/javascript" charset="utf-8" src="http://static.polldaddy.com/p/9780744.js"></script>
71
+ <noscript><a href="http://polldaddy.com/poll/9780744/">How likely is it that you would MailPoet to a friend or colleague?</a></noscript>
72
  </div>
73
 
74
+ <hr>
75
 
76
+ <div class="feature-section one-col">
77
+ <a class="button button-primary" href="admin.php?page=mailpoet-newsletters"><%= __('Awesome! Now, take me to MailPoet') %> &rarr;</a>
78
+ </div>
79
+
80
+ </div>
81
 
82
  <script type="text/javascript">
83
  jQuery(function($) {
87
  {'MailPoet Free version': window.mailpoet_version}
88
  );
89
  });
90
+ $('#mailpoet_analytics_enabled').on('click', function() {
91
+ var is_enabled = $(this).is(':checked') ? true : '';
92
+ MailPoet.Ajax.post({
93
+ api_version: window.mailpoet_api_version,
94
+ endpoint: 'settings',
95
+ action: 'set',
96
+ data: {
97
+ analytics: { enabled: (is_enabled)}
98
+ }
99
+ }).fail((response) => {
100
+ if (response.errors.length > 0) {
101
+ MailPoet.Notice.error(
102
+ response.errors.map((error) => { return error.message; }),
103
+ { scroll: true }
104
+ );
105
+ }
106
+ });
107
+ })
108
  });
109
+
110
  </script>
111
  <% endblock %>
 
views/welcome.html CHANGED
@@ -19,9 +19,12 @@
19
  </style>
20
 
21
  <div class="wrap mailpoet-about-wrap">
22
- <h1><%= __('Welcome to MailPoet') %> <%= settings.version %></h1>
23
 
24
- <p class="about-text"><%= __("Thank you for helping us test and improve this new version of MailPoet. You're one of our extra-special beta testers. We really appreciate your help!") %>
 
 
 
25
  </p>
26
  <div class="mailpoet-logo"><img src="<%= image_url('welcome_template/mailpoet-logo.png') %>" alt="<%= __('MailPoet Logo') %>" /></div>
27
 
19
  </style>
20
 
21
  <div class="wrap mailpoet-about-wrap">
22
+ <h1><%= __('Greetings, humans.') %></h1>
23
 
24
+ <p class="about-text"><%= __('Thanks for using MailPoet! We really appreciate all of your love, affection, [link]and (good) plugin reviews.[/link]')
25
+ |replaceLinkTags('https://wordpress.org/support/plugin/wysija-newsletters/reviews/', {'target' : '_blank'})
26
+ |raw
27
+ %>
28
  </p>
29
  <div class="mailpoet-logo"><img src="<%= image_url('welcome_template/mailpoet-logo.png') %>" alt="<%= __('MailPoet Logo') %>" /></div>
30