PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 10.11.1
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v10.11.1
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
acymailing / back / Helpers / Update / DefaultData.php

DefaultData.php in AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress 10.11.1, at back/Helpers/Update/DefaultData.php

514 lines 42.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace AcyMailing\Helpers\Update;
4
5 use AcyMailing\Classes\ActionClass;
6 use AcyMailing\Classes\AutomationClass;
7 use AcyMailing\Classes\ConditionClass;
8 use AcyMailing\Classes\FieldClass;
9 use AcyMailing\Classes\ListClass;
10 use AcyMailing\Classes\MailClass;
11 use AcyMailing\Classes\OverrideClass;
12 use AcyMailing\Classes\PluginClass;
13 use AcyMailing\Classes\RuleClass;
14 use AcyMailing\Classes\StepClass;
15 use AcyMailing\Classes\UserClass;
16
17 trait DefaultData
18 {
19 public function installBounceRules(): void
20 {
21 $ruleClass = new RuleClass();
22 if ($ruleClass->getOrderingNumber() > 0) {
23 return;
24 }
25 $replyTo = $this->config->get('replyto_email');
26 $bounce = $this->config->get('bounce_email');
27 $from = $this->config->get('from_email');
28
29 $forwardEmail = $replyTo != $bounce ? $replyTo : $from;
30 if (empty($forwardEmail)) {
31 $forwardEmail = acym_currentUserEmail();
32 }
33
34 $forwardAction = acym_escapeDB(json_encode(['0' => 'delete_message', '1' => 'forward_message', 'forward_to' => $forwardEmail]));
35
36 $query = "INSERT INTO `#__acym_rule` (`id`, `name`, `description`, `ordering`, `regex`, `executed_on`, `action_message`, `action_user`, `active`, `increment_stats`, `execute_action_after`) VALUES ";
37 $query .= "(1, 'ACYM_LIST_UNSUBSCRIBE_HANDLING', 'ACYM_LIST_UNSUBSCRIBE_HANDLING_DESC', 1, 'Please unsubscribe user ID \\\\d+', '[\"body\"]', '[\"delete_message\"]', '[\"unsubscribe_user\"]', 1, 0, 0),";
38 $query .= "(2, 'ACYM_SUPPRESSION_LIST', 'ACYM_SUPPRESSION_LIST_DESC', 2, 'suppression list', '[\"body\"]', '[\"delete_message\"]', '[\"unsubscribe_user\",\"block_user\",\"empty_queue_user\"]', 1, 1, 0),";
39 $query .= "(3, 'ACYM_ACTION_REQUIRED', 'ACYM_ACTION_REQUIRED_DESC', 3, 'action *requ|verif', '[\"subject\"]', ".$forwardAction.", '[]', 1, 0, 0),";
40 $query .= "(4, 'ACYM_ACKNOWLEDGMENT_RECEIPT_SUBJECT', 'ACYM_ACKNOWLEDGMENT_RECEIPT_SUBJECT_DESC', 4, '(out|away) *(of|from)|vacation|vacanze|vacaciones|holiday|absen|congés|recept|acknowledg|thank you for|Auto *Response|Incident|Automati|Ticket|Resposta *automática', '[\"subject\"]', '[\"delete_message\"]', '[]', 1, 0, 0),";
41 $query .= "(5, 'ACYM_FEEDBACK_LOOP', 'ACYM_FEEDBACK_LOOP_DESC', 5, 'feedback|[email protected]|complaints@.{0,15}email-abuse.amazonses.com|complaint about message', '[\"senderInfo\",\"subject\"]', '[\"save_message\",\"delete_message\"]', '[\"unsubscribe_user\",\"block_user\",\"empty_queue_user\"]', 1, 0, 0),";
42 $query .= "(6, 'ACYM_FEEDBACK_LOOP_BODY', 'ACYM_FEEDBACK_LOOP_BODY_DESC', 6, 'Feedback-Type.{1,5}abuse', '[\"body\"]', '[\"save_message\",\"delete_message\"]', '[\"unsubscribe_user\"]', 1, 1, 0),";
43 $query .= "(7, 'ACYM_MAILBOX_FULL', 'ACYM_MAILBOX_FULL_DESC', 7, '((mailbox|mailfolder|storage|quota|space|inbox) *(is)? *(over)? *(exceeded|size|storage|allocation|full|quota|maxi))|status(-code)? *(:|=)? *5.2.2|quota-issue|not *enough.{1,20}space|((over|exceeded|full|exhausted) *(allowed)? *(mail|storage|quota))|Space shortage', '[\"subject\",\"body\"]', '[\"save_message\",\"delete_message\"]', '[\"block_user\"]', 1, 1, 0),";
44 $query .= "(8, 'ACYM_BLOCKED_GOOGLE_GROUPS', 'ACYM_BLOCKED_GOOGLE_GROUPS_DESC', 8, 'message *rejected *by *Google *Groups', '[\"body\"]', '[\"delete_message\"]', '[\"block_user\"]', 1, 1, 3),";
45 $query .= "(9, 'ACYM_REJECTED', 'ACYM_REJECTED_DESC', 9, 'rejected *your *message|email *provider *rejected *it', '[\"body\"]', '[\"delete_message\"]', '[\"block_user\"]', 1, 1, 3),";
46 $query .= "(10, 'ACYM_MAILBOX_DOESNT_EXIST_1', 'ACYM_MAILBOX_DOESNT_EXIST_1_DESC', 10, '(Invalid|no such|unknown|bad|des?activated|inactive|unrouteable) *(mail|destination|recipient|user|address|person)|bad-mailbox|inactive-mailbox|not listed in.{1,20}directory|RecipNotFound|(user|mailbox|address|recipients?|host|account|domain) *(is|has been)? *(error|disabled|failed|unknown|unavailable|not *(found|available)|.{1,30}inactiv)|no *mailbox *here|user does.?n.t have.{0,30}account|no *longer *(active|working|in *use)|mail( *foi)? *desativado|recipient \'[^\']+\' not known', '[\"subject\",\"body\"]', '[\"save_message\",\"delete_message\"]', '[\"block_user\"]', 1, 1, 0),";
47 $query .= "(11, 'ACYM_MESSAGE_BLOCKED_RECIPIENTS', 'ACYM_MESSAGE_BLOCKED_RECIPIENTS_DESC', 11, 'blocked *by|block *list|look(ed)? *like *spam|spam-related|spam *detected| CXBL | CDRBL | IPBL | URLBL |(unacceptable|banned|offensive|filtered|blocked|unsolicited) *(content|message|e?-?mail)|service refused|(status(-code)?|554) *(:|=)? *5.7.1|administratively *denied|blacklisted *IP|policy *reasons|rejected.{1,10}spam|junkmail *rejected|throttling *constraints|exceeded.{1,10}max.{1,40}hour|comply with required standards|421 RP-00|550 SC-00|550 DY-00|550 OU-00|client *[0-9.]* *blocked *using', '[\"body\"]', ".$forwardAction.", '[\"block_user\"]', 1, 1, 3),";
48 $query .= "(12, 'ACYM_MAILBOX_DOESNT_EXIST_2', 'ACYM_MAILBOX_DOESNT_EXIST_2_DESC', 12, 'status(-? ?code)? *(:|=)? *(550)? *5.(1.[1-6]|0.0|4.[0123467])|recipient *(address *)?rejected|does *not *like *recipient|recipient *unknown *to *address|email *account *that *you *tried *to *reach *is *disabled|no *mail-enabled *subscriptions', '[\"subject\",\"body\"]', '[\"save_message\",\"delete_message\"]', '[\"block_user\"]', 1, 1, 0),";
49 $query .= "(13, 'ACYM_DOMAIN_NOT_EXIST', 'ACYM_DOMAIN_NOT_EXIST_DESC', 13, 'No.{1,10}MX *(record|host)|host *does *not *receive *any *mail|bad-domain|connection.{1,10}mail.{1,20}fail|domain.{1,10}not *exist|fail.{1,10}establish *connection|Unable *to *lookup *DNS *for|Unable *to *connect *to *remote *host', '[\"subject\",\"body\"]', '[\"save_message\",\"delete_message\"]', '[\"block_user\"]', 1, 1, 0),";
50 $query .= "(14, 'ACYM_TEMPORARY_FAILURES', 'ACYM_TEMPORARY_FAILURES_DESC', 14, 'has.*been.*delayed|delayed *mail|message *delayed|message-expired|temporar(il)?y *(failure|unavailable|disable|offline|unable)|deferred|delayed *([0-9]*) *(hour|minut)|possible *mail *loop|too *many *hops|delivery *time *expired|Action.php: *delayed|status(-code)? *(:|=)? *4.4.6|will continue to be attempted|unable to deliver in.*Status: 4.4.7|Connection *closed *unexpectedly', '[\"subject\",\"body\"]', '[\"save_message\",\"delete_message\"]', '[\"block_user\"]', 1, 1, 3),";
51 $query .= "(15, 'ACYM_FAILED_PERM', 'ACYM_FAILED_PERM_DESC', 15, 'failed *permanently|permanent.{1,20}(failure|error)|not *accepting *(any)? *mail|does *not *exist|no *valid *route|delivery *failure', '[\"subject\",\"body\"]', '[\"save_message\",\"delete_message\"]', '[\"block_user\"]', 1, 1, 0),";
52 $query .= "(16, 'ACYM_ACKNOWLEDGMENT_RECEIPT_BODY', 'ACYM_ACKNOWLEDGMENT_RECEIPT_BODY_DESC', 16, 'vacanc|holiday|vacation|absen|urlaub|ferie|feriado|vacanz|vacaciones|(out *of|not *in|outside)( *the)? *office|automatisch *(generierte)? *Antwort|confirm *we(\\'ve| *have) *received|den *Ferien|automática|RISPOSTA AUTOMATICA|vakantie|recepcionado *(su *)?requerimiento|Kiitos viestistäsi|nicht im Büro|nicht am Arbeitsplatz|automatic *reply|auto(-|mated *|matic *)reply|Email *has *been *recived|ricevuto *il *Suo *messaggio|ticket|poza *biurem|Automatic *respon|Case *Number|Α�
53 τόματη *απάντηση', '[\"body\"]', '[\"delete_message\"]', '[]', 1, 0, 0),";
54 $query .= "(17, 'ACYM_FINAL_RULE', 'ACYM_FINAL_RULE_DESC', 17, '.', '[\"senderInfo\",\"subject\"]', ".$forwardAction.", '[]', 1, 0, 0);";
55
56 acym_query($query);
57
58 $this->config->saveConfig(['bounceVersion' => self::BOUNCE_VERSION]);
59 }
60
61 public function installFields(): void
62 {
63 $query = "INSERT IGNORE INTO #__acym_field (`id`, `name`, `type`, `value`, `active`, `default_value`, `required`, `ordering`, `option`, `core`, `backend_edition`, `backend_listing`, `frontend_edition`, `frontend_listing`, `namekey`) VALUES
64 (1, 'ACYM_NAME', 'text', NULL, 1, NULL, 0, 1, '{\"error_message\":\"\",\"error_message_invalid\":\"\",\"size\":\"\",\"rows\":\"\",\"columns\":\"\",\"format\":\"\",\"custom_text\":\"\",\"css_class\":\"\",\"authorized_content\":{\"0\":\"all\",\"regex\":\"\"}}', 1, 1, 1, 1, 1, 'acym_name'),
65 (2, 'ACYM_EMAIL', 'text', NULL, 1, NULL, 1, 2, '{\"error_message\":\"\",\"error_message_invalid\":\"\",\"size\":\"\",\"rows\":\"\",\"columns\":\"\",\"format\":\"\",\"custom_text\":\"\",\"css_class\":\"\",\"authorized_content\":{\"0\":\"all\",\"regex\":\"\"}}', 1, 1, 1, 1, 1, 'acym_email');";
66 acym_query($query);
67
68 $fieldClass = new FieldClass();
69 $fieldClass->insertLanguageField();
70 }
71
72 public function installTemplates(): void
73 {
74 $mailClass = new MailClass();
75 $installedTemplates = 0;
76
77 $templates = acym_getFolders(ACYM_BACK.'templates'.DS, '.', false, true);
78 foreach ($templates as $oneTemplateFolderPath) {
79 $templateName = substr($oneTemplateFolderPath, strrpos($oneTemplateFolderPath, DS) + 1);
80 $templateName = str_replace('_', ' ', $templateName);
81
82 $oneMail = $mailClass->getOneByName($templateName, false, MailClass::TYPE_TEMPLATE);
83 if (!empty($oneMail)) {
84 continue;
85 }
86
87 if ($mailClass->installExtractedTemplate($oneTemplateFolderPath, false)) {
88 $installedTemplates++;
89 }
90 }
91
92 if ($installedTemplates === 0) {
93 acym_enqueueMessage(acym_translation('ACYM_DEFAULT_TEMPLATES_ALREADY_INSTALL'), 'info');
94 }
95 }
96
97 public function installDefaultAutomations(): void
98 {
99 $this->newAutomationAdmin('ACYM_ADMIN_USER_CREATE');
100 $this->newAutomationAdmin('ACYM_ADMIN_USER_MODIFICATION');
101 }
102
103 public function installList(): void
104 {
105 $listClass = new ListClass();
106 $listClass->addDefaultList();
107 }
108
109 public function installNotifications(): bool
110 {
111 $searchSettings = [
112 'offset' => 0,
113 'mailsPerPage' => 9000,
114 'key' => 'name',
115 ];
116
117 $mailClass = new MailClass();
118 $notifications = $mailClass->getMailsByType(MailClass::TYPE_NOTIFICATION, $searchSettings);
119 $notifications = $notifications['mails'];
120 $user = $this->getCurrentUser();
121 if (empty($user)) {
122 return false;
123 }
124
125 $addNotif = [];
126
127 if (empty($notifications['acy_report'])) {
128 $addNotif[] = [
129 'name' => 'acy_report',
130 'subject' => 'AcyMailing Cron Report {mainreport}',
131 'content' => '<p>{report}</p><p>{detailreport}</p>',
132 ];
133 }
134
135 if (empty($notifications['acy_confirm'])) {
136 $addNotif[] = [
137 'name' => 'acy_confirm',
138 'subject' => '{subscriber:name|ucfirst}, {trans:ACYM_PLEASE_CONFIRM_SUBSCRIPTION}',
139 'content' => $this->getFormatedNotification(
140 '<h1 style="font-size: 24px;">{trans:ACYM_HELLO} '.$this->getDTextDisplay('{subscriber:name|ucfirst}', 'Marc').',</h1>
141 <p>{trans:ACYM_CONFIRM_MESSAGE}</p>
142 <p>{trans:ACYM_CONFIRM_MESSAGE_ACTIVATE}</p>
143 <p style="text-align: center;"><strong>{confirm}{trans:ACYM_CONFIRM_SUBSCRIPTION}{/confirm}</strong></p>'
144 ),
145 ];
146 }
147
148 if (empty($notifications['acy_notification_create'])) {
149 $addNotif[] = [
150 'name' => 'acy_notification_create',
151 'subject' => acym_translation('ACYM_NOTIFICATION_CREATE_SUBJECT').': {user:email}',
152 'content' => $this->getFormatedNotification(
153 '<h1 style="font-size: 24px;">'.acym_translation('ACYM_HELLO').' '.$this->getDTextDisplay('{subscriber:name|ucfirst}', 'Marc').',</h1>
154 <p>'.acym_translation('ACYM_NOTIFICATION_CREATE_BODY').'</p>
155 <p>'.acym_translation('ACYM_NAME').': '.$this->getDTextDisplay('{user:name}', 'Julia').'</p>
156 <p>'.acym_translation('ACYM_EMAIL').': '.$this->getDTextDisplay('{user:email}', '[email protected]').'</p>
157 <p>'.acym_translation('ACYM_SOURCE').': '.$this->getDTextDisplay('{user:source}', 'registration_form').'</p>
158 <p>'.acym_translation('ACYM_SUBSCRIPTION').': '.$this->getDTextDisplay('{user:subscription}', 'Newsletters - 2020-11-02 14:38:24').'</p>'
159 ),
160 ];
161 }
162
163 if (empty($notifications['acy_notification_unsub'])) {
164 $addNotif[] = [
165 'name' => 'acy_notification_unsub',
166 'subject' => acym_translation('ACYM_NOTIFICATION_UNSUB_SUBJECT').': {user:email}',
167 'content' => $this->getFormatedNotification(
168 '<h1 style="font-size: 24px;">'.acym_translation('ACYM_HELLO').' '.$this->getDTextDisplay('{subscriber:name|ucfirst}', 'Marc').',</h1>
169 <p>'.acym_translation('ACYM_NOTIFICATION_UNSUB_BODY').'</p>
170 <p>'.acym_translation('ACYM_NAME').': '.$this->getDTextDisplay('{user:name}', 'Julia').'</p>
171 <p>'.acym_translation('ACYM_EMAIL').': '.$this->getDTextDisplay('{user:email}', '[email protected]').'</p>
172 <p>'.acym_translation('ACYM_LISTS').': '.$this->getDTextDisplay('{lists}', 'Newsletters, Tips').'</p>'
173 ),
174 ];
175 }
176
177 if (empty($notifications['acy_notification_unsuball'])) {
178 $addNotif[] = [
179 'name' => 'acy_notification_unsuball',
180 'subject' => acym_translation('ACYM_NOTIFICATION_UNSUBALL_SUBJECT').': {user:email}',
181 'content' => $this->getFormatedNotification(
182 '<h1 style="font-size: 24px;">'.acym_translation('ACYM_HELLO').' '.$this->getDTextDisplay('{subscriber:name|ucfirst}', 'Marc').',</h1>
183 <p>'.acym_translation('ACYM_NOTIFICATION_UNSUBALL_BODY').'</p>
184 <p>'.acym_translation('ACYM_NAME').': '.$this->getDTextDisplay('{user:name}', 'Julia').'</p>
185 <p>'.acym_translation('ACYM_EMAIL').': '.$this->getDTextDisplay('{user:email}', '[email protected]').'</p>'
186 ),
187 ];
188 }
189
190 if (empty($notifications['acy_notification_subform'])) {
191 $addNotif[] = [
192 'name' => 'acy_notification_subform',
193 'subject' => acym_translation('ACYM_NOTIFICATION_SUBFORM_SUBJECT').': {user:email}',
194 'content' => $this->getFormatedNotification(
195 '<h1 style="font-size: 24px;">'.acym_translation('ACYM_HELLO').' '.$this->getDTextDisplay('{subscriber:name|ucfirst}', 'Marc').',</h1>
196 <p>'.acym_translation('ACYM_NOTIFICATION_SUBFORM_BODY').'</p>
197 <p>'.acym_translation('ACYM_NAME').': '.$this->getDTextDisplay('{user:name}', 'Julia').'</p>
198 <p>'.acym_translation('ACYM_EMAIL').': '.$this->getDTextDisplay('{user:email}', '[email protected]').'</p>
199 <p>'.acym_translation('ACYM_SUBSCRIPTION').': '.$this->getDTextDisplay('{user:subscription}', 'Newsletters - 2025-11-02 14:38:24').'</p>'
200 ),
201 ];
202 }
203
204 if (empty($notifications['acy_notification_profile'])) {
205 $addNotif[] = [
206 'name' => 'acy_notification_profile',
207 'subject' => acym_translation('ACYM_NOTIFICATION_PROFILE_SUBJECT').': {user:email}',
208 'content' => $this->getFormatedNotification(
209 '<h1 style="font-size: 24px;">'.acym_translation('ACYM_HELLO').' '.$this->getDTextDisplay('{subscriber:name|ucfirst}', 'Marc').',</h1>
210 <p>'.acym_translation('ACYM_NOTIFICATION_PROFILE_BODY').'</p>
211 <p>'.acym_translation('ACYM_NAME').': '.$this->getDTextDisplay('{user:name}', 'Julia').'</p>
212 <p>'.acym_translation('ACYM_EMAIL').': '.$this->getDTextDisplay('{user:email}', '[email protected]').'</p>
213 <p>'.acym_translation('ACYM_SUBSCRIPTION').': '.$this->getDTextDisplay('{user:subscription}', 'Newsletters - 2025-11-02 14:38:24').'</p>'
214 ),
215 ];
216 }
217
218 if (empty($notifications['acy_notification_confirm'])) {
219 $addNotif[] = [
220 'name' => 'acy_notification_confirm',
221 'subject' => acym_translation('ACYM_NOTIFICATION_CONFIRM_SUBJECT').': {user:email}',
222 'content' => $this->getFormatedNotification(
223 '<h1 style="font-size: 24px;">'.acym_translation('ACYM_HELLO').' '.$this->getDTextDisplay('{subscriber:name|ucfirst}', 'Marc').',</h1>
224 <p>'.acym_translation('ACYM_NOTIFICATION_CONFIRM_BODY').'</p>
225 <p>'.acym_translation('ACYM_NAME').': '.$this->getDTextDisplay('{user:name}', 'Julia').'</p>
226 <p>'.acym_translation('ACYM_EMAIL').': '.$this->getDTextDisplay('{user:email}', '[email protected]').'</p>
227 <p>'.acym_translation('ACYM_IP').': '.$this->getDTextDisplay('{user:confirmation_ip}', '127.0.0.1').'</p>
228 <p>'.acym_translation('ACYM_SUBSCRIPTION').': '.$this->getDTextDisplay('{user:subscription}', 'Newsletters - 2025-11-02 14:38:24').'</p>'
229 ),
230 ];
231 }
232
233 if (empty($notifications['acy_notification_cms'])) {
234 $addNotif[] = [
235 'name' => 'acy_notification_cms',
236 'subject' => '{subject}',
237 'content' => '{body}',
238 'drag_editor' => 0,
239 ];
240 }
241
242 if (empty($notifications['acy_notification_auto_campaign_admin'])) {
243 $addNotif[] = [
244 'name' => 'acy_notification_auto_campaign_admin',
245 'subject' => acym_translation('ACYM_NOTIFICATION_AUTO_CAMPAIGN_SUBJECT'),
246 'content' => $this->getFormatedNotification(
247 '<h1 style="font-size: 24px;">'.acym_translation('ACYM_HELLO').' '.$this->getDTextDisplay('{subscriber:name|ucfirst}', 'Marc').',</h1>
248 <p>'.acym_translation('ACYM_NOTIFICATION_AUTO_CAMPAIGN_BODY').'</p>'
249 ),
250 ];
251 }
252
253 $firstEmail = $mailClass->getOneByName(acym_translation(self::FIRST_EMAIL_NAME_KEY));
254 if (empty($firstEmail)) {
255 $body = '<div id="acym__wysid__template" class="cell"><table class="body"><tbody><tr><td align="center" class="center acym__wysid__template__content" valign="top" style="background-color: rgb(239, 239, 239); padding: 30px 0px 120px;"><center><table align="center" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="acym__wysid__row ui-droppable ui-sortable" bgcolor="#ffffff" style="background-color: rgb(255, 255, 255); min-height: 0px; display: table-cell;"><table class="row acym__wysid__row__element" border="0" cellpadding="0" cellspacing="0" style="z-index: 100; background-color: rgb(238, 238, 238);" bgcolor="#eeeeee"><tbody bgcolor="" style="background-color: inherit;"><tr><th class="small-12 medium-12 large-12 columns" style="height: auto;"><table class="acym__wysid__column" style="min-height: 0px; display: table; height: auto;" border="0" cellpadding="0" cellspacing="0"><tbody class="ui-sortable" style="min-height: 0px; display: table-row-group; height: auto;"><tr class="acym__wysid__column__element ui-draggable" style="position: relative; top: inherit; left: inherit; right: inherit; bottom: inherit; height: auto;"><td class="large-12 acym__wysid__column__element__td" style="outline-width: 0px;"><div class="acym__wysid__tinymce--text mce-content-body" style="position: relative;" spellcheck="false" contenteditable="false" id="mce_41"><p style="font-family: Helvetica; font-size: 12px; font-weight: normal; font-style: normal; color: #000000; word-break: break-word; text-align: center; line-height: inherit;"><span style="font-size: 12px;">Having trouble seeing this email?&nbsp;<span class="mceNonEditable acym_dynamic" contenteditable="false" data-dynamic="{readonline}View it online{/readonline}"><a style="text-decoration: none; font-family: Helvetica; font-size: 12px; font-weight: normal; line-height: inherit; font-style: normal; color: #38c2f3;" href="view_it_online_link" target="_blank" rel="noopener"><span class="acym_online">View it online</span></a><em class="acym_remove_dynamic acymicon-close">‍‍</em></span>&nbsp;</span></p></div></td></tr></tbody></table></th></tr></tbody></table><table class="row acym__wysid__row__element" bgcolor="#ffffff" style="background-color: rgb(255, 255, 255); z-index: 100;" cellpadding="0" cellspacing="0" border="0"><tbody bgcolor="" style="background-color: inherit;"><tr><th class="small-12 medium-12 large-12 columns acym__wysid__row__element__th" valign="top"><table class="acym__wysid__column" border="0" cellpadding="0" cellspacing="0" style="min-height: 0px; display: table;"><tbody class="ui-sortable" style="min-height: 0px; display: table-row-group;"><tr class="acym__wysid__column__element ui-draggable" style="position: relative; top: inherit; left: inherit; right: inherit; bottom: inherit; height: auto;"><td class="large-12 acym__wysid__column__element__td" style="height: 21px; outline-width: 0px;"><span class="acy-editor__space" style="display:block; padding: 0;margin: 0; height: 100%"></span></td></tr><tr class="acym__wysid__column__element ui-draggable" style="position: relative; top: inherit; left: inherit; right: inherit; bottom: inherit; height: auto;"><td class="large-12 acym__wysid__column__element__td" style="outline-width: 0px;"><div class="acym__wysid__tinymce--image mce-content-body" style="position: relative;" spellcheck="false" contenteditable="false" id="mce_45"><p style="font-family: Helvetica; font-size: 12px; font-weight: normal; font-style: normal; color: #000000; word-break: break-word; line-height: inherit;"><img class="acym__wysid__media__inserted" style="max-width: 100%; height: 85px; box-sizing: border-box; padding: 0px 5px; display: block; margin-left: auto; margin-right: auto; width: 306px;" src="'.ACYM_LIVE.ACYM_UPLOAD_FOLDER.'logo_acymailing_step_email.png" alt="logo_acymailing_step_email.png" height="85" width="306"></p></div></td></tr><tr class="acym__wysid__column__element ui-draggable" style="position: relative; top: inherit; left: inherit; right: inherit; bottom: inherit; height: auto;"><td class="large-12 acym__wysid__column__element__td" style="height: 29px; outline-width: 0px;"><span class="acy-editor__space" style="display:block; padding: 0;margin: 0; height: 100%"></span></td></tr><tr class="acym__wysid__column__element acym__wysid__column__element__separator cursor-pointer ui-draggable" style="position: relative; top: inherit; left: inherit; right: inherit; bottom: inherit; height: auto;"><td class="large-12 acym__wysid__column__element__td" style="outline-width: 0px;"><hr style="border-bottom: 3px solid rgb(214, 214, 214); width: 24%; border-top: none; border-left: none; border-right: none; size: 3px;" class="acym__wysid__row__separator"></td></tr></tbody></table></th></tr></tbody></table><table class="row acym__wysid__row__element" bgcolor="#ffffff" style="background-color: rgb(255, 255, 255); z-index: 100;" cellpadding="0" cellspacing="0" border="0"><tbody bgcolor="" style="background-color: inherit;"><tr><th class="small-12 medium-12 large-12 columns acym__wysid__row__element__th" valign="top"><table class="acym__wysid__column" border="0" cellpadding="0" cellspacing="0" style="min-height: 0px; display: table;"><tbody class="ui-sortable" style="min-height: 0px; display: table-row-group;"><tr class="acym__wysid__column__element ui-draggable" style="position: relative; top: inherit; left: inherit; right: inherit; bottom: inherit; height: auto;"><td class="large-12 acym__wysid__column__element__td" style="outline-width: 0px;"><div class="acym__wysid__tinymce--text mce-content-body" style="position: relative;" spellcheck="false" contenteditable="false" id="mce_42"><h1 style="font-family: Helvetica; font-size: 20px; font-weight: normal; font-style: normal; color: #000000; line-height: inherit; text-align: left;">Dear&nbsp;<span class="mceNonEditable acym_dynamic" contenteditable="false" data-dynamic="{subscriber:name|part:first|ucfirst}">Admin<em class="acym_remove_dynamic acymicon-close">‍‍</em></span>,</h1></div></td></tr><tr class="acym__wysid__column__element ui-draggable" style="position: relative; top: inherit; left: inherit; right: inherit; bottom: inherit; height: auto;"><td class="large-12 acym__wysid__column__element__td" style="outline-width: 0px;"><div class="acym__wysid__tinymce--text mce-content-body" style="position: relative;" spellcheck="false" contenteditable="false" id="mce_43"><p style="word-break: break-word; font-family: Helvetica; font-size: 12px; font-weight: normal; font-style: normal; color: #000000; line-height: inherit; text-align: left;"><span style="color: #000000;"><span style="font-family: Helvetica;">Feel free to drag &amp; drop some content and&nbsp;</span><span style="font-family: Helvetica;">try the AcyMailing editor.</span></span></p><p style="word-break: break-word; font-family: Helvetica; font-size: 12px; font-weight: normal; font-style: normal; color: #000000; line-height: inherit; text-align: left;"><span style="color: #000000; font-family: Helvetica;">Once it is done, click on the "Apply" button.</span></p></div></td></tr></tbody></table></th></tr></tbody></table><table class="row acym__wysid__row__element" bgcolor="#ffffff" style="background-color: rgb(255, 255, 255); z-index: 100; padding: 0px;" cellpadding="0" cellspacing="0" border="0"><tbody bgcolor="" style="background-color: inherit;"><tr><th class="small-12 medium-12 large-12 columns acym__wysid__row__element__th" valign="top"><table class="acym__wysid__column" border="0" cellpadding="0" cellspacing="0" style="min-height: 0px; display: table;"><tbody class="ui-sortable" style="min-height: 0px; display: table-row-group;"><tr class="acym__wysid__column__element ui-draggable" style="position: relative; top: inherit; left: inherit; right: inherit; bottom: inherit; height: auto;"><td class="large-12 acym__wysid__column__element__td" style="outline-width: 0px;"><div class="acym__wysid__tinymce--image mce-content-body" style="position: relative;" spellcheck="false" contenteditable="false" id="mce_46"><p style="font-family: Helvetica; font-size: 12px; font-weight: normal; font-style: normal; color: #000000; word-break: break-word; line-height: inherit;"><img class="acym__wysid__media__inserted" style="max-width: 100%; height: auto; box-sizing: border-box; padding: 0px 5px; display: block; margin-left: auto; margin-right: auto; width: 580px;" src="'.ACYM_LIVE.ACYM_UPLOAD_FOLDER.'image_mailing_step_email.jpg" alt="image_mailing_step_email.jpg" height="400.68" width="580"></p></div></td></tr></tbody></table></th></tr></tbody></table><table class="row acym__wysid__row__element" bgcolor="#303e47" style="background-color: rgb(48, 62, 71); z-index: 100;" cellpadding="0" cellspacing="0" border="0"><tbody bgcolor="" style="background-color: inherit;"><tr><th class="small-12 medium-12 large-12 columns acym__wysid__row__element__th" valign="top"><table class="acym__wysid__column" border="0" cellpadding="0" cellspacing="0" style="min-height: 0px; display: table;"><tbody class="ui-sortable" style="min-height: 0px; display: table-row-group;"><tr class="acym__wysid__column__element ui-draggable" style="position: relative; top: inherit; left: inherit; right: inherit; bottom: inherit; height: auto;"><td class="large-12 acym__wysid__column__element__td" style="outline-width: 0px;"><div class="acym__wysid__tinymce--text mce-content-body" style="position: relative;" spellcheck="false" contenteditable="false" id="mce_44"><p style="font-family: Helvetica; font-size: 12px; font-weight: normal; font-style: normal; color: #000000; text-align: center; word-break: break-word; line-height: inherit;"><span style="color: #ffffff;">If you\'re not interested anymore, you can</span> <span class="mceNonEditable acym_dynamic" data-dynamic="{unsubscribe}unsubscribe{/unsubscribe}" contenteditable="false"><a style="text-decoration: none; font-family: Helvetica; font-size: 12px; font-weight: normal; line-height: inherit; font-style: normal; color: #38c2f3;" target="_blank" href="'.acym_frontendLink(
256 'frontusers&task=unsubscribe&id='.$user->id.'&key='.$user->key.'&'.acym_noTemplate()
257 ).'" rel="noopener"><span class="acym_unsubscribe acym_link" style="font-family: Helvetica; font-size: 12px; font-weight: normal; line-height: inherit; font-style: normal; color: #ffffff;">unsubscribe</span></a><em class="acym_remove_dynamic acymicon-close">‍</em></span></p></div></td></tr></tbody></table></th></tr></tbody></table></td></tr></tbody></table></center></td></tr></tbody></table></div>';
258
259 $addNotif[] = [
260 'name' => acym_translation(self::FIRST_EMAIL_NAME_KEY),
261 'subject' => acym_translation('ACYM_YOUR_FIRST_EMAIL'),
262 'content' => $body,
263 'settings' => '{"default":{"font-family":"Helvetica"},"p":{"font-family":"Helvetica","font-size":"12px","overridden":{"font-size":true,"line-height":true},"line-height":"inherit"},"a":{"font-family":"Helvetica","font-size":"12px","overridden":{"font-size":true,"line-height":true,"color":true},"line-height":"inherit","color":"#38c2f3"},"span.acym_link":{"font-family":"Helvetica","font-size":"12px","overridden":{"font-size":true,"line-height":true,"color":true},"line-height":"inherit","color":"#ffffff"},"h1":{"font-family":"Helvetica","font-size":"20px","overridden":{"font-size":true,"line-height":true},"line-height":"inherit"}}',
264 'type' => MailClass::TYPE_TEMPLATE,
265 'thumbnail' => 'thumbnail_first_email.png',
266 ];
267 $mailingImage = 'image_mailing_step_email.jpg';
268 $logoAcymailing = 'logo_acymailing_step_email.png';
269 $thumbnailFirstStep = 'thumbnail_first_email.png';
270
271 $uploadFolder = ACYM_ROOT.ACYM_UPLOAD_FOLDER;
272 $defaultImagesFolder = ACYM_ROOT.ACYM_MEDIA_FOLDER.'images'.DS.'templates'.DS.'first_email'.DS;
273
274 acym_createFolder($uploadFolder);
275 acym_createFolder(ACYM_UPLOAD_FOLDER_THUMBNAIL);
276
277 if (!file_exists($uploadFolder.$mailingImage)) {
278 copy(
279 $defaultImagesFolder.$mailingImage,
280 $uploadFolder.$mailingImage
281 );
282 }
283 if (!file_exists($uploadFolder.$logoAcymailing)) {
284 copy(
285 $defaultImagesFolder.$logoAcymailing,
286 $uploadFolder.$logoAcymailing
287 );
288 }
289 if (!file_exists(ACYM_UPLOAD_FOLDER_THUMBNAIL.$thumbnailFirstStep)) {
290 copy(
291 $defaultImagesFolder.$thumbnailFirstStep,
292 ACYM_UPLOAD_FOLDER_THUMBNAIL.$thumbnailFirstStep
293 );
294 }
295 }
296
297 if (!empty($addNotif)) {
298 foreach ($addNotif as $oneNotif) {
299 $notif = new \stdClass();
300 $notif->type = $oneNotif['type'] ?? MailClass::TYPE_NOTIFICATION;
301 $notif->settings = $oneNotif['settings'] ?? '';
302 $notif->drag_editor = $oneNotif['drag_editor'] ?? 1;
303 $notif->creator_id = acym_currentUserId();
304 $notif->creation_date = date('Y-m-d H:i:s', time() - date('Z'));
305 $notif->name = $oneNotif['name'];
306 $notif->subject = $oneNotif['subject'];
307 $notif->body = $oneNotif['content'];
308 $notif->thumbnail = $oneNotif['thumbnail'] ?? '';
309
310 $notif->id = $mailClass->save($notif);
311 if (empty($notif->id)) {
312 acym_enqueueMessage(acym_translationSprintf('ACYM_ERROR_INSTALLING_X_TEMPLATE', $notif->name), 'error');
313
314 return false;
315 }
316
317 if (strpos($notif->body, 'view_it_online_link') !== false) {
318 $viewItOnlineLink = 'archive&task=view&id='.$notif->id.'&userid='.$user->id.'-'.$user->key.'&'.acym_noTemplate();
319 $notif->body = str_replace('view_it_online_link', acym_frontendLink($viewItOnlineLink), $notif->body);
320 $mailClass->save($notif);
321 }
322 }
323 }
324
325 return true;
326 }
327
328 public function installAddons(): void
329 {
330 $pluginClass = new PluginClass();
331 $installedAddons = array_keys($pluginClass->getAll('folder_name'));
332 $coreAddons = acym_coreAddons();
333
334 foreach ($coreAddons as $oneAddon) {
335 if (in_array($oneAddon->folder_name, $installedAddons)) {
336 continue;
337 }
338
339 $pluginClass->save($oneAddon);
340 }
341 }
342
343 public function installOverrideEmails(): void
344 {
345 $overrideClass = new OverrideClass();
346 $mailClass = new MailClass();
347 $currentUserId = acym_currentUserId();
348
349 $emailOverrides = acym_getEmailOverrides();
350 $existingOverrides = $mailClass->getMailsByType(MailClass::TYPE_OVERRIDE, ['offset' => 0, 'mailsPerPage' => 9000, 'key' => 'name']);
351 $existingOverrides = $existingOverrides['mails'];
352
353 foreach ($emailOverrides as $oneOverride) {
354 if (!empty($existingOverrides[$oneOverride['name']])) {
355 continue;
356 }
357
358 $mail = new \stdClass();
359 $mail->name = $oneOverride['name'];
360 $mail->creation_date = date('Y-m-d H:i:s', time() - date('Z'));
361 $mail->type = MailClass::TYPE_OVERRIDE;
362 $mail->subject = $oneOverride['new_subject'];
363 $mail->body = $this->getFormatedNotification($oneOverride['new_body']);
364 $mail->drag_editor = 1;
365 $mail->creator_id = $currentUserId;
366 $mailId = $mailClass->save($mail);
367
368 if (empty($mailId)) {
369 continue;
370 }
371
372 $override = new \stdClass();
373 $override->mail_id = $mailId;
374 $override->description = $oneOverride['description'];
375 $override->source = $oneOverride['source'];
376 $override->active = 0;
377 $override->base_subject = json_encode($oneOverride['base_subject']);
378 $override->base_body = empty($oneOverride['base_body']) ? '' : json_encode($oneOverride['base_body']);
379
380 $overrideClass->save($override);
381 }
382 }
383
384 private function newAutomationAdmin(string $title): void
385 {
386 $automationClass = new AutomationClass();
387 $stepClass = new StepClass();
388 $conditionClass = new ConditionClass();
389 $mailClass = new MailClass();
390 $actionClass = new ActionClass();
391
392 $adminCreate = new \stdClass();
393 $adminCreate->desc = 'ACYM_ADMIN_USER_CREATE_DESC';
394 $adminCreate->triggers = '{"user_creation":[""],"type_trigger":"user"}';
395 $adminCreate->conditions = '{"type_condition":"user"}';
396 $adminCreate->emailTitle = acym_translation('ACYM_SUBSCRIBER_CREATION');
397 $adminCreate->emailSubject = acym_translation('ACYM_SUBSCRIBER_CREATION');
398 $adminCreate->emailContent = '<h1 style="font-size: 24px;">'.acym_translation('ACYM_HELLO').' '.$this->getDTextDisplay('{subscriber:name|ucfirst}', 'Marc').',</h1>
399 <p>'.acym_translation('ACYM_NEW_USER_ACYMAILING').':</p>
400 <p>'.acym_translation('ACYM_NAME').': '.$this->getDTextDisplay('{subscriber:name|info:current}', 'Roger').'</p>
401 <p>'.acym_translation('ACYM_EMAIL').': '.$this->getDTextDisplay('{subscriber:email|info:current}', '[email protected]').'</p>';
402
403 $adminModif = new \stdClass();
404 $adminModif->desc = 'ACYM_ADMIN_USER_MODIFICATION_DESC';
405 $adminModif->triggers = '{"user_modification":[""],"type_trigger":"user"}';
406 $adminModif->conditions = '{"type_condition":"user"}';
407 $adminModif->emailTitle = acym_translation('ACYM_SUBSCRIBER_MODIFICATION');
408 $adminModif->emailSubject = acym_translation('ACYM_SUBSCRIBER_MODIFICATION');
409 $adminModif->emailContent = '<h1 style="font-size: 24px;">'.acym_translation('ACYM_HELLO').' '.$this->getDTextDisplay('{subscriber:name|ucfirst}', 'Marc').',</h1>
410 <p>'.acym_translation('ACYM_USER_MODIFY_ACYMAILING').':</p>
411 <p>'.acym_translation('ACYM_NAME').': '.$this->getDTextDisplay('{subscriber:name|info:current}', 'Roger').'</p>
412 <p>'.acym_translation('ACYM_EMAIL').': '.$this->getDTextDisplay('{subscriber:email|info:current}', '[email protected]').'</p>';
413
414 $info = [
415 'ACYM_ADMIN_USER_CREATE' => $adminCreate,
416 'ACYM_ADMIN_USER_MODIFICATION' => $adminModif,
417 ];
418
419 $newAutomation = new \stdClass();
420 $newAutomation->name = acym_translation($title);
421 $newAutomation->description = acym_translation($info[$title]->desc);
422 $newAutomation->active = 0;
423 $newAutomation->admin = 1;
424 $newAutomation->id = $automationClass->save($newAutomation);
425 if (empty($newAutomation->id)) {
426 return;
427 }
428
429 $newStep = new \stdClass();
430 $newStep->name = acym_translation($title);
431 $newStep->triggers = $info[$title]->triggers;
432 $newStep->automation_id = $newAutomation->id;
433 $newStep->id = $stepClass->save($newStep);
434 if (empty($newStep->id)) {
435 return;
436 }
437
438 $newCondition = new \stdClass();
439 $newCondition->step_id = $newStep->id;
440 $newCondition->conditions = $info[$title]->conditions;
441 $newCondition->id = $conditionClass->save($newCondition);
442 if (empty($newCondition->id)) {
443 return;
444 }
445
446 $mailAutomation = new \stdClass();
447 $mailAutomation->type = MailClass::TYPE_AUTOMATION;
448 $mailAutomation->drag_editor = 1;
449 $mailAutomation->creator_id = acym_currentUserId();
450 $mailAutomation->creation_date = date('Y-m-d H:i:s', time() - date('Z'));
451 $mailAutomation->name = acym_translation($info[$title]->emailTitle);
452 $mailAutomation->subject = acym_translation($info[$title]->emailSubject);
453 $mailAutomation->body = $this->getFormatedNotification($info[$title]->emailContent);
454
455 $mailAutomation->id = $mailClass->save($mailAutomation);
456 if (empty($mailAutomation->id)) {
457 return;
458 }
459
460 $newAction = new \stdClass();
461 $newAction->condition_id = $newCondition->id;
462 $newAction->actions = '[{"acy_add_queue":{"mail_id":"'.intval($mailAutomation->id).'","time":"[time]"}}]';
463 $newAction->filters = '{"0":{"1":{"acy_field":{"field":"email","operator":"=","value":"'.acym_currentUserEmail().'"}}},"type_filter":"classic"}';
464 $newAction->order = 1;
465 $actionClass->save($newAction);
466 }
467
468 private function getDTextDisplay(string $dtext, string $preview): string
469 {
470 $display = '<span class="acym_dynamic mceNonEditable" contenteditable="false" data-dynamic="'.acym_escape($dtext).'" data-mce-selected="1">';
471 $display .= $preview;
472 $display .= '<em class="acym_remove_dynamic acymicon-close">&zwj;</em>';
473 $display .= '</span>';
474
475 return $display;
476 }
477
478 private function getFormatedNotification(string $content): string
479 {
480 $beginning = '<div id="acym__wysid__template" class="cell"><table class="body"><tbody><tr><td align="center" class="center acym__wysid__template__content" valign="top" style="background-color: rgb(239, 239, 239); padding: 40px 0 120px 0;"><center><table align="center" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="acym__wysid__row ui-droppable ui-sortable" style="min-height: 0px; display: table-cell;"><table class="row acym__wysid__row__element" bgcolor="#dadada" border="0" cellpadding="0" cellspacing="0"><tbody style="background-color: rgb(218,218,218);" bgcolor="#ffffff"><tr><th class="small-12 medium-12 large-12 columns acym__wysid__row__element__th"><table class="acym__wysid__column" style="min-height: 0px; display: table;" border="0" cellpadding="0" cellspacing="0"><tbody class="ui-sortable" style="min-height: 0px; display: table-row-group;"><tr class="acym__wysid__column__element ui-draggable" style="position: relative; top: inherit; left: inherit; right: inherit; bottom: inherit; height: auto;"><td class="large-12 acym__wysid__column__element__td" style="outline: rgb(0,163,254) dashed 0px; outline-offset: -1px;"><span class="acy-editor__space acy-editor__space--focus" style="display: block; padding: 0px; margin: 0px; height: 10px;"></span></td></tr></tbody></table></th></tr></tbody></table><table class="row acym__wysid__row__element" bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0"><tbody style="background-color: transparent;" bgcolor="#ffffff"><tr><th class="small-12 medium-12 large-12 columns"><table class="acym__wysid__column" style="min-height: 0px; display: table;" border="0" cellpadding="0" cellspacing="0"><tbody class="ui-sortable" style="min-height: 0px; display: table-row-group;"><tr class="acym__wysid__column__element ui-draggable" style="position: relative; top: inherit; left: inherit; right: inherit; bottom: inherit; height: auto;"><td class="large-12 acym__wysid__column__element__td" style="outline: rgb(0, 163, 254) dashed 0px; outline-offset: -1px;"><div class="acym__wysid__tinymce--text mce-content-body" style="position: relative;" spellcheck="false">';
481 $ending = '</div></td></tr></tbody></table></th></tr></tbody></table><table class="row acym__wysid__row__element" bgcolor="#dadada" style="position: relative; z-index: 100; top: 0; left: 0;" border="0" cellpadding="0" cellspacing="0"><tbody style="background-color: rgb(218, 218, 218);" bgcolor="#ffffff"><tr><th class="small-12 medium-12 large-12 columns acym__wysid__row__element__th"><table class="acym__wysid__column" style="min-height: 0px; display: table;" border="0" cellpadding="0" cellspacing="0"><tbody class="ui-sortable" style="min-height: 0px; display: table-row-group;"><tr class="acym__wysid__column__element ui-draggable" style="position: relative; top: inherit; left: inherit; right: inherit; bottom: inherit; height: auto;"><td class="large-12 acym__wysid__column__element__td" style="outline: rgb(0, 163, 254) dashed 0px; outline-offset: -1px;"><span class="acy-editor__space acy-editor__space--focus" style="display: block; padding: 0px; margin: 0px; height: 10px;"></span></td></tr></tbody></table></th></tr></tbody></table></td></tr></tbody></table></center></td></tr></tbody></table></div>';
482
483 return $beginning.$content.$ending;
484 }
485
486 private function getCurrentUser(): ?object
487 {
488 $currentCMSId = acym_currentUserId();
489 $userClass = new UserClass();
490 $user = $userClass->getOneByCMSId($currentCMSId);
491 if (!empty($user)) {
492 return $user;
493 }
494
495 $currentCMSEmail = acym_currentUserEmail();
496 $user = $userClass->getOneByEmail($currentCMSEmail);
497 if (!empty($user)) {
498 return $user;
499 }
500
501 $newUser = new \stdClass();
502 $newUser->email = $currentCMSEmail;
503 $newUser->confirmed = 1;
504 $newUser->cms_id = $currentCMSId;
505 $newUser->id = $userClass->save($newUser);
506
507 if (empty($newUser->id)) {
508 return null;
509 }
510
511 return $userClass->getOneById($newUser->id);
512 }
513 }
514