dolibarr 21.0.0-alpha
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2005-2019 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2016 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2021 Waƫl Almoman <info@almoman.com>
6 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
28if (!defined('NOSTYLECHECK')) {
29 define('NOSTYLECHECK', '1');
30}
31
32// Load Dolibarr environment
33require '../../main.inc.php';
34require_once DOL_DOCUMENT_ROOT.'/core/lib/emailing.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
36require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
37require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
38require_once DOL_DOCUMENT_ROOT.'/comm/mailing/class/mailing.class.php';
39require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
40require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
41require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
42
43// Load translation files required by the page
44$langs->loadLangs(array("mails", "admin"));
45
46$id = (GETPOSTINT('mailid') ? GETPOSTINT('mailid') : GETPOSTINT('id'));
47
48$action = GETPOST('action', 'aZ09');
49$confirm = GETPOST('confirm', 'alpha');
50$cancel = GETPOST('cancel', 'aZ09');
51$urlfrom = GETPOST('urlfrom');
52$backtopageforcancel = GETPOST('backtopageforcancel');
53
54// Initialize a technical objects
55$object = new Mailing($db);
56$extrafields = new ExtraFields($db);
57$hookmanager->initHooks(array('mailingcard', 'globalcard'));
58
59// Fetch optionals attributes and labels
60$extrafields->fetch_name_optionals_label($object->table_element);
61
62// Load object
63include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be 'include', not 'include_once'.
64
65// Array of possible substitutions (See also file mailing-send.php that should manage same substitutions)
66$object->substitutionarray = FormMail::getAvailableSubstitKey('emailing');
67
68
69// Set $object->substitutionarrayfortest
70$signature = ((!empty($user->signature) && !getDolGlobalString('MAIN_MAIL_DO_NOT_USE_SIGN')) ? $user->signature : '');
71
72$targetobject = null; // Not defined with mass emailing
73
74$parameters = array('mode' => 'emailing');
75$substitutionarray = FormMail::getAvailableSubstitKey('emailing', $targetobject);
76
77$object->substitutionarrayfortest = $substitutionarray;
78
79// List of sending methods
80$listofmethods = array();
81//$listofmethods['default'] = $langs->trans('DefaultOutgoingEmailSetup');
82$listofmethods['mail'] = 'PHP mail function';
83//$listofmethods['simplemail']='Simplemail class';
84$listofmethods['smtps'] = 'SMTP/SMTPS socket library';
85if (version_compare(phpversion(), '7.0', '>=')) {
86 $listofmethods['swiftmailer'] = 'Swift Mailer socket library';
87}
88
89// Security check
90if (!$user->hasRight('mailing', 'lire') || (!getDolGlobalString('EXTERNAL_USERS_ARE_AUTHORIZED') && $user->socid > 0)) {
92}
93if (empty($action) && empty($object->id)) {
94 accessforbidden('Object not found');
95}
96
97$upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, 2, 0, 1, $object, 'mailing');
98
99//$permissiontoread = $user->hasRight('maling', 'read');
100$permissiontocreate = $user->hasRight('mailing', 'creer');
101$permissiontovalidatesend = $user->hasRight('mailing', 'valider');
102$permissiontodelete = $user->hasRight('mailing', 'supprimer');
103
104
105/*
106 * Actions
107 */
108
109$parameters = array();
110$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
111if ($reshook < 0) {
112 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
113}
114
115if (empty($reshook)) {
116 $error = 0;
117
118 $backurlforlist = DOL_URL_ROOT.'/comm/mailing/list.php';
119
120 if (empty($backtopage) || ($cancel && empty($id))) {
121 if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
122 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
123 $backtopage = $backurlforlist;
124 } else {
125 $backtopage = DOL_URL_ROOT.'/comm/mailing/card.php?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
126 }
127 }
128 }
129
130 if ($cancel) {
131 /*var_dump($cancel);var_dump($backtopage);var_dump($backtopageforcancel);exit;*/
132 if (!empty($backtopageforcancel)) {
133 header("Location: ".$backtopageforcancel);
134 exit;
135 } elseif (!empty($backtopage)) {
136 header("Location: ".$backtopage);
137 exit;
138 }
139 $action = '';
140 }
141
142 // Action clone object
143 if ($action == 'confirm_clone' && $confirm == 'yes' && $permissiontocreate) {
144 if (!GETPOST("clone_content", 'alpha') && !GETPOST("clone_receivers", 'alpha')) {
145 setEventMessages($langs->trans("NoCloneOptionsSpecified"), null, 'errors');
146 } else {
147 $result = $object->createFromClone($user, $object->id, GETPOST("clone_content", 'alpha'), GETPOST("clone_receivers", 'alpha'));
148 if ($result > 0) {
149 header("Location: ".$_SERVER['PHP_SELF'].'?id='.$result);
150 exit;
151 } else {
152 setEventMessages($object->error, $object->errors, 'errors');
153 }
154 }
155 $action = '';
156 }
157
158 // Action send emailing for everybody
159 if ($action == 'sendallconfirmed' && $confirm == 'yes' && $permissiontovalidatesend) {
160 if (!getDolGlobalString('MAILING_LIMIT_SENDBYWEB')) {
161 // As security measure, we don't allow send from the GUI
162 setEventMessages($langs->trans("MailingNeedCommand"), null, 'warnings');
163 setEventMessages('<textarea cols="70" rows="'.ROWS_2.'" wrap="soft">php ./scripts/emailings/mailing-send.php '.$object->id.'</textarea>', null, 'warnings');
164 setEventMessages($langs->trans("MailingNeedCommand2"), null, 'warnings');
165 $action = '';
166 } elseif (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < 0) {
167 setEventMessages($langs->trans("NotEnoughPermissions"), null, 'warnings');
168 $action = '';
169 } else {
170 if ($object->status == 0) {
171 dol_print_error(null, 'ErrorMailIsNotValidated');
172 exit;
173 }
174
175 $id = $object->id;
176 $subject = $object->sujet;
177 $message = $object->body;
178 $from = $object->email_from;
179 $replyto = $object->email_replyto;
180 $errorsto = $object->email_errorsto;
181 // Is the message in html
182 $msgishtml = -1; // Unknown by default
183 if (preg_match('/[\s\t]*<html>/i', $message)) {
184 $msgishtml = 1;
185 }
186
187 // Warning, we must not use begin-commit transaction here
188 // because we want to save update for each mail sent.
189
190 $nbok = 0;
191 $nbko = 0;
192
193 // We choose mails not already sent for this mailing (statut=0)
194 // or sent in error (statut=-1)
195 $sql = "SELECT mc.rowid, mc.fk_mailing, mc.lastname, mc.firstname, mc.email, mc.other, mc.source_url, mc.source_id, mc.source_type, mc.tag";
196 $sql .= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc";
197 $sql .= " WHERE mc.statut < 1 AND mc.fk_mailing = ".((int) $object->id);
198 $sql .= " ORDER BY mc.statut DESC"; // first status 0, then status -1
199
200 dol_syslog("card.php: select targets", LOG_DEBUG);
201 $resql = $db->query($sql);
202 if ($resql) {
203 $num = $db->num_rows($resql); // Number of possible recipients
204
205 if ($num) {
206 dol_syslog("comm/mailing/card.php: nb of targets = ".$num, LOG_DEBUG);
207
208 $now = dol_now();
209
210 // Positioning date of start sending
211 $sql = "UPDATE ".MAIN_DB_PREFIX."mailing SET date_envoi='".$db->idate($now)."' WHERE rowid=".((int) $object->id);
212 $resql2 = $db->query($sql);
213 if (!$resql2) {
214 dol_print_error($db);
215 }
216
217 $thirdpartystatic = new Societe($db);
218 // Loop on each email and send it
219 $iforemailloop = 0;
220
221 while ($iforemailloop < $num && $iforemailloop < $conf->global->MAILING_LIMIT_SENDBYWEB) {
222 // Here code is common with same loop ino mailing-send.php
223 $res = 1;
224 $now = dol_now();
225
226 $obj = $db->fetch_object($resql);
227
228 // sendto en RFC2822
229 $sendto = str_replace(',', ' ', dolGetFirstLastname($obj->firstname, $obj->lastname))." <".$obj->email.">";
230
231 // Make substitutions on topic and body. From (AA=YY;BB=CC;...) we keep YY, CC, ...
232 $other = explode(';', $obj->other);
233 $tmpfield = explode('=', $other[0], 2);
234 $other1 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
235 $tmpfield = explode('=', $other[1], 2);
236 $other2 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
237 $tmpfield = explode('=', $other[2], 2);
238 $other3 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
239 $tmpfield = explode('=', $other[3], 2);
240 $other4 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
241 $tmpfield = explode('=', $other[4], 2);
242 $other5 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
243
244 $signature = ((!empty($user->signature) && !getDolGlobalString('MAIN_MAIL_DO_NOT_USE_SIGN')) ? $user->signature : '');
245
246 $parameters = array('mode' => 'emailing');
247 $substitutionarray = getCommonSubstitutionArray($langs, 0, array('object', 'objectamount'), $targetobject); // Note: On mass emailing, this is null because be don't know object
248
249 // Array of possible substitutions (See also file mailing-send.php that should manage same substitutions)
250 $substitutionarray['__ID__'] = $obj->source_id;
251 if ($obj->source_type == "thirdparty") {
252 $result = $thirdpartystatic->fetch($obj->source_id);
253
254 if ($result > 0) {
255 $substitutionarray['__THIRDPARTY_CUSTOMER_CODE__'] = $thirdpartystatic->code_client;
256 } else {
257 $substitutionarray['__THIRDPARTY_CUSTOMER_CODE__'] = '';
258 }
259 }
260 $substitutionarray['__EMAIL__'] = $obj->email;
261 $substitutionarray['__LASTNAME__'] = $obj->lastname;
262 $substitutionarray['__FIRSTNAME__'] = $obj->firstname;
263 $substitutionarray['__MAILTOEMAIL__'] = '<a href="mailto:'.$obj->email.'">'.$obj->email.'</a>';
264 $substitutionarray['__OTHER1__'] = $other1;
265 $substitutionarray['__OTHER2__'] = $other2;
266 $substitutionarray['__OTHER3__'] = $other3;
267 $substitutionarray['__OTHER4__'] = $other4;
268 $substitutionarray['__OTHER5__'] = $other5;
269 $substitutionarray['__USER_SIGNATURE__'] = $signature; // Signature is empty when ran from command line or taken from user in parameter)
270 $substitutionarray['__SENDEREMAIL_SIGNATURE__'] = $signature; // Signature is empty when ran from command line or taken from user in parameter)
271 $substitutionarray['__CHECK_READ__'] = '<img src="'.DOL_MAIN_URL_ROOT.'/public/emailing/mailing-read.php?tag='.urlencode($obj->tag).'&securitykey='.dol_hash(getDolGlobalString('MAILING_EMAIL_UNSUBSCRIBE_KEY').'-'.$obj->tag.'-'.$obj->email.'-'.$obj->rowid, "md5").'&email='.urlencode($obj->email).'&mtid='.((int) $obj->rowid).'" width="1" height="1" style="width:1px;height:1px" border="0"/>';
272 $substitutionarray['__UNSUBSCRIBE__'] = '<a href="'.DOL_MAIN_URL_ROOT.'/public/emailing/mailing-unsubscribe.php?tag='.urlencode($obj->tag).'&unsuscrib=1&securitykey='.dol_hash(getDolGlobalString('MAILING_EMAIL_UNSUBSCRIBE_KEY').'-'.$obj->tag.'-'.$obj->email.'-'.$obj->rowid, "md5").'&email='.urlencode($obj->email).'&mtid='.((int) $obj->rowid).'" target="_blank" rel="noopener noreferrer">'.$langs->trans("MailUnsubcribe").'</a>';
273 $substitutionarray['__UNSUBSCRIBE_URL__'] = DOL_MAIN_URL_ROOT.'/public/emailing/mailing-unsubscribe.php?tag='.urlencode($obj->tag).'&unsuscrib=1&securitykey='.dol_hash(getDolGlobalString('MAILING_EMAIL_UNSUBSCRIBE_KEY').'-'.$obj->tag.'-'.$obj->email.'-'.$obj->rowid, "md5").'&email='.urlencode($obj->email).'&mtid='.((int) $obj->rowid);
274
275 $onlinepaymentenabled = 0;
276 if (isModEnabled('paypal')) {
277 $onlinepaymentenabled++;
278 }
279 if (isModEnabled('paybox')) {
280 $onlinepaymentenabled++;
281 }
282 if (isModEnabled('stripe')) {
283 $onlinepaymentenabled++;
284 }
285 if ($onlinepaymentenabled && getDolGlobalString('PAYMENT_SECURITY_TOKEN')) {
286 require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
287 $substitutionarray['__ONLINEPAYMENTLINK_MEMBER__'] = getHtmlOnlinePaymentLink('member', $obj->source_id);
288 $substitutionarray['__ONLINEPAYMENTLINK_DONATION__'] = getHtmlOnlinePaymentLink('donation', $obj->source_id);
289 $substitutionarray['__ONLINEPAYMENTLINK_ORDER__'] = getHtmlOnlinePaymentLink('order', $obj->source_id);
290 $substitutionarray['__ONLINEPAYMENTLINK_INVOICE__'] = getHtmlOnlinePaymentLink('invoice', $obj->source_id);
291 $substitutionarray['__ONLINEPAYMENTLINK_CONTRACTLINE__'] = getHtmlOnlinePaymentLink('contractline', $obj->source_id);
292
293 $substitutionarray['__SECUREKEYPAYMENT__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), 2);
294 if (!getDolGlobalString('PAYMENT_SECURITY_TOKEN_UNIQUE')) {
295 $substitutionarray['__SECUREKEYPAYMENT_MEMBER__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), 2);
296 $substitutionarray['__SECUREKEYPAYMENT_DONATION__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), 2);
297 $substitutionarray['__SECUREKEYPAYMENT_ORDER__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), 2);
298 $substitutionarray['__SECUREKEYPAYMENT_INVOICE__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), 2);
299 $substitutionarray['__SECUREKEYPAYMENT_CONTRACTLINE__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), 2);
300 } else {
301 $substitutionarray['__SECUREKEYPAYMENT_MEMBER__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'member'.$obj->source_id, 2);
302 $substitutionarray['__SECUREKEYPAYMENT_DONATION__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'donation'.$obj->source_id, 2);
303 $substitutionarray['__SECUREKEYPAYMENT_ORDER__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'order'.$obj->source_id, 2);
304 $substitutionarray['__SECUREKEYPAYMENT_INVOICE__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'invoice'.$obj->source_id, 2);
305 $substitutionarray['__SECUREKEYPAYMENT_CONTRACTLINE__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'contractline'.$obj->source_id, 2);
306 }
307 }
308 if (getDolGlobalString('MEMBER_ENABLE_PUBLIC')) {
309 $substitutionarray['__PUBLICLINK_NEWMEMBERFORM__'] = '<a target="_blank" rel="noopener noreferrer" href="'.DOL_MAIN_URL_ROOT.'/public/members/new.php'.((isModEnabled('multicompany')) ? '?entity='.$conf->entity : '').'">'.$langs->trans('BlankSubscriptionForm'). '</a>';
310 }
311 /* For backward compatibility, deprecated */
312 if (isModEnabled('paypal') && getDolGlobalString('PAYPAL_SECURITY_TOKEN')) {
313 $substitutionarray['__SECUREKEYPAYPAL__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), 2);
314
315 if (!getDolGlobalString('PAYPAL_SECURITY_TOKEN_UNIQUE')) {
316 $substitutionarray['__SECUREKEYPAYPAL_MEMBER__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), 2);
317 } else {
318 $substitutionarray['__SECUREKEYPAYPAL_MEMBER__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN') . 'membersubscription'.$obj->source_id, 2);
319 }
320
321 if (!getDolGlobalString('PAYPAL_SECURITY_TOKEN_UNIQUE')) {
322 $substitutionarray['__SECUREKEYPAYPAL_ORDER__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), 2);
323 } else {
324 $substitutionarray['__SECUREKEYPAYPAL_ORDER__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN') . 'order'.$obj->source_id, 2);
325 }
326
327 if (!getDolGlobalString('PAYPAL_SECURITY_TOKEN_UNIQUE')) {
328 $substitutionarray['__SECUREKEYPAYPAL_INVOICE__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), 2);
329 } else {
330 $substitutionarray['__SECUREKEYPAYPAL_INVOICE__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN') . 'invoice'.$obj->source_id, 2);
331 }
332
333 if (!getDolGlobalString('PAYPAL_SECURITY_TOKEN_UNIQUE')) {
334 $substitutionarray['__SECUREKEYPAYPAL_CONTRACTLINE__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), 2);
335 } else {
336 $substitutionarray['__SECUREKEYPAYPAL_CONTRACTLINE__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN') . 'contractline'.$obj->source_id, 2);
337 }
338 }
339 //$substitutionisok=true;
340
341 complete_substitutions_array($substitutionarray, $langs);
342 $newsubject = make_substitutions($subject, $substitutionarray);
343 $newmessage = make_substitutions($message, $substitutionarray, null, 0);
344
345 $moreinheader = '';
346 if (preg_match('/__UNSUBSCRIBE_(_|URL_)/', $message)) {
347 $moreinheader = "List-Unsubscribe: <__UNSUBSCRIBE_URL__>\n";
348 $moreinheader = make_substitutions($moreinheader, $substitutionarray);
349 }
350
351 $arr_file = array();
352 $arr_mime = array();
353 $arr_name = array();
354 $arr_css = array();
355
356 $listofpaths = dol_dir_list($upload_dir, 'all', 0, '', '', 'name', SORT_ASC, 0);
357 if (count($listofpaths)) {
358 foreach ($listofpaths as $key => $val) {
359 $arr_file[] = $listofpaths[$key]['fullname'];
360 $arr_mime[] = dol_mimetype($listofpaths[$key]['name']);
361 $arr_name[] = $listofpaths[$key]['name'];
362 }
363 }
364
365 // Mail making
366 $trackid = 'emailing-'.$obj->fk_mailing.'-'.$obj->rowid;
367 $upload_dir_tmp = $upload_dir;
368 $mail = new CMailFile($newsubject, $sendto, $from, $newmessage, $arr_file, $arr_mime, $arr_name, '', '', 0, $msgishtml, $errorsto, $arr_css, $trackid, $moreinheader, 'emailing', $replyto, $upload_dir_tmp);
369
370 if ($mail->error) {
371 $res = 0;
372 }
373 /*if (! $substitutionisok)
374 {
375 $mail->error='Some substitution failed';
376 $res=0;
377 }*/
378
379 // Send mail
380 if ($res) {
381 $res = $mail->sendfile();
382 }
383
384 if ($res) {
385 // Mail successful
386 $nbok++;
387
388 dol_syslog("comm/mailing/card.php: ok for #".$iforemailloop.($mail->error ? ' - '.$mail->error : ''), LOG_DEBUG);
389
390 $sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles";
391 $sql .= " SET statut=1, date_envoi = '".$db->idate($now)."' WHERE rowid=".((int) $obj->rowid);
392 $resql2 = $db->query($sql);
393 if (!$resql2) {
394 dol_print_error($db);
395 } else {
396 //if check read is use then update prospect contact status
397 if (strpos($message, '__CHECK_READ__') !== false) {
398 //Update status communication of thirdparty prospect
399 $sql = "UPDATE ".MAIN_DB_PREFIX."societe SET fk_stcomm=2 WHERE rowid IN (SELECT source_id FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE rowid=".((int) $obj->rowid).")";
400 dol_syslog("card.php: set prospect thirdparty status", LOG_DEBUG);
401 $resql2 = $db->query($sql);
402 if (!$resql2) {
403 dol_print_error($db);
404 }
405
406 //Update status communication of contact prospect
407 $sql = "UPDATE ".MAIN_DB_PREFIX."societe SET fk_stcomm=2 WHERE rowid IN (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."socpeople AS sc INNER JOIN ".MAIN_DB_PREFIX."mailing_cibles AS mc ON mc.rowid=".((int) $obj->rowid)." AND mc.source_type = 'contact' AND mc.source_id = sc.rowid)";
408 dol_syslog("card.php: set prospect contact status", LOG_DEBUG);
409
410 $resql2 = $db->query($sql);
411 if (!$resql2) {
412 dol_print_error($db);
413 }
414 }
415 }
416
417 if (getDolGlobalString('MAILING_DELAY')) {
418 dol_syslog("Wait a delay of MAILING_DELAY=".((float) $conf->global->MAILING_DELAY));
419 usleep((int) ((float) $conf->global->MAILING_DELAY * 1000000));
420 }
421
422 //test if CHECK READ change statut prospect contact
423 } else {
424 // Mail failed
425 $nbko++;
426
427 dol_syslog("comm/mailing/card.php: error for #".$iforemailloop.($mail->error ? ' - '.$mail->error : ''), LOG_WARNING);
428
429 $sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles";
430 $sql .= " SET statut=-1, error_text='".$db->escape($mail->error)."', date_envoi='".$db->idate($now)."' WHERE rowid=".((int) $obj->rowid);
431 $resql2 = $db->query($sql);
432 if (!$resql2) {
433 dol_print_error($db);
434 }
435 }
436
437 $iforemailloop++;
438 }
439 } else {
440 setEventMessages($langs->transnoentitiesnoconv("NoMoreRecipientToSendTo"), null, 'mesgs');
441 }
442
443 // Loop finished, set global statut of mail
444 if ($nbko > 0) {
445 $statut = 2; // Status 'sent partially' (because at least one error)
446 setEventMessages($langs->transnoentitiesnoconv("EMailSentToNRecipients", $nbok), null, 'mesgs');
447 } else {
448 if ($nbok >= $num) {
449 $statut = 3; // Send to everybody
450 } else {
451 $statut = 2; // Status 'sent partially' (because not send to everybody)
452 }
453 setEventMessages($langs->transnoentitiesnoconv("EMailSentToNRecipients", $nbok), null, 'mesgs');
454 }
455
456 $sql = "UPDATE ".MAIN_DB_PREFIX."mailing SET statut=".((int) $statut)." WHERE rowid = ".((int) $object->id);
457 dol_syslog("comm/mailing/card.php: update global status", LOG_DEBUG);
458 $resql2 = $db->query($sql);
459 if (!$resql2) {
460 dol_print_error($db);
461 }
462 } else {
463 dol_syslog($db->error());
464 dol_print_error($db);
465 }
466 $object->fetch($id);
467 $action = '';
468 }
469 }
470
471 // Action send test emailing
472 if ($action == 'send' && ! $cancel && $permissiontovalidatesend) {
473 $error = 0;
474
475 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, 2, 0, 1, $object, 'mailing');
476
477 $object->sendto = GETPOST("sendto", 'alphawithlgt');
478 if (!$object->sendto) {
479 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("MailTo")), null, 'errors');
480 $error++;
481 }
482
483 if (!$error) {
484 // Is the message in html
485 $msgishtml = -1; // Unknown = autodetect by default
486 if (preg_match('/[\s\t]*<html>/i', $object->body)) {
487 $msgishtml = 1;
488 }
489
490 $signature = ((!empty($user->signature) && !getDolGlobalString('MAIN_MAIL_DO_NOT_USE_SIGN')) ? $user->signature : '');
491
492 $parameters = array('mode' => 'emailing');
493 $substitutionarray = getCommonSubstitutionArray($langs, 0, array('object', 'objectamount'), $targetobject); // Note: On mass emailing, this is null because be don't know object
494
495 // other are set at begin of page
496 $substitutionarray['__EMAIL__'] = $object->sendto;
497 $substitutionarray['__MAILTOEMAIL__'] = '<a href="mailto:'.$object->sendto.'">'.$object->sendto.'</a>';
498 $substitutionarray['__CHECK_READ__'] = '<img src="'.DOL_MAIN_URL_ROOT.'/public/emailing/mailing-read.php?tag=undefinedintestmode&securitykey='.dol_hash(getDolGlobalString('MAILING_EMAIL_UNSUBSCRIBE_KEY')."-undefinedintestmode-".$obj->sendto."-0", 'md5').'&email='.urlencode($obj->sendto).'&mtid=0" width="1" height="1" style="width:1px;height:1px" border="0"/>';
499 $substitutionarray['__UNSUBSCRIBE__'] = '<a href="'.DOL_MAIN_URL_ROOT.'/public/emailing/mailing-unsubscribe.php?tag=undefinedintestmode&unsuscrib=1&securitykey='.dol_hash(getDolGlobalString('MAILING_EMAIL_UNSUBSCRIBE_KEY')."-undefinedintestmode-".$obj->sendto."-0", 'md5').'&email='.urlencode($obj->sendto).'&mtid=0" target="_blank" rel="noopener noreferrer">'.$langs->trans("MailUnsubcribe").'</a>';
500 $substitutionarray['__UNSUBSCRIBE_URL__'] = DOL_MAIN_URL_ROOT.'/public/emailing/mailing-unsubscribe.php?tag=undefinedintestmode&unsuscrib=1&securitykey='.dol_hash(getDolGlobalString('MAILING_EMAIL_UNSUBSCRIBE_KEY')."-undefinedintestmode-".$obj->sendto."-0", 'md5').'&email='.urlencode($obj->sendto).'&mtid=0';
501
502 // Subject and message substitutions
503 complete_substitutions_array($substitutionarray, $langs, $targetobject);
504
505 $tmpsujet = make_substitutions($object->sujet, $substitutionarray);
506 $tmpbody = make_substitutions($object->body, $substitutionarray);
507
508 $arr_file = array();
509 $arr_mime = array();
510 $arr_name = array();
511 $arr_css = array();
512
513 // Add CSS
514 if (!empty($object->bgcolor)) {
515 $arr_css['bgcolor'] = (preg_match('/^#/', $object->bgcolor) ? '' : '#').$object->bgcolor;
516 }
517 if (!empty($object->bgimage)) {
518 $arr_css['bgimage'] = $object->bgimage;
519 }
520
521 // Attached files
522 $listofpaths = dol_dir_list($upload_dir, 'all', 0, '', '', 'name', SORT_ASC, 0);
523 if (count($listofpaths)) {
524 foreach ($listofpaths as $key => $val) {
525 $arr_file[] = $listofpaths[$key]['fullname'];
526 $arr_mime[] = dol_mimetype($listofpaths[$key]['name']);
527 $arr_name[] = $listofpaths[$key]['name'];
528 }
529 }
530
531 $trackid = 'emailing-test';
532 $upload_dir_tmp = $upload_dir;
533 $mailfile = new CMailFile($tmpsujet, $object->sendto, $object->email_from, $tmpbody, $arr_file, $arr_mime, $arr_name, '', '', 0, $msgishtml, $object->email_errorsto, $arr_css, $trackid, '', 'emailing', '', $upload_dir_tmp);
534
535 $result = $mailfile->sendfile();
536 if ($result) {
537 setEventMessages($langs->trans("MailSuccessfulySent", $mailfile->getValidAddress($object->email_from, 2), $mailfile->getValidAddress($object->sendto, 2)), null, 'mesgs');
538 $action = '';
539 } else {
540 setEventMessages($langs->trans("ResultKo").'<br>'.$mailfile->error.' '.json_encode($result), null, 'errors');
541 $action = 'test';
542 }
543 }
544 }
545
546 // Action add emailing
547 if ($action == 'add' && $permissiontocreate) {
548 $mesgs = array();
549
550 $object->messtype = (string) GETPOST("messtype");
551 if ($object->messtype == 'sms') {
552 $object->email_from = (string) GETPOST("from_phone", 'alphawithlgt'); // Must allow 'name <email>'
553 } else {
554 $object->email_from = (string) GETPOST("from", 'alphawithlgt'); // Must allow 'name <email>'
555 }
556 $object->email_replyto = (string) GETPOST("replyto", 'alphawithlgt'); // Must allow 'name <email>'
557 $object->email_errorsto = (string) GETPOST("errorsto", 'alphawithlgt'); // Must allow 'name <email>'
558 $object->title = (string) GETPOST("title");
559 $object->sujet = (string) GETPOST("sujet");
560 $object->body = (string) GETPOST("bodyemail", 'restricthtml');
561 $object->bgcolor = preg_replace('/^#/', '', (string) GETPOST("bgcolor"));
562 $object->bgimage = (string) GETPOST("bgimage");
563
564 if (!$object->title) {
565 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTitle"));
566 }
567 if ($object->messtype != 'sms' && !$object->sujet) {
568 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTopic"));
569 }
570 if (!$object->body) {
571 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailMessage"));
572 }
573
574 if (!count($mesgs)) {
575 if ($object->create($user) >= 0) {
576 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
577 exit;
578 }
579 $mesgs[] = $object->error;
580 $mesgs = array_merge($mesgs, $object->errors);
581 }
582
583 setEventMessages('', $mesgs, 'errors');
584 $action = "create";
585 }
586
587 // Action update description of emailing
588 if (($action == 'settitle' || $action == 'setemail_from' || $action == 'setemail_replyto' || $action == 'setreplyto' || $action == 'setemail_errorsto' || $action == 'setevenunsubscribe') && $permissiontovalidatesend) {
589 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, 2, 0, 1, $object, 'mailing');
590
591 if ($action == 'settitle') {
592 $object->title = trim(GETPOST('title', 'alpha'));
593 } elseif ($action == 'setemail_from') {
594 $object->email_from = trim(GETPOST('email_from', 'alphawithlgt')); // Must allow 'name <email>'
595 } elseif ($action == 'setemail_replyto') {
596 $object->email_replyto = trim(GETPOST('email_replyto', 'alphawithlgt')); // Must allow 'name <email>'
597 } elseif ($action == 'setemail_errorsto') {
598 $object->email_errorsto = trim(GETPOST('email_errorsto', 'alphawithlgt')); // Must allow 'name <email>'
599 } elseif ($action == 'settitle' && empty($object->title)) {
600 $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTitle"));
601 } elseif ($action == 'setfrom' && empty($object->email_from)) {
602 $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailFrom"));
603 } elseif ($action == 'setevenunsubscribe') {
604 $object->evenunsubscribe = (GETPOST('evenunsubscribe') ? 1 : 0);
605 }
606
607 if (!$mesg) {
608 $result = $object->update($user);
609 if ($result >= 0) {
610 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
611 exit;
612 }
613 $mesg = $object->error;
614 }
615
616 setEventMessages($mesg, $mesgs, 'errors');
617 $action = "";
618 }
619
620 /*
621 * Action of adding a file in email form
622 */
623 if (GETPOST('addfile') && $permissiontocreate) {
624 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, 2, 0, 1, $object, 'mailing');
625
626 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
627
628 // Set tmp user directory
629 dol_add_file_process($upload_dir, 0, 0, 'addedfile', '', null, '', 0);
630
631 $action = "edit";
632 }
633
634 // Action of file remove
635 if (GETPOST("removedfile") && $permissiontocreate) {
636 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, 2, 0, 1, $object, 'mailing');
637
638 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
639
640 dol_remove_file_process(GETPOST('removedfile'), 0, 0); // We really delete file linked to mailing
641
642 $action = "edit";
643 }
644
645 // Action of emailing update
646 if ($action == 'update' && !GETPOST("removedfile") && !$cancel && $permissiontocreate) {
647 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
648
649 $isupload = 0;
650
651 if (!$isupload) {
652 $mesgs = array();
653
654 //$object->messtype = (string) GETPOST("messtype"); // We must not be able to change the messtype
655 $object->sujet = (string) GETPOST("sujet");
656 $object->body = (string) GETPOST("bodyemail", 'restricthtml');
657 $object->bgcolor = preg_replace('/^#/', '', (string) GETPOST("bgcolor"));
658 $object->bgimage = (string) GETPOST("bgimage");
659
660 if ($object->messtype != 'sms' && !$object->sujet) {
661 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTopic"));
662 }
663 if (!$object->body) {
664 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailMessage"));
665 }
666
667 if (!count($mesgs)) {
668 if ($object->update($user) >= 0) {
669 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
670 exit;
671 }
672 $mesgs[] = $object->error;
673 $mesgs = array_merge($mesgs, $object->errors);
674 }
675
676 setEventMessages('', $mesgs, 'errors');
677 $action = "edit";
678 } else {
679 $action = "edit";
680 }
681 }
682
683 // Action of validation confirmation
684 if ($action == 'confirm_valid' && $confirm == 'yes' && $permissiontovalidatesend) {
685 if ($object->id > 0) {
686 $object->valid($user);
687 setEventMessages($langs->trans("MailingSuccessfullyValidated"), null, 'mesgs');
688 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
689 exit;
690 } else {
691 dol_print_error($db);
692 }
693 }
694
695 // Action of validation confirmation
696 if ($action == 'confirm_settodraft' && $confirm == 'yes' && $permissiontocreate) {
697 if ($object->id > 0) {
698 $result = $object->setStatut(0);
699 if ($result > 0) {
700 //setEventMessages($langs->trans("MailingSuccessfullyValidated"), null, 'mesgs');
701 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
702 exit;
703 } else {
704 setEventMessages($object->error, $object->errors, 'errors');
705 }
706 } else {
707 dol_print_error($db);
708 }
709 }
710
711 // Resend
712 if ($action == 'confirm_reset' && $confirm == 'yes' && $permissiontocreate) {
713 if ($object->id > 0) {
714 $db->begin();
715
716 $result = $object->valid($user);
717 if ($result > 0) {
718 $result = $object->reset_targets_status($user);
719 }
720
721 if ($result > 0) {
722 $db->commit();
723 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
724 exit;
725 } else {
726 setEventMessages($object->error, $object->errors, 'errors');
727 $db->rollback();
728 }
729 } else {
730 dol_print_error($db);
731 }
732 }
733
734 // Action of delete confirmation
735 if ($action == 'confirm_delete' && $confirm == 'yes' && $permissiontodelete) {
736 if ($object->delete($user)) {
737 $url = (!empty($urlfrom) ? $urlfrom : 'list.php');
738 header("Location: ".$url);
739 exit;
740 }
741 }
742
743 if ($cancel) {
744 $action = '';
745 }
746}
747
748
749/*
750 * View
751 */
752
753$form = new Form($db);
754$htmlother = new FormOther($db);
755
756$help_url = 'EN:Module_EMailing|FR:Module_Mailing|ES:M&oacute;dulo_Mailing';
758 '',
759 $langs->trans("Mailing"),
760 $help_url,
761 '',
762 0,
763 0,
764 array(
765 '/includes/ace/src/ace.js',
766 '/includes/ace/src/ext-statusbar.js',
767 '/includes/ace/src/ext-language_tools.js',
768 //'/includes/ace/src/ext-chromevox.js'
769 ),
770 array()
771);
772
773
774if ($action == 'create') {
775 // EMailing in creation mode
776 print '<form name="new_mailing" action="'.$_SERVER['PHP_SELF'].'" method="POST">'."\n";
777 print '<input type="hidden" name="token" value="'.newToken().'">';
778 print '<input type="hidden" name="action" value="add">';
779
780 $htmltext = '<i>'.$langs->trans("FollowingConstantsWillBeSubstituted").':<br><br><span class="small">';
781 foreach ($object->substitutionarray as $key => $val) {
782 $htmltext .= $key.' = '.$langs->trans($val).'<br>';
783 }
784 $htmltext .= '</span></i>';
785
786
787 $availablelink = $form->textwithpicto('<span class="opacitymedium">'.$langs->trans("AvailableVariables").'</span>', $htmltext, 1, 'helpclickable', '', 0, 2, 'availvar');
788 //print '<a href="javascript:document_preview(\''.DOL_URL_ROOT.'/admin/modulehelp.php?id='.$objMod->numero.'\',\'text/html\',\''.dol_escape_js($langs->trans("Module")).'\')">'.img_picto($langs->trans("ClickToShowDescription"), $imginfo).'</a>';
789
790
791 // Print mail form
792 print load_fiche_titre($langs->trans("NewMailing"), $availablelink, 'object_email');
793
794 print dol_get_fiche_head(array(), '', '', -3);
795
796 print '<table class="border centpercent">';
797
798 print '<tr><td class="fieldrequired titlefieldcreate">'.$langs->trans("MailTitle").'</td><td><input class="flat minwidth300" name="title" value="'.dol_escape_htmltag(GETPOST('title')).'" autofocus="autofocus"></td></tr>';
799
800 if (getDolGlobalInt('EMAILINGS_SUPPORT_ALSO_SMS')) {
801 $arrayoftypes = array("email" => "Email", "sms" => "SMS");
802 print '<tr><td class="fieldrequired titlefieldcreate">'.$langs->trans("Type").'</td><td>';
803 print $form->selectarray('messtype', $arrayoftypes, (GETPOSTISSET('messtype') ? GETPOST('messtype') : 'email'), 0, 0);
804
805 print '<script>
806 $( document ).ready(function() {
807 jQuery("#messtype").on("change", function() {
808 console.log("We change the message ttpe");
809 if (jQuery("#messtype").val() == "email") {
810 jQuery(".fieldsforsms").hide();
811 jQuery(".fieldsforemail").show();
812 }
813 if (jQuery("#messtype").val() == "sms") {
814 jQuery(".fieldsforsms").show();
815 jQuery(".fieldsforemail").hide();
816 }
817 });
818 jQuery("#messtype").change();
819 })
820 </script>';
821
822 print '</td></tr>';
823 }
824 print '</table>';
825
826 print '<br><br>';
827
828 print '<table class="border centpercent">';
829
830 print '<tr class="fieldsforemail"><td class="fieldrequired titlefieldcreate">'.$langs->trans("MailFrom").'</td><td><input class="flat minwidth200" name="from" value="'.(GETPOSTISSET('from') ? GETPOST('from') : getDolGlobalString('MAILING_EMAIL_FROM')).'"></td></tr>';
831
832 print '<tr class="fieldsforsms hidden"><td class="fieldrequired titlefieldcreate">'.$langs->trans("PhoneFrom").'</td><td><input class="flat minwidth200" name="fromphone" value="'.(GETPOSTISSET('fromphone') ? GETPOST('fromphone') : getDolGlobalString('MAILING_SMS_FROM')).'" placeholder="+123..."></td></tr>';
833
834 print '<tr class="fieldsforemail"><td>'.$langs->trans("MailErrorsTo").'</td><td><input class="flat minwidth200" name="errorsto" value="'.getDolGlobalString('MAILING_EMAIL_ERRORSTO', getDolGlobalString('MAIN_MAIL_ERRORS_TO')).'"></td></tr>';
835
836 // Other attributes
837 $parameters = array();
838 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
839 print $hookmanager->resPrint;
840 if (empty($reshook)) {
841 print $object->showOptionals($extrafields, 'create');
842 }
843
844 print '</table>';
845 print '<br><br>';
846
847 print '<table class="border centpercent">';
848 print '<tr class="fieldsforemail"><td class="fieldrequired titlefieldcreate">'.$langs->trans("MailTopic").'</td><td><input class="flat minwidth200 quatrevingtpercent" name="sujet" value="'.dol_escape_htmltag(GETPOST('sujet', 'alphanohtml')).'"></td></tr>';
849 print '<tr class="fieldsforemail"><td>'.$langs->trans("BackgroundColorByDefault").'</td><td colspan="3">';
850 print $htmlother->selectColor(GETPOST('bgcolor'), 'bgcolor', '', 0);
851 print '</td></tr>';
852
853 $formmail = new FormMail($db);
854 $formmail->withfckeditor = 1;
855 $formmail->withlayout = 1;
856 $formmail->withaiprompt = 'html';
857
858 print '<tr class="fieldsforemail"><td></td><td class="tdtop">';
859
860 $out = '';
861 $showlinktolayout = $formmail->withlayout && $formmail->withfckeditor;
862 $showlinktolayoutlabel = $langs->trans("FillMessageWithALayout");
863 $showlinktoai = ($formmail->withaiprompt && isModEnabled('ai')) ? 'textgenerationemail' : '';
864 $showlinktoailabel = $langs->trans("FillMessageWithAIContent");
865 $formatforouput = 'html';
866 $htmlname = 'bodyemail';
867
868 // Fill $out
869 include DOL_DOCUMENT_ROOT.'/core/tpl/formlayoutai.tpl.php';
870
871 print $out;
872
873 print '</td></tr>';
874 print '</table>';
875
876 print '<div style="padding-top: 10px">';
877 // wysiwyg editor
878 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
879 $doleditor = new DolEditor('bodyemail', GETPOST('bodyemail', 'restricthtmlallowunvalid'), '', 600, 'dolibarr_mailings', '', true, true, getDolGlobalInt('FCKEDITOR_ENABLE_MAILING'), 20, '90%');
880 $doleditor->Create();
881 print '</div>';
882
883 print dol_get_fiche_end();
884
885 print $form->buttonsSaveCancel("Create", 'Cancel');
886
887 print '</form>';
888} else {
889 if ($object->id > 0) {
890 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, 2, 0, 1, $object, 'mailing');
891
893
894 if ($action == 'settodraft') {
895 // Confirmation back to draft
896 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("SetToDraft"), $langs->trans("ConfirmUnvalidateEmailing"), "confirm_settodraft", '', '', 1);
897 } elseif ($action == 'valid') {
898 // Confirmation of mailing validation
899 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("ValidMailing"), $langs->trans("ConfirmValidMailing"), "confirm_valid", '', '', 1);
900 } elseif ($action == 'reset') {
901 // Confirm reset
902 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("ResetMailing"), $langs->trans("ConfirmResetMailing", $object->ref), "confirm_reset", '', '', 2);
903 } elseif ($action == 'delete') {
904 // Confirm delete
905 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id.(!empty($urlfrom) ? '&urlfrom='.urlencode($urlfrom) : ''), $langs->trans("DeleteMailing"), $langs->trans("ConfirmDeleteMailing"), "confirm_delete", '', '', 1);
906 }
907
908 if ($action != 'edit' && $action != 'edittxt' && $action != 'edithtml') {
909 print dol_get_fiche_head($head, 'card', $langs->trans("Mailing"), -1, 'email');
910
911 /*
912 * View mode mailing
913 */
914 if ($action == 'sendall') {
915 // Define message to recommend from command line
916 $sendingmode = getDolGlobalString('EMAILING_MAIL_SENDMODE');
917 if (empty($sendingmode)) {
918 $sendingmode = getDolGlobalString('MAIN_MAIL_SENDMODE');
919 }
920 if (empty($sendingmode)) {
921 $sendingmode = 'mail'; // If not defined, we use php mail function
922 }
923
924 // MAILING_NO_USING_PHPMAIL may be defined or not.
925 // MAILING_LIMIT_SENDBYWEB is always defined to something != 0 (-1=forbidden).
926 // MAILING_LIMIT_SENDBYCLI may be defined or not (-1=forbidden, 0 or undefined=no limit).
927 // MAILING_LIMIT_SENDBYDAY may be defined or not (0 or undefined=no limit).
928 if (getDolGlobalString('MAILING_NO_USING_PHPMAIL') && $sendingmode == 'mail') {
929 // EMailing feature may be a spam problem, so when you host several users/instance, having this option may force each user to use their own SMTP agent.
930 // You ensure that every user is using its own SMTP server when using the mass emailing module.
931 $linktoadminemailbefore = '<a href="'.DOL_URL_ROOT.'/admin/mails_emailing.php">';
932 $linktoadminemailend = '</a>';
933 setEventMessages($langs->trans("MailSendSetupIs", $listofmethods[$sendingmode]), null, 'warnings');
934 $messagetoshow = $langs->trans("MailSendSetupIs2", '{s1}', '{s2}', '{s3}', '{s4}');
935 $messagetoshow = str_replace('{s1}', $linktoadminemailbefore, $messagetoshow);
936 $messagetoshow = str_replace('{s2}', $linktoadminemailend, $messagetoshow);
937 $messagetoshow = str_replace('{s3}', $langs->transnoentitiesnoconv("MAIN_MAIL_SENDMODE"), $messagetoshow);
938 $messagetoshow = str_replace('{s4}', $listofmethods['smtps'], $messagetoshow);
939 setEventMessages($messagetoshow, null, 'warnings');
940
941 if (getDolGlobalString('MAILING_SMTP_SETUP_EMAILS_FOR_QUESTIONS')) {
942 setEventMessages($langs->trans("MailSendSetupIs3", getDolGlobalString('MAILING_SMTP_SETUP_EMAILS_FOR_QUESTIONS')), null, 'warnings');
943 }
944 $action = '';
945 } elseif (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < 0) {
946 if (getDolGlobalString('MAILING_LIMIT_WARNING_PHPMAIL') && $sendingmode == 'mail') {
947 setEventMessages($langs->transnoentitiesnoconv($conf->global->MAILING_LIMIT_WARNING_PHPMAIL), null, 'warnings');
948 }
949 if (getDolGlobalString('MAILING_LIMIT_WARNING_NOPHPMAIL') && $sendingmode != 'mail') {
950 setEventMessages($langs->transnoentitiesnoconv($conf->global->MAILING_LIMIT_WARNING_NOPHPMAIL), null, 'warnings');
951 }
952
953 // The feature is forbidden from GUI, we show just message to use from command line.
954 setEventMessages($langs->trans("MailingNeedCommand"), null, 'warnings');
955 setEventMessages('<textarea cols="60" rows="'.ROWS_1.'" wrap="soft">php ./scripts/emailings/mailing-send.php '.$object->id.'</textarea>', null, 'warnings');
956 if ($conf->file->mailing_limit_sendbyweb != '-1') { // MAILING_LIMIT_SENDBYWEB was set to -1 in database, but it is allowed to increase it.
957 setEventMessages($langs->trans("MailingNeedCommand2"), null, 'warnings'); // You can send online with constant...
958 }
959 $action = '';
960 } else {
961 if (getDolGlobalString('MAILING_LIMIT_WARNING_PHPMAIL') && $sendingmode == 'mail') {
962 setEventMessages($langs->transnoentitiesnoconv($conf->global->MAILING_LIMIT_WARNING_PHPMAIL), null, 'warnings');
963 }
964 if (getDolGlobalString('MAILING_LIMIT_WARNING_NOPHPMAIL') && $sendingmode != 'mail') {
965 setEventMessages($langs->transnoentitiesnoconv($conf->global->MAILING_LIMIT_WARNING_NOPHPMAIL), null, 'warnings');
966 }
967
968 $text = '';
969
970 if (getDolGlobalInt('MAILING_LIMIT_SENDBYDAY') > 0) {
971 $text .= $langs->trans('WarningLimitSendByDay', getDolGlobalInt('MAILING_LIMIT_SENDBYDAY'));
972 $text .= '<br><br>';
973 }
974 $text .= $langs->trans('ConfirmSendingEmailing').'<br>';
975 $text .= $langs->trans('LimitSendingEmailing', getDolGlobalString('MAILING_LIMIT_SENDBYWEB'));
976
977 if (!isset($conf->global->MAILING_LIMIT_SENDBYCLI) || getDolGlobalInt('MAILING_LIMIT_SENDBYCLI') >= 0) {
978 $text .= '<br><br>';
979 $text .= '<u>'.$langs->trans("AdvancedAlternative").':</u> '.$langs->trans("MailingNeedCommand");
980 $text .= '<br><textarea class="quatrevingtpercent" rows="'.ROWS_2.'" wrap="soft" disabled>php ./scripts/emailings/mailing-send.php '.$object->id.' '.$user->login.'</textarea>';
981 }
982
983 print $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('SendMailing'), $text, 'sendallconfirmed', '', '', 1, 380, 660, 0, $langs->trans("Confirm"), $langs->trans("Cancel"));
984 }
985 }
986
987 $linkback = '<a href="'.DOL_URL_ROOT.'/comm/mailing/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
988
989 $morehtmlref = '<div class="refidno">';
990 // Ref customer
991 $morehtmlref .= $form->editfieldkey("", 'title', $object->title, $object, $user->hasRight('mailing', 'creer'), 'string', '', 0, 1);
992 $morehtmlref .= $form->editfieldval("", 'title', $object->title, $object, $user->hasRight('mailing', 'creer'), 'string', '', null, null, '', 1);
993 $morehtmlref .= '</div>';
994
995 $morehtmlstatus = '';
996 $nbtry = $nbok = 0;
997 if ($object->status == 2 || $object->status == 3) {
998 $nbtry = $object->countNbOfTargets('alreadysent');
999 $nbko = $object->countNbOfTargets('alreadysentko');
1000
1001 $morehtmlstatus .= ' ('.$nbtry.'/'.$object->nbemail;
1002 if ($nbko) {
1003 $morehtmlstatus .= ' - '.$nbko.' '.$langs->trans("Error");
1004 }
1005 $morehtmlstatus .= ') &nbsp; ';
1006 }
1007
1008 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', $morehtmlstatus);
1009
1010 print '<div class="fichecenter">';
1011 print '<div class="fichehalfleft">';
1012 print '<div class="underbanner clearboth"></div>';
1013 print '<table class="border centpercent tableforfield">'."\n";
1014
1015 // From
1016 print '<tr><td class="titlefield">';
1017 print $form->editfieldkey("MailFrom", 'email_from', $object->email_from, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1018 print '</td><td>';
1019 print $form->editfieldval("MailFrom", 'email_from', $object->email_from, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1020 $email = CMailFile::getValidAddress($object->email_from, 2);
1021 if ($email && !isValidEmail($email)) {
1022 $langs->load("errors");
1023 print img_warning($langs->trans("ErrorBadEMail", $email));
1024 } elseif ($email && !isValidMailDomain($email)) {
1025 $langs->load("errors");
1026 print img_warning($langs->trans("ErrorBadMXDomain", $email));
1027 }
1028
1029 print '</td></tr>';
1030
1031 // Errors to
1032 if ($object->messtype != 'sms') {
1033 print '<tr><td>';
1034 print $form->editfieldkey("MailErrorsTo", 'email_errorsto', $object->email_errorsto, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1035 print '</td><td>';
1036 print $form->editfieldval("MailErrorsTo", 'email_errorsto', $object->email_errorsto, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1037 $emailarray = CMailFile::getArrayAddress($object->email_errorsto);
1038 foreach ($emailarray as $email => $name) {
1039 if ($name != $email) {
1040 print dol_escape_htmltag($name).' &lt;'.$email;
1041 print '&gt;';
1042 if ($email && !isValidEmail($email)) {
1043 $langs->load("errors");
1044 print img_warning($langs->trans("ErrorBadEMail", $email));
1045 } elseif ($email && !isValidMailDomain($email)) {
1046 $langs->load("errors");
1047 print img_warning($langs->trans("ErrorBadMXDomain", $email));
1048 }
1049 } else {
1050 print dol_print_email($object->email_errorsto, 0, 0, 0, 0, 1);
1051 }
1052 }
1053 print '</td></tr>';
1054 }
1055
1056 // Reply to
1057 if ($object->messtype != 'sms') {
1058 print '<tr><td>';
1059 print $form->editfieldkey("MailReply", 'email_replyto', $object->email_replyto, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1060 print '</td><td>';
1061 print $form->editfieldval("MailReply", 'email_replyto', $object->email_replyto, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1062 $email = CMailFile::getValidAddress($object->email_replyto, 2);
1063 if ($action != 'editemail_replyto') {
1064 if ($email && !isValidEmail($email)) {
1065 $langs->load("errors");
1066 print img_warning($langs->trans("ErrorBadEMail", $email));
1067 } elseif ($email && !isValidMailDomain($email)) {
1068 $langs->load("errors");
1069 print img_warning($langs->trans("ErrorBadMXDomain", $email));
1070 }
1071 }
1072 print '</td></tr>';
1073 }
1074
1075 print '</table>';
1076 print '</div>';
1077
1078 print '<div class="fichehalfright">';
1079 print '<div class="underbanner clearboth"></div>';
1080
1081 print '<table class="border centpercent tableforfield">';
1082
1083 // Number of distinct emails
1084 print '<tr><td>';
1085 print $langs->trans("TotalNbOfDistinctRecipients");
1086 print '</td><td>';
1087 $nbemail = ($object->nbemail ? $object->nbemail : 0);
1088 if (is_numeric($nbemail)) {
1089 $text = '';
1090 if ((getDolGlobalString('MAILING_LIMIT_SENDBYWEB') && getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < $nbemail) && ($object->status == 1 || ($object->status == 2 && $nbtry < $nbemail))) {
1091 if (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') > 0) {
1092 $text .= $langs->trans('LimitSendingEmailing', getDolGlobalString('MAILING_LIMIT_SENDBYWEB'));
1093 } else {
1094 $text .= $langs->trans('SendingFromWebInterfaceIsNotAllowed');
1095 }
1096 }
1097 if (empty($nbemail)) {
1098 $nbemail .= ' '.img_warning('').' <span class="warning">'.$langs->trans("NoTargetYet").'</span>';
1099 }
1100 if ($text) {
1101 print $form->textwithpicto($nbemail, $text, 1, 'warning');
1102 } else {
1103 print $nbemail;
1104 }
1105 }
1106 print '</td></tr>';
1107
1108 print '<tr><td>';
1109 print $langs->trans("MAIN_MAIL_SENDMODE");
1110 print '</td><td>';
1111 if ($object->messtype != 'sms') {
1112 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') && getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
1113 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING')];
1114 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE')) {
1115 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE')];
1116 } else {
1117 $text = $listofmethods['mail'];
1118 }
1119 print $text;
1120 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
1121 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'mail') {
1122 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER_EMAILING', getDolGlobalString('MAIN_MAIL_SMTP_SERVER')).')</span>';
1123 }
1124 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE') != 'mail' && getDolGlobalString('MAIN_MAIL_SMTP_SERVER')) {
1125 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
1126 }
1127 } else {
1128 print 'SMS ';
1129 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
1130 }
1131 print '</td></tr>';
1132
1133 // Other attributes. Fields from hook formObjectOptions and Extrafields.
1134 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
1135
1136 print '</table>';
1137 print '</div>';
1138 print '</div>';
1139
1140 print '<div class="clearboth"></div>';
1141
1142 print dol_get_fiche_end();
1143
1144
1145 // Clone confirmation
1146 if ($action == 'clone') {
1147 // Create an array for form
1148 $formquestion = array(
1149 'text' => $langs->trans("ConfirmClone"),
1150 0 => array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneContent"), 'value' => 1),
1151 1 => array('type' => 'checkbox', 'name' => 'clone_receivers', 'label' => $langs->trans("CloneReceivers"), 'value' => 0)
1152 );
1153 // Incomplete payment. On demande si motif = escompte ou autre
1154 print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneEMailing', $object->ref), 'confirm_clone', $formquestion, 'yes', 2, 240);
1155 }
1156
1157 // Actions Buttons
1158 if (GETPOST('cancel', 'alpha') || $confirm == 'no' || $action == '' || in_array($action, array('settodraft', 'valid', 'delete', 'sendall', 'clone', 'test', 'editevenunsubscribe'))) {
1159 print "\n\n<div class=\"tabsAction\">\n";
1160
1161 if (($object->status == 1) && ($user->hasRight('mailing', 'valider') || $object->user_validation_id == $user->id)) {
1162 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=settodraft&token='.newToken().'&id='.$object->id.'">'.$langs->trans("SetToDraft").'</a>';
1163 }
1164
1165 if (($object->status == 0 || $object->status == 1 || $object->status == 2) && $user->hasRight('mailing', 'creer')) {
1166 if (isModEnabled('fckeditor') && getDolGlobalString('FCKEDITOR_ENABLE_MAILING') && $object->messtype != 'sms') {
1167 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=edit&token='.newToken().'&id='.$object->id.'">'.$langs->trans("Edit").'</a>';
1168 } else {
1169 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=edittxt&token='.newToken().'&id='.$object->id.'">'.$langs->trans("EditWithTextEditor").'</a>';
1170 }
1171
1172 if (!getDolGlobalInt('EMAILINGS_SUPPORT_ALSO_SMS')) {
1173 if (!empty($conf->use_javascript_ajax)) {
1174 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=edithtml&token='.newToken().'&id='.$object->id.'">'.$langs->trans("EditHTMLSource").'</a>';
1175 }
1176 }
1177 }
1178
1179 //print '<a class="butAction" href="card.php?action=test&amp;id='.$object->id.'">'.$langs->trans("PreviewMailing").'</a>';
1180
1181 if (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !$user->hasRight('mailing', 'mailing_advance', 'send')) {
1182 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("TestMailing").'</a>';
1183 } else {
1184 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=test&token='.newToken().'&id='.$object->id.'">'.$langs->trans("TestMailing").'</a>';
1185 }
1186
1187 if ($object->status == 0) {
1188 if ($object->nbemail <= 0) {
1189 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NoTargetYet")).'">'.$langs->trans("Validate").'</a>';
1190 } elseif (!$user->hasRight('mailing', 'valider')) {
1191 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("Validate").'</a>';
1192 } else {
1193 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=valid&amp;id='.$object->id.'">'.$langs->trans("Validate").'</a>';
1194 }
1195 }
1196
1197 if (($object->status == 1 || $object->status == 2) && $object->nbemail > 0 && $user->hasRight('mailing', 'valider')) {
1198 if (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < 0) {
1199 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("SendingFromWebInterfaceIsNotAllowed")).'">'.$langs->trans("SendMailing").'</a>';
1200 } elseif (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !$user->hasRight('mailing', 'mailing_advance', 'send')) {
1201 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("SendMailing").'</a>';
1202 } else {
1203 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=sendall&amp;id='.$object->id.'">'.$langs->trans("SendMailing").'</a>';
1204 }
1205 }
1206
1207 if ($user->hasRight('mailing', 'creer')) {
1208 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=clone&amp;object=emailing&amp;id='.$object->id.'">'.$langs->trans("ToClone").'</a>';
1209 }
1210
1211 if (($object->status == 2 || $object->status == 3) && $user->hasRight('mailing', 'valider')) {
1212 if (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !$user->hasRight('mailing', 'mailing_advance', 'send')) {
1213 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("ResetMailing").'</a>';
1214 } else {
1215 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=reset&amp;id='.$object->id.'">'.$langs->trans("ResetMailing").'</a>';
1216 }
1217 }
1218
1219 if (($object->status <= 1 && $user->hasRight('mailing', 'creer')) || $user->hasRight('mailing', 'supprimer')) {
1220 if ($object->status > 0 && (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !$user->hasRight('mailing', 'mailing_advance', 'delete'))) {
1221 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("Delete").'</a>';
1222 } else {
1223 print '<a class="butActionDelete" href="'.$_SERVER['PHP_SELF'].'?action=delete&token='.newToken().'&id='.$object->id.(!empty($urlfrom) ? '&urlfrom='.$urlfrom : '').'">'.$langs->trans("Delete").'</a>';
1224 }
1225 }
1226
1227 print '</div>';
1228 }
1229
1230 // Display of the TEST form
1231 if ($action == 'test') {
1232 print '<div id="formmailbeforetitle" name="formmailbeforetitle"></div>';
1233 print load_fiche_titre($langs->trans("TestMailing"));
1234
1235 print dol_get_fiche_head(null, '', '', -1);
1236
1237 // Create mail form object
1238 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
1239 $formmail = new FormMail($db);
1240 $formmail->fromname = $object->email_from;
1241 $formmail->frommail = $object->email_from;
1242 $formmail->withsubstit = 0;
1243 $formmail->withfrom = 0;
1244 $formmail->withto = $user->email ? $user->email : 1;
1245 $formmail->withtocc = 0;
1246 $formmail->withtoccc = getDolGlobalString('MAIN_EMAIL_USECCC');
1247 $formmail->withtopic = 0;
1248 $formmail->withtopicreadonly = 1;
1249 $formmail->withfile = 0;
1250 $formmail->withlayout = 0;
1251 $formmail->withaiprompt = '';
1252 $formmail->withbody = 0;
1253 $formmail->withbodyreadonly = 1;
1254 $formmail->withcancel = 1;
1255 $formmail->withdeliveryreceipt = 0;
1256 // Table of substitutions
1257 $formmail->substit = $object->substitutionarrayfortest;
1258 // Table of post's complementary params
1259 $formmail->param["action"] = "send";
1260 $formmail->param["models"] = 'none';
1261 $formmail->param["mailid"] = $object->id;
1262 $formmail->param["returnurl"] = $_SERVER['PHP_SELF']."?id=".$object->id;
1263
1264 print $formmail->get_form();
1265
1266 print '<br>';
1267
1268 print dol_get_fiche_end();
1269
1270 dol_set_focus('#sendto');
1271 }
1272
1273
1274 $htmltext = '<i>'.$langs->trans("FollowingConstantsWillBeSubstituted").':<br><br><span class="small">';
1275 foreach ($object->substitutionarray as $key => $val) {
1276 $htmltext .= $key.' = '.$langs->trans($val).'<br>';
1277 }
1278 $htmltext .= '</span></i>';
1279
1280 // Print mail content
1281 print load_fiche_titre($langs->trans("EMail"), $form->textwithpicto('<span class="opacitymedium hideonsmartphone">'.$langs->trans("AvailableVariables").'</span>', $htmltext, 1, 'helpclickable', '', 0, 3, 'emailsubstitionhelp'), 'generic');
1282
1283 print dol_get_fiche_head('', '', '', -1);
1284
1285 print '<table class="bordernooddeven tableforfield centpercent">';
1286
1287 // Subject
1288 if ($object->messtype != 'sms') {
1289 print '<tr><td class="titlefield">'.$langs->trans("MailTopic").'</td><td colspan="3">'.$object->sujet.'</td></tr>';
1290 }
1291
1292 // Joined files
1293 if ($object->messtype != 'sms') {
1294 print '<tr><td>'.$langs->trans("MailFile").'</td><td colspan="3">';
1295 // List of files
1296 $listofpaths = dol_dir_list($upload_dir, 'all', 0, '', '', 'name', SORT_ASC, 0);
1297 if (count($listofpaths)) {
1298 foreach ($listofpaths as $key => $val) {
1299 print img_mime($listofpaths[$key]['name']).' '.$listofpaths[$key]['name'];
1300 print '<br>';
1301 }
1302 } else {
1303 print '<span class="opacitymedium">'.$langs->trans("NoAttachedFiles").'</span><br>';
1304 }
1305 print '</td></tr>';
1306 }
1307
1308 // Background color
1309 /*print '<tr><td width="15%">'.$langs->trans("BackgroundColorByDefault").'</td><td colspan="3">';
1310 print $htmlother->selectColor($object->bgcolor,'bgcolor','',0);
1311 print '</td></tr>';*/
1312
1313 print '</table>';
1314
1315 // Message
1316 print '<div style="padding-top: 10px; background: '.($object->bgcolor ? (preg_match('/^#/', $object->bgcolor) ? '' : '#').$object->bgcolor : 'white').'">';
1317 if (empty($object->bgcolor) || strtolower($object->bgcolor) == 'ffffff') { // CKEditor does not apply the color of the div into its content area
1318 $readonly = 1;
1319 // wysiwyg editor
1320 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1321 $doleditor = new DolEditor('bodyemail', $object->body, '', 600, 'dolibarr_mailings', '', false, true, !getDolGlobalString('FCKEDITOR_ENABLE_MAILING') ? 0 : 1, 20, '90%', $readonly);
1322 $doleditor->Create();
1323 } else {
1324 print dol_htmlentitiesbr($object->body);
1325 }
1326 print '</div>';
1327
1328 print dol_get_fiche_end();
1329 } else {
1330 /*
1331 * Edition mode mailing (CKeditor or HTML source)
1332 */
1333
1334 print dol_get_fiche_head($head, 'card', $langs->trans("Mailing"), -1, 'email');
1335
1336 $linkback = '<a href="'.DOL_URL_ROOT.'/comm/mailing/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
1337
1338 $morehtmlref = '<div class="refidno">';
1339 // Ref customer
1340 $morehtmlref .= $form->editfieldkey("", 'title', $object->title, $object, $user->hasRight('mailing', 'creer'), 'string', '', 0, 1);
1341 $morehtmlref .= $form->editfieldval("", 'title', $object->title, $object, $user->hasRight('mailing', 'creer'), 'string', '', null, null, '', 1);
1342 $morehtmlref .= '</div>';
1343
1344 $morehtmlstatus = '';
1345 $nbtry = $nbok = 0;
1346 if ($object->status == 2 || $object->status == 3) {
1347 $nbtry = $object->countNbOfTargets('alreadysent');
1348 $nbko = $object->countNbOfTargets('alreadysentko');
1349
1350 $morehtmlstatus .= ' ('.$nbtry.'/'.$object->nbemail;
1351 if ($nbko) {
1352 $morehtmlstatus .= ' - '.$nbko.' '.$langs->trans("Error");
1353 }
1354 $morehtmlstatus .= ') &nbsp; ';
1355 }
1356
1357 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', $morehtmlstatus);
1358
1359 print '<div class="fichecenter">';
1360 print '<div class="fichehalfleft">';
1361 print '<div class="underbanner clearboth"></div>';
1362
1363 print '<table class="border centpercent tableforfield">';
1364
1365 /*
1366 print '<tr><td class="titlefield">'.$langs->trans("Ref").'</td>';
1367 print '<td colspan="3">';
1368 print $form->showrefnav($object,'id', $linkback);
1369 print '</td></tr>';
1370 */
1371
1372 // From
1373 print '<tr><td class="titlefield">';
1374 print $langs->trans("MailFrom");
1375 print '</td><td>'.dol_print_email($object->email_from, 0, 0, 0, 0, 1).'</td></tr>';
1376 // To
1377 if ($object->messtype != 'sms') {
1378 print '<tr><td>'.$langs->trans("MailErrorsTo").'</td><td>'.dol_print_email($object->email_errorsto, 0, 0, 0, 0, 1).'</td></tr>';
1379 }
1380
1381 print '</table>';
1382 print '</div>';
1383
1384
1385 print '<div class="fichehalfright">';
1386 print '<div class="underbanner clearboth"></div>';
1387
1388 print '<table class="border centpercent tableforfield">';
1389
1390 // Number of distinct emails
1391 print '<tr><td>';
1392 print $langs->trans("TotalNbOfDistinctRecipients");
1393 print '</td><td>';
1394 $nbemail = ($object->nbemail ? $object->nbemail : 0);
1395 if (is_numeric($nbemail)) {
1396 $text = '';
1397 if ((getDolGlobalString('MAILING_LIMIT_SENDBYWEB') && $conf->global->MAILING_LIMIT_SENDBYWEB < $nbemail) && ($object->status == 1 || $object->status == 2)) {
1398 if (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') > 0) {
1399 $text .= $langs->trans('LimitSendingEmailing', getDolGlobalString('MAILING_LIMIT_SENDBYWEB'));
1400 } else {
1401 $text .= $langs->trans('SendingFromWebInterfaceIsNotAllowed');
1402 }
1403 }
1404 if (empty($nbemail)) {
1405 $nbemail .= ' '.img_warning('').' <span class="warning">'.$langs->trans("NoTargetYet").'</span>';
1406 }
1407 if ($text) {
1408 print $form->textwithpicto($nbemail, $text, 1, 'warning');
1409 } else {
1410 print $nbemail;
1411 }
1412 }
1413 print '</td></tr>';
1414
1415 print '<tr><td>';
1416 print $langs->trans("MAIN_MAIL_SENDMODE");
1417 print '</td><td>';
1418 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') && getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
1419 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING')];
1420 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE')) {
1421 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE')];
1422 } else {
1423 $text = $listofmethods['mail'];
1424 }
1425 print $text;
1426 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
1427 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'mail') {
1428 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER_EMAILING').')</span>';
1429 }
1430 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE') != 'mail' && getDolGlobalString('MAIN_MAIL_SMTP_SERVER')) {
1431 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
1432 }
1433 print '</td></tr>';
1434
1435
1436 // Other attributes
1437 $parameters = array();
1438 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1439 print $hookmanager->resPrint;
1440 if (empty($reshook)) {
1441 print $object->showOptionals($extrafields, 'edit', $parameters);
1442 }
1443
1444 print '</table>';
1445 print '</div>';
1446 print '</div>';
1447
1448 print '<div class="clearboth"></div>';
1449
1450 print dol_get_fiche_end();
1451
1452
1453 print "<br><br>\n";
1454
1455 print '<form name="edit_mailing" action="card.php" method="post" enctype="multipart/form-data">'."\n";
1456 print '<input type="hidden" name="token" value="'.newToken().'">';
1457 print '<input type="hidden" name="action" value="update">';
1458 print '<input type="hidden" name="id" value="'.$object->id.'">';
1459
1460 $htmltext = '<i>'.$langs->trans("FollowingConstantsWillBeSubstituted").':<br><br><span class="small">';
1461 foreach ($object->substitutionarray as $key => $val) {
1462 $htmltext .= $key.' = '.$langs->trans($val).'<br>';
1463 }
1464 $htmltext .= '</span></i>';
1465
1466 // Print mail content
1467 print load_fiche_titre($langs->trans("EMail"), '<span class="opacitymedium">'.$form->textwithpicto($langs->trans("AvailableVariables").'</span>', $htmltext, 1, 'help', '', 0, 2, 'emailsubstitionhelp'), 'generic');
1468
1469 print dol_get_fiche_head(null, '', '', -1);
1470
1471 print '<table class="bordernooddeven centpercent">';
1472
1473 // Subject
1474 if ($object->messtype != 'sms') {
1475 print '<tr><td class="fieldrequired titlefield">';
1476 print $langs->trans("MailTopic");
1477 print '</td><td colspan="3"><input class="flat quatrevingtpercent" type="text" name="sujet" value="'.$object->sujet.'"></td></tr>';
1478 }
1479
1480 $trackid = ''; // TODO To avoid conflicts with 2 mass emailing, we should set a trackid here, even if we use another one into email header.
1481 dol_init_file_process($upload_dir, $trackid);
1482
1483 // Joined files
1484 if ($object->messtype != 'sms') {
1485 $addfileaction = 'addfile';
1486 print '<tr><td>'.$langs->trans("MailFile").'</td>';
1487 print '<td colspan="3">';
1488 // List of files
1489 $listofpaths = dol_dir_list($upload_dir, 'all', 0, '', '', 'name', SORT_ASC, 0);
1490 $out = '';
1491
1492 // TODO Trick to have param removedfile containing nb of image to delete. But this does not works without javascript
1493 $out .= '<input type="hidden" class="removedfilehidden" name="removedfile" value="">'."\n";
1494 $out .= '<script type="text/javascript">';
1495 $out .= 'jQuery(document).ready(function () {';
1496 $out .= ' jQuery(".removedfile").click(function() {';
1497 $out .= ' jQuery(".removedfilehidden").val(jQuery(this).val());';
1498 $out .= ' });';
1499 $out .= '})';
1500 $out .= '</script>'."\n";
1501 if (count($listofpaths)) {
1502 foreach ($listofpaths as $key => $val) {
1503 $out .= '<div id="attachfile_'.$key.'">';
1504 $out .= img_mime($listofpaths[$key]['name']).' '.$listofpaths[$key]['name'];
1505 $out .= ' <input type="image" style="border: 0px;" src="'.img_picto($langs->trans("Search"), 'delete.png', '', '', 1).'" value="'.($key + 1).'" class="removedfile" id="removedfile_'.$key.'" name="removedfile_'.$key.'" />';
1506 $out .= '<br></div>';
1507 }
1508 } else {
1509 //$out .= '<span class="opacitymedium">'.$langs->trans("NoAttachedFiles").'</span><br>';
1510 }
1511
1512 // Add link to add file
1513 $maxfilesizearray = getMaxFileSizeArray();
1514 $maxmin = $maxfilesizearray['maxmin'];
1515 if ($maxmin > 0) {
1516 $out .= '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
1517 }
1518 $out .= '<input type="file" class="flat" id="addedfile" name="addedfile" value="'.$langs->trans("Upload").'" />';
1519 $out .= ' ';
1520 $out .= '<input type="submit" class="button smallpaddingimp" id="'.$addfileaction.'" name="'.$addfileaction.'" value="'.$langs->trans("MailingAddFile").'" />';
1521 print $out;
1522 print '</td></tr>';
1523
1524 // Background color
1525 print '<tr><td>'.$langs->trans("BackgroundColorByDefault").'</td><td colspan="3">';
1526 print $htmlother->selectColor($object->bgcolor, 'bgcolor', '', 0);
1527 print '</td></tr>';
1528 }
1529
1530 print '</table>';
1531
1532
1533 // Message
1534 print '<div style="padding-top: 10px">';
1535
1536 if ($action == 'edit') {
1537 // wysiwyg editor
1538 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1539 $doleditor = new DolEditor('bodyemail', $object->body, '', 600, 'dolibarr_mailings', '', true, true, getDolGlobalInt('FCKEDITOR_ENABLE_MAILING'), 20, '90%');
1540 $doleditor->Create();
1541 }
1542 if ($action == 'edittxt') {
1543 // wysiwyg editor
1544 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1545 $doleditor = new DolEditor('bodyemail', $object->body, '', 600, 'dolibarr_mailings', '', true, true, 0, 20, '90%');
1546 $doleditor->Create();
1547 }
1548 if ($action == 'edithtml') {
1549 // HTML source editor
1550 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1551 $doleditor = new DolEditor('bodyemail', $object->body, '', 600, 'dolibarr_mailings', '', true, true, 'ace', 20, '90%');
1552 $doleditor->Create(0, '', false, 'HTML Source', 'php');
1553 }
1554
1555 print '</div>';
1556
1557
1558 print dol_get_fiche_end();
1559
1560 print '<div class="center">';
1561 print '<input type="submit" class="button buttonforacesave button-save" value="'.$langs->trans("Save").'" name="save">';
1562 print '&nbsp; &nbsp; &nbsp;';
1563 print '<input type="submit" class="button button-cancel" value="'.$langs->trans("Cancel").'" name="cancel">';
1564 print '</div>';
1565
1566 print '</form>';
1567 print '<br>';
1568 }
1569 } else {
1570 dol_print_error($db, $object->error);
1571 }
1572}
1573
1574// End of page
1575llxFooter();
1576$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:70
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
static getValidAddress($address, $format, $encode=0, $maxnumberofemail=0)
Return a formatted address string for SMTP protocol.
static getArrayAddress($address)
Return a formatted array of address string for SMTP protocol.
Class to manage a WYSIWYG editor.
Class to manage standard extra fields.
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation du formulaire html d'envoi de mail unitaire Usage: $formail = new Form...
static getAvailableSubstitKey($mode='formemail', $object=null)
Get list of substitution keys available for emails.
Class permettant la generation de composants html autre Only common components are here.
Class to manage emailings module.
Class to manage third parties objects (customers, suppliers, prospects...)
llxFooter()
Footer empty.
Definition document.php:107
emailing_prepare_head(Mailing $object)
Prepare array with list of tabs.
dol_add_file_process($upload_dir, $allowoverwrite=0, $updatesessionordb=0, $varfiles='addedfile', $savingdocmask='', $link=null, $trackid='', $generatethumbs=1, $object=null)
Get and save an upload file (for example after submitting a new file a mail form).
dol_init_file_process($pathtoscan='', $trackid='')
Scan a directory and init $_SESSION to manage uploaded files with list of all found files.
dol_remove_file_process($filenb, $donotupdatesession=0, $donotdeletefile=1, $trackid='')
Remove an uploaded file (for example after submitting a new file a mail form).
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
Definition files.lib.php:63
isValidMailDomain($mail)
Return true if email has a domain name that can be resolved to MX type.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dol_mimetype($file, $default='application/octet-stream', $mode=0)
Return MIME type of a file from its name with extension.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_print_email($email, $cid=0, $socid=0, $addlink=0, $max=64, $showinvalid=1, $withpicto=0)
Show EMail link formatted for HTML output.
dol_now($mode='auto')
Return date for now.
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_set_focus($selector)
Set focus onto field with selector (similar behaviour of 'autofocus' HTML5 tag)
dolGetFirstLastname($firstname, $lastname, $nameorder=-1)
Return firstname and lastname in correct order.
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
getMaxFileSizeArray()
Return the max allowed for file upload.
dol_hash($chain, $type='0', $nosalt=0)
Returns a hash (non reversible encryption) of a string.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.