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