dolibarr 23.0.3
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-2025 MDW <mdeweerd@users.noreply.github.com>
7 * Copyright (C) 2025 Jon Bendtsen <jon.bendtsen.github@jonb.dk>
8 * Copyright (C) 2024-2025 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';
45require_once DOL_DOCUMENT_ROOT.'/core/lib/emailing.lib.php';
46require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
47require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
48require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
49require_once DOL_DOCUMENT_ROOT.'/comm/mailing/class/mailing.class.php';
50require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
51require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
52require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.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$urlfrom = GETPOST('urlfrom');
67$projectid = GETPOSTINT('projectid');
68$backtopage = GETPOST('backtopage');
69$backtopageforcancel = GETPOST('backtopageforcancel');
70
71// Initialize a technical objects
72$object = new Mailing($db);
73$extrafields = new ExtraFields($db);
74$hookmanager->initHooks(array('mailingcard', 'globalcard'));
75
76// Fetch optionals attributes and labels
77$extrafields->fetch_name_optionals_label($object->table_element);
78
79// Load object
80include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be 'include', not 'include_once'.
81
82// Load object->fk_project
83if (isset($object->fk_project) && $object->fk_project > 0 ) {
84 dol_syslog('isset($object->fk_project)='.$object->fk_project, LOG_DEBUG);
85 $ret = $object->fetchProject();
86 if ($ret <= 0) {
87 setEventMessages($object->error, $object->errors, 'errors');
88 $action = '';
89 }
90}
91
92
93// Array of possible substitutions (See also file mailing-send.php that should manage same substitutions)
94$object->substitutionarray = FormMail::getAvailableSubstitKey('emailing');
95
96
97// Set $object->substitutionarrayfortest
98$signature = ((!empty($user->signature) && !getDolGlobalString('MAIN_MAIL_DO_NOT_USE_SIGN')) ? $user->signature : '');
99
100$targetobject = null; // Not defined with mass emailing
101
102$parameters = array('mode' => 'emailing');
103$substitutionarray = FormMail::getAvailableSubstitKey('emailing', $targetobject);
104
105$object->substitutionarrayfortest = $substitutionarray;
106
107// List of sending methods
108$listofmethods = array();
109//$listofmethods['default'] = $langs->trans('DefaultOutgoingEmailSetup');
110$listofmethods['mail'] = 'PHP mail function';
111//$listofmethods['simplemail']='Simplemail class';
112$listofmethods['smtps'] = 'SMTP/SMTPS socket library';
113if (version_compare(phpversion(), '7.0', '>=')) {
114 $listofmethods['swiftmailer'] = 'Swift Mailer socket library';
115}
116
117// Security check
118if (!$user->hasRight('mailing', 'lire') || (!getDolGlobalString('EXTERNAL_USERS_ARE_AUTHORIZED') && $user->socid > 0)) {
120}
121if (empty($action) && empty($object->id)) {
122 accessforbidden('Object not found');
123}
124
125$upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, getDolGlobalInt('MAILING_USE_NEW_PATH_FOR_FILES') ? 0 : 2, 0, 1, $object, 'mailing');
126
127//$permissiontoread = $user->hasRight('maling', 'read');
128$permissiontocreate = $user->hasRight('mailing', 'creer');
129$permissiontovalidatesend = $user->hasRight('mailing', 'valider');
130$permissiontodelete = $user->hasRight('mailing', 'supprimer');
131
132
133/*
134 * Actions
135 */
136
137$parameters = array();
138$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
139if ($reshook < 0) {
140 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
141}
142
143if (empty($reshook)) {
144 $error = 0;
145
146 $backurlforlist = DOL_URL_ROOT.'/comm/mailing/list.php';
147
148 if (empty($backtopage) || ($cancel && empty($id))) {
149 if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
150 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
151 $backtopage = $backurlforlist;
152 } else {
153 $backtopage = DOL_URL_ROOT.'/comm/mailing/card.php?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
154 }
155 }
156 }
157
158 if ($cancel) {
159 /*var_dump($cancel);var_dump($backtopage);var_dump($backtopageforcancel);exit;*/
160 if (!empty($backtopageforcancel)) {
161 header("Location: ".$backtopageforcancel);
162 exit;
163 } elseif (!empty($backtopage)) {
164 header("Location: ".$backtopage);
165 exit;
166 }
167 $action = '';
168 }
169
170 // Action clone object
171 if ($action == 'confirm_clone' && $confirm == 'yes' && $permissiontocreate) {
172 if (!GETPOST("clone_content", 'alpha') && !GETPOST("clone_receivers", 'alpha')) {
173 setEventMessages($langs->trans("NoCloneOptionsSpecified"), null, 'errors');
174 } else {
175 $result = $object->createFromClone($user, $object->id, GETPOST("clone_content") ? 1 : 0, GETPOST("clone_receivers") ? 1 : 0);
176 if ($result > 0) {
177 header("Location: ".$_SERVER['PHP_SELF'].'?id='.$result);
178 exit;
179 } else {
180 setEventMessages($object->error, $object->errors, 'errors');
181 }
182 }
183 $action = '';
184 }
185
186 // Action send emailing for everybody
187 if ($action == 'sendallconfirmed' && $confirm == 'yes' && $permissiontovalidatesend) {
188 if (!getDolGlobalString('MAILING_LIMIT_SENDBYWEB')) {
189 // As security measure, we don't allow send from the GUI
190 setEventMessages($langs->trans("MailingNeedCommand"), null, 'warnings');
191 setEventMessages('<textarea cols="70" rows="'.ROWS_2.'" wrap="soft">php ./scripts/emailings/mailing-send.php '.$object->id.'</textarea>', null, 'warnings');
192 setEventMessages($langs->trans("MailingNeedCommand2"), null, 'warnings');
193 $action = '';
194 } elseif (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < 0) {
195 setEventMessages($langs->trans("NotEnoughPermissions"), null, 'warnings');
196 $action = '';
197 } else {
198 if ($object->status == 0) {
199 dol_print_error(null, 'ErrorMailIsNotValidated');
200 exit;
201 }
202
203 $id = $object->id;
204 $subject = $object->sujet;
205 $message = $object->body;
206 $from = $object->email_from;
207 $replyto = $object->email_replyto;
208 $errorsto = $object->email_errorsto;
209 // Is the message in html
210 $msgishtml = -1; // Unknown by default
211 if (preg_match('/[\s\t]*<html>/i', $message)) {
212 $msgishtml = 1;
213 }
214
215 // Warning, we must not use begin-commit transaction here
216 // because we want to save update for each mail sent.
217
218 $nbok = 0;
219 $nbko = 0;
220
221 // We choose mails not already sent for this mailing (statut=0)
222 // or sent in error (statut=-1)
223 $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";
224 $sql .= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc";
225 $sql .= " WHERE mc.statut < 1 AND mc.fk_mailing = ".((int) $object->id);
226 $sql .= " ORDER BY mc.statut DESC"; // first status 0, then status -1
227
228 dol_syslog("card.php: select targets", LOG_DEBUG);
229 $resql = $db->query($sql);
230 if ($resql) {
231 $num = $db->num_rows($resql); // Number of possible recipients
232
233 if ($num) {
234 dol_syslog("comm/mailing/card.php: nb of targets = ".$num, LOG_DEBUG);
235
236 $now = dol_now();
237
238 // Positioning date of start sending
239 $sql = "UPDATE ".MAIN_DB_PREFIX."mailing SET date_envoi='".$db->idate($now)."' WHERE rowid=".((int) $object->id);
240 $resql2 = $db->query($sql);
241 if (!$resql2) {
242 dol_print_error($db);
243 }
244
245 $thirdpartystatic = new Societe($db);
246 // Loop on each email and send it
247 $iforemailloop = 0;
248
249 while ($iforemailloop < $num && $iforemailloop < $conf->global->MAILING_LIMIT_SENDBYWEB) {
250 // Here code is common with same loop ino mailing-send.php
251 $res = 1;
252 $now = dol_now();
253
254 $obj = $db->fetch_object($resql);
255
256 // sendto en RFC2822
257 $sendto = str_replace(',', ' ', dolGetFirstLastname($obj->firstname, $obj->lastname))." <".$obj->email.">";
258
259 // Make substitutions on topic and body. From (AA=YY;BB=CC;...) we keep YY, CC, ...
260 $other = explode(';', $obj->other);
261 $tmpfield = explode('=', $other[0], 2);
262 $other1 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
263 $tmpfield = explode('=', $other[1], 2);
264 $other2 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
265 $tmpfield = explode('=', $other[2], 2);
266 $other3 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
267 $tmpfield = explode('=', $other[3], 2);
268 $other4 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
269 $tmpfield = explode('=', $other[4], 2);
270 $other5 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
271
272 $signature = ((!empty($user->signature) && !getDolGlobalString('MAIN_MAIL_DO_NOT_USE_SIGN')) ? $user->signature : '');
273
274 $parameters = array('mode' => 'emailing');
275 $substitutionarray = getCommonSubstitutionArray($langs, 0, array('object', 'objectamount'), $targetobject); // Note: On mass emailing, this is null because be don't know object
276
277 // Array of possible substitutions (See also file mailing-send.php that should manage same substitutions)
278 $substitutionarray['__ID__'] = $obj->source_id;
279 $substitutionarray['__EMAIL__'] = $obj->email;
280 $substitutionarray['__LASTNAME__'] = $obj->lastname;
281 $substitutionarray['__FIRSTNAME__'] = $obj->firstname;
282 $substitutionarray['__MAILTOEMAIL__'] = '<a href="mailto:'.$obj->email.'">'.$obj->email.'</a>';
283 $substitutionarray['__OTHER1__'] = $other1;
284 $substitutionarray['__OTHER2__'] = $other2;
285 $substitutionarray['__OTHER3__'] = $other3;
286 $substitutionarray['__OTHER4__'] = $other4;
287 $substitutionarray['__OTHER5__'] = $other5;
288
289 if ($obj->source_type == "thirdparty") {
290 $result = $thirdpartystatic->fetch($obj->source_id);
291 if ($result > 0) {
292 $substitutionarray['__THIRDPARTY_CUSTOMER_CODE__'] = $thirdpartystatic->code_client;
293 } else {
294 $substitutionarray['__THIRDPARTY_CUSTOMER_CODE__'] = '';
295 }
296 }
297
298 $substitutionarray['__USER_SIGNATURE__'] = $signature; // Signature is empty when ran from command line or taken from user in parameter)
299 $substitutionarray['__SENDEREMAIL_SIGNATURE__'] = $signature; // Signature is empty when ran from command line or taken from user in parameter)
300 $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"/>';
301 $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>';
302 $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);
303
304 $onlinepaymentenabled = 0;
305 if (isModEnabled('paypal')) {
306 $onlinepaymentenabled++;
307 }
308 if (isModEnabled('paybox')) {
309 $onlinepaymentenabled++;
310 }
311 if (isModEnabled('stripe')) {
312 $onlinepaymentenabled++;
313 }
314 if ($onlinepaymentenabled && getDolGlobalString('PAYMENT_SECURITY_TOKEN')) {
315 require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
316 $substitutionarray['__ONLINEPAYMENTLINK_MEMBER__'] = getHtmlOnlinePaymentLink('member', $obj->source_id);
317 $substitutionarray['__ONLINEPAYMENTLINK_DONATION__'] = getHtmlOnlinePaymentLink('donation', $obj->source_id);
318 $substitutionarray['__ONLINEPAYMENTLINK_ORDER__'] = getHtmlOnlinePaymentLink('order', $obj->source_id);
319 $substitutionarray['__ONLINEPAYMENTLINK_INVOICE__'] = getHtmlOnlinePaymentLink('invoice', $obj->source_id);
320 $substitutionarray['__ONLINEPAYMENTLINK_CONTRACTLINE__'] = getHtmlOnlinePaymentLink('contractline', $obj->source_id);
321
322 $substitutionarray['__SECUREKEYPAYMENT__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), '2');
323 if (!getDolGlobalString('PAYMENT_SECURITY_TOKEN_UNIQUE')) {
324 $substitutionarray['__SECUREKEYPAYMENT_MEMBER__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), '2');
325 $substitutionarray['__SECUREKEYPAYMENT_DONATION__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), '2');
326 $substitutionarray['__SECUREKEYPAYMENT_ORDER__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), '2');
327 $substitutionarray['__SECUREKEYPAYMENT_INVOICE__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), '2');
328 $substitutionarray['__SECUREKEYPAYMENT_CONTRACTLINE__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), '2');
329 } else {
330 $substitutionarray['__SECUREKEYPAYMENT_MEMBER__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'member'.$obj->source_id, '2');
331 $substitutionarray['__SECUREKEYPAYMENT_DONATION__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'donation'.$obj->source_id, '2');
332 $substitutionarray['__SECUREKEYPAYMENT_ORDER__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'order'.$obj->source_id, '2');
333 $substitutionarray['__SECUREKEYPAYMENT_INVOICE__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'invoice'.$obj->source_id, '2');
334 $substitutionarray['__SECUREKEYPAYMENT_CONTRACTLINE__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'contractline'.$obj->source_id, '2');
335 }
336 }
337 if (getDolGlobalString('MEMBER_ENABLE_PUBLIC')) {
338 $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>';
339 }
340 /* For backward compatibility, deprecated */
341 if (isModEnabled('paypal') && getDolGlobalString('PAYPAL_SECURITY_TOKEN')) {
342 $substitutionarray['__SECUREKEYPAYPAL__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), '2');
343
344 if (!getDolGlobalString('PAYPAL_SECURITY_TOKEN_UNIQUE')) {
345 $substitutionarray['__SECUREKEYPAYPAL_MEMBER__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), '2');
346 } else {
347 $substitutionarray['__SECUREKEYPAYPAL_MEMBER__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN') . 'membersubscription'.$obj->source_id, '2');
348 }
349
350 if (!getDolGlobalString('PAYPAL_SECURITY_TOKEN_UNIQUE')) {
351 $substitutionarray['__SECUREKEYPAYPAL_ORDER__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), '2');
352 } else {
353 $substitutionarray['__SECUREKEYPAYPAL_ORDER__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN') . 'order'.$obj->source_id, '2');
354 }
355
356 if (!getDolGlobalString('PAYPAL_SECURITY_TOKEN_UNIQUE')) {
357 $substitutionarray['__SECUREKEYPAYPAL_INVOICE__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), '2');
358 } else {
359 $substitutionarray['__SECUREKEYPAYPAL_INVOICE__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN') . 'invoice'.$obj->source_id, '2');
360 }
361
362 if (!getDolGlobalString('PAYPAL_SECURITY_TOKEN_UNIQUE')) {
363 $substitutionarray['__SECUREKEYPAYPAL_CONTRACTLINE__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), '2');
364 } else {
365 $substitutionarray['__SECUREKEYPAYPAL_CONTRACTLINE__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN') . 'contractline'.$obj->source_id, '2');
366 }
367 }
368 //$substitutionisok=true;
369
370 complete_substitutions_array($substitutionarray, $langs);
371 $newsubject = make_substitutions($subject, $substitutionarray);
372 $newmessage = make_substitutions($message, $substitutionarray, null, 0);
373
374 $moreinheader = '';
375 if (preg_match('/__UNSUBSCRIBE_(_|URL_)/', $message)) {
376 $moreinheader = "List-Unsubscribe: <__UNSUBSCRIBE_URL__>\n";
377 $moreinheader = make_substitutions($moreinheader, $substitutionarray);
378 }
379
380 $arr_file = array();
381 $arr_mime = array();
382 $arr_name = array();
383 $arr_css = array();
384
385 $listofpaths = dol_dir_list($upload_dir, 'all', 0, '', '', 'name', SORT_ASC, 0);
386 if (count($listofpaths)) {
387 foreach ($listofpaths as $key => $val) {
388 $arr_file[] = $listofpaths[$key]['fullname'];
389 $arr_mime[] = dol_mimetype($listofpaths[$key]['name']);
390 $arr_name[] = $listofpaths[$key]['name'];
391 }
392 }
393
394 // Mail making
395 $trackid = 'emailing-'.$obj->fk_mailing.'-'.$obj->rowid;
396 $upload_dir_tmp = $upload_dir;
397 $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);
398
399 if ($mail->error) {
400 $res = 0;
401 }
402 /*if (! $substitutionisok)
403 {
404 $mail->error='Some substitution failed';
405 $res=0;
406 }*/
407
408 // Send mail
409 if ($res) {
410 $res = $mail->sendfile();
411 }
412
413 if ($res) {
414 // Mail successful
415 $nbok++;
416
417 dol_syslog("comm/mailing/card.php: ok for #".$iforemailloop.($mail->error ? ' - '.$mail->error : ''), LOG_DEBUG);
418
419 $sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles";
420 $sql .= " SET statut=1, date_envoi = '".$db->idate($now)."' WHERE rowid=".((int) $obj->rowid);
421 $resql2 = $db->query($sql);
422 if (!$resql2) {
423 dol_print_error($db);
424 } else {
425 //if check read is use then update prospect contact status
426 if (strpos($message, '__CHECK_READ__') !== false) {
427 //Update status communication of thirdparty prospect
428 $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).")";
429 dol_syslog("card.php: set prospect thirdparty status", LOG_DEBUG);
430 $resql2 = $db->query($sql);
431 if (!$resql2) {
432 dol_print_error($db);
433 }
434
435 //Update status communication of contact prospect
436 $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)";
437 dol_syslog("card.php: set prospect contact status", LOG_DEBUG);
438
439 $resql2 = $db->query($sql);
440 if (!$resql2) {
441 dol_print_error($db);
442 }
443 }
444 }
445
446 if (getDolGlobalString('MAILING_DELAY')) {
447 dol_syslog("Wait a delay of MAILING_DELAY=".((float) $conf->global->MAILING_DELAY));
448 usleep((int) ((float) $conf->global->MAILING_DELAY * 1000000));
449 }
450
451 //test if CHECK READ change statut prospect contact
452 } else {
453 // Mail failed
454 $nbko++;
455
456 dol_syslog("comm/mailing/card.php: error for #".$iforemailloop.($mail->error ? ' - '.$mail->error : ''), LOG_WARNING);
457
458 $sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles";
459 $sql .= " SET statut=-1, error_text='".$db->escape(dol_trunc($mail->error, 250))."', date_envoi='".$db->idate($now)."' WHERE rowid=".((int) $obj->rowid);
460 $resql2 = $db->query($sql);
461 if (!$resql2) {
462 dol_print_error($db);
463 }
464 }
465
466 $iforemailloop++;
467 }
468 } else {
469 setEventMessages($langs->transnoentitiesnoconv("NoMoreRecipientToSendTo"), null, 'mesgs');
470 }
471
472 // Loop finished, set global statut of mail
473 if ($nbko > 0) {
474 $statut = 2; // Status 'sent partially' (because at least one error)
475 setEventMessages($langs->transnoentitiesnoconv("EMailSentToNRecipients", (string) $nbok), null, 'mesgs');
476 } else {
477 if ($nbok >= $num) {
478 $statut = 3; // Send to everybody
479 } else {
480 $statut = 2; // Status 'sent partially' (because not send to everybody)
481 }
482 setEventMessages($langs->transnoentitiesnoconv("EMailSentToNRecipients", (string) $nbok), null, 'mesgs');
483 }
484
485 $sql = "UPDATE ".MAIN_DB_PREFIX."mailing SET statut=".((int) $statut)." WHERE rowid = ".((int) $object->id);
486 dol_syslog("comm/mailing/card.php: update global status", LOG_DEBUG);
487 $resql2 = $db->query($sql);
488 if (!$resql2) {
489 dol_print_error($db);
490 }
491 } else {
492 dol_syslog($db->error());
493 dol_print_error($db);
494 }
495 $object->fetch($id);
496 $action = '';
497 }
498 }
499
500 // Action send test emailing
501 if ($action == 'send' && ! $cancel && $permissiontovalidatesend) {
502 $error = 0;
503
504 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, getDolGlobalInt('MAILING_USE_NEW_PATH_FOR_FILES') ? 0 : 2, 0, 1, $object, 'mailing');
505
506 $object->sendto = GETPOST("sendto", 'alphawithlgt');
507 if (!$object->sendto) {
508 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("MailTo")), null, 'errors');
509 $error++;
510 }
511
512 if (!$error) {
513 // Is the message in html
514 $msgishtml = -1; // Unknown = autodetect by default
515 if (preg_match('/[\s\t]*<html>/i', $object->body)) {
516 $msgishtml = 1;
517 }
518
519 $signature = ((!empty($user->signature) && !getDolGlobalString('MAIN_MAIL_DO_NOT_USE_SIGN')) ? $user->signature : '');
520
521 $parameters = array('mode' => 'emailing');
522 $substitutionarray = getCommonSubstitutionArray($langs, 0, array('object', 'objectamount'), $targetobject); // Note: On mass emailing, this is null because be don't know object
523
524 // other are set at begin of page
525 $substitutionarray['__EMAIL__'] = $object->sendto;
526 $substitutionarray['__MAILTOEMAIL__'] = '<a href="mailto:'.$object->sendto.'">'.$object->sendto.'</a>';
527 $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"/>';
528 $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>';
529 $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';
530
531 // Subject and message substitutions
532 complete_substitutions_array($substitutionarray, $langs, $targetobject);
533
534 $tmpsujet = make_substitutions($object->sujet, $substitutionarray);
535 $tmpbody = make_substitutions($object->body, $substitutionarray);
536
537 $arr_file = array();
538 $arr_mime = array();
539 $arr_name = array();
540 $arr_css = array();
541
542 // Add CSS
543 if (!empty($object->bgcolor)) {
544 $arr_css['bgcolor'] = (preg_match('/^#/', $object->bgcolor) ? '' : '#').$object->bgcolor;
545 }
546 if (!empty($object->bgimage)) {
547 $arr_css['bgimage'] = $object->bgimage;
548 }
549
550 // Attached files
551 $listofpaths = dol_dir_list($upload_dir, 'all', 0, '', '', 'name', SORT_ASC, 0);
552 if (count($listofpaths)) {
553 foreach ($listofpaths as $key => $val) {
554 $arr_file[] = $listofpaths[$key]['fullname'];
555 $arr_mime[] = dol_mimetype($listofpaths[$key]['name']);
556 $arr_name[] = $listofpaths[$key]['name'];
557 }
558 }
559
560 $trackid = 'emailing-test';
561 $upload_dir_tmp = $upload_dir;
562 $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);
563
564 $result = $mailfile->sendfile();
565 if ($result) {
566 setEventMessages($langs->trans("MailSuccessfulySent", $mailfile->getValidAddress($object->email_from, 2), $mailfile->getValidAddress($object->sendto, 2)), null, 'mesgs');
567 $action = '';
568 } else {
569 setEventMessages($langs->trans("ResultKo").'<br>'.$mailfile->error.' '.json_encode($result), null, 'errors');
570 $action = 'test';
571 }
572 }
573 }
574
575 $mesgs = array();
576 // Action add emailing
577 if ($action == 'add' && $permissiontocreate) {
578 $object->messtype = (string) GETPOST("messtype");
579 if ($object->messtype == 'sms') {
580 $object->email_from = (string) GETPOST("from_phone", 'alphawithlgt'); // Must allow 'name <email>'
581 } else {
582 $object->email_from = (string) GETPOST("from", 'alphawithlgt'); // Must allow 'name <email>'
583 }
584 $object->email_replyto = (string) GETPOST("replyto", 'alphawithlgt'); // Must allow 'name <email>'
585 $object->email_errorsto = (string) GETPOST("errorsto", 'alphawithlgt'); // Must allow 'name <email>'
586 $object->title = (string) GETPOST("title");
587 $object->sujet = (string) GETPOST("subject");
588 $object->body = (string) GETPOST("bodyemail", 'restricthtml');
589 $object->bgcolor = preg_replace('/^#/', '', (string) GETPOST("bgcolor"));
590 $object->bgimage = (string) GETPOST("bgimage");
591 $object->fk_project = GETPOSTINT('projectid');
592
593 if (!$object->title) {
594 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTitle"));
595 }
596 if ($object->messtype != 'sms' && !$object->sujet) {
597 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTopic"));
598 }
599 if (!$object->body) {
600 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailMessage"));
601 }
602
603 if (!count($mesgs)) {
604 if ($object->create($user) >= 0) {
605 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
606 exit;
607 }
608 $mesgs[] = $object->error;
609 $mesgs = array_merge($mesgs, $object->errors);
610 }
611
612 setEventMessages('', $mesgs, 'errors');
613 $action = "create";
614 }
615
616 if ($action == 'classin' && $permissiontocreate) {
617 $mesgs = array();
618 $setResult = $object->setProject(GETPOSTINT('projectid'));
619 dol_syslog('Mailing card, action classin, setProject', LOG_DEBUG);
620 if ($setResult) {
621 $result = $object->update($user);
622 if ($result >= 0) {
623 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
624 exit;
625 }
626 $mesg = $object->error;
627 }
628
629 setEventMessages($mesg, $mesgs, 'errors');
630 $action = "";
631 }
632
633 // Action update description of emailing
634 if (($action == 'settitle' || $action == 'setemail_from' || $action == 'setemail_replyto' || $action == 'setreplyto' || $action == 'setemail_errorsto' || $action == 'setevenunsubscribe') && $permissiontovalidatesend) {
635 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, getDolGlobalInt('MAILING_USE_NEW_PATH_FOR_FILES') ? 0 : 2, 0, 1, $object, 'mailing');
636
637 if ($action == 'settitle') { // Test on permission already done
638 $object->title = trim(GETPOST('title', 'alpha'));
639 } elseif ($action == 'setemail_from') { // Test on permission already done
640 $object->email_from = trim(GETPOST('email_from', 'alphawithlgt')); // Must allow 'name <email>'
641 } elseif ($action == 'setemail_replyto') { // Test on permission already done
642 $object->email_replyto = trim(GETPOST('email_replyto', 'alphawithlgt')); // Must allow 'name <email>'
643 } elseif ($action == 'setemail_errorsto') { // Test on permission already done
644 $object->email_errorsto = trim(GETPOST('email_errorsto', 'alphawithlgt')); // Must allow 'name <email>'
645 } elseif ($action == 'settitle' && empty($object->title)) { // Test on permission already done
646 $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTitle"));
647 } elseif ($action == 'setfrom' && empty($object->email_from)) { // Test on permission already done
648 $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailFrom"));
649 } elseif ($action == 'setevenunsubscribe') { // Test on permission already done
650 $object->evenunsubscribe = (GETPOST('evenunsubscribe') ? 1 : 0);
651 }
652
653 if (isset($mesg) && !$mesg) {
654 $result = $object->update($user);
655 if ($result >= 0) {
656 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
657 exit;
658 }
659 $mesg = $object->error;
660 }
661
662 setEventMessages($mesg, $mesgs, 'errors');
663 $action = "";
664 }
665
666 /*
667 * Action of adding a file in email form
668 */
669 if (GETPOST('addfile') && $permissiontocreate) {
670 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, getDolGlobalInt('MAILING_USE_NEW_PATH_FOR_FILES') ? 0 : 2, 0, 1, $object, 'mailing');
671
672 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
673
674 // Set tmp user directory
675 dol_add_file_process($upload_dir, 0, 0, 'addedfile', '', null, '', 0);
676
677 $action = "edit";
678 }
679
680 // Action of file remove
681 if (GETPOSTINT("removedfile") && $permissiontocreate) {
682 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, getDolGlobalInt('MAILING_USE_NEW_PATH_FOR_FILES') ? 0 : 2, 0, 1, $object, 'mailing');
683
684 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
685
686 dol_remove_file_process(GETPOSTINT('removedfile'), 0, 0); // We really delete file linked to mailing
687
688 $action = "edit";
689 }
690
691 // Action of emailing update
692 if ($action == 'update' && !GETPOSTINT("removedfile") && !$cancel && $permissiontocreate) {
693 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
694
695 $isupload = 0;
696
697 if (!$isupload) {
698 $mesgs = array();
699
700 //$object->messtype = (string) GETPOST("messtype"); // We must not be able to change the messtype
701 $object->sujet = (string) GETPOST("subject");
702 $object->body = (string) GETPOST("bodyemail", 'restricthtml');
703 $object->bgcolor = preg_replace('/^#/', '', (string) GETPOST("bgcolor"));
704 $object->bgimage = (string) GETPOST("bgimage");
705
706 if ($object->messtype != 'sms' && !$object->sujet) {
707 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTopic"));
708 }
709 if (!$object->body) {
710 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailMessage"));
711 }
712
713 if (!count($mesgs)) {
714 if ($object->update($user) >= 0) {
715 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
716 exit;
717 }
718 $mesgs[] = $object->error;
719 $mesgs = array_merge($mesgs, $object->errors);
720 }
721
722 setEventMessages('', $mesgs, 'errors');
723 $action = "edit";
724 } else {
725 $action = "edit";
726 }
727 }
728
729 // Action of validation confirmation
730 if ($action == 'confirm_valid' && $confirm == 'yes' && $permissiontovalidatesend) {
731 if ($object->id > 0) {
732 $object->valid($user);
733 setEventMessages($langs->trans("MailingSuccessfullyValidated"), null, 'mesgs');
734 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
735 exit;
736 } else {
737 dol_print_error($db);
738 }
739 }
740
741 // Action of validation confirmation
742 if ($action == 'confirm_settodraft' && $confirm == 'yes' && $permissiontocreate) {
743 if ($object->id > 0) {
744 $result = $object->setStatut(0);
745 if ($result > 0) {
746 //setEventMessages($langs->trans("MailingSuccessfullyValidated"), null, 'mesgs');
747 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
748 exit;
749 } else {
750 setEventMessages($object->error, $object->errors, 'errors');
751 }
752 } else {
753 dol_print_error($db);
754 }
755 }
756
757 // Resend
758 if ($action == 'confirm_reset' && $confirm == 'yes' && $permissiontocreate) {
759 if ($object->id > 0) {
760 $db->begin();
761
762 $result = $object->valid($user);
763 if ($result > 0) {
764 $result = $object->reset_targets_status($user);
765 }
766
767 if ($result > 0) {
768 $db->commit();
769 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
770 exit;
771 } else {
772 setEventMessages($object->error, $object->errors, 'errors');
773 $db->rollback();
774 }
775 } else {
776 dol_print_error($db);
777 }
778 }
779
780 // Action of delete confirmation
781 if ($action == 'confirm_delete' && $confirm == 'yes' && $permissiontodelete) {
782 if ($object->delete($user)) {
783 $url = (!empty($urlfrom) ? $urlfrom : 'list.php');
784 header("Location: ".$url);
785 exit;
786 }
787 }
788
789 if ($cancel) {
790 $action = '';
791 }
792}
793
794
795/*
796 * View
797 */
798
799$form = new Form($db);
800$htmlother = new FormOther($db);
801$formproject = null;
802if (isModEnabled('project')) {
803 $formproject = new FormProjets($db);
804}
805
806// Same check as the email templates editor in admin/mails_templates.php so the
807// local media browser is shown consistently in both places.
808$acceptlocallinktomedia = (acceptLocalLinktoMedia() > 0 ? 1 : 0);
809
810$help_url = 'EN:Module_EMailing|FR:Module_Mailing|ES:M&oacute;dulo_Mailing';
812 '',
813 $langs->trans("Mailing"),
814 $help_url,
815 '',
816 0,
817 0,
818 array(
819 '/includes/ace/src/ace.js',
820 '/includes/ace/src/ext-statusbar.js',
821 '/includes/ace/src/ext-language_tools.js',
822 //'/includes/ace/src/ext-chromevox.js'
823 ),
824 array()
825);
826
827
828if ($action == 'create') { // aaa
829 // EMailing in creation mode
830 print '<form name="new_mailing" action="'.$_SERVER['PHP_SELF'].'" method="POST">'."\n";
831 print '<input type="hidden" name="token" value="'.newToken().'">';
832 print '<input type="hidden" name="action" value="add">';
833
834 $htmltext = '<i>'.$langs->trans("FollowingConstantsWillBeSubstituted").':<br><br><span class="small">';
835 foreach ($object->substitutionarray as $key => $val) {
836 $htmltext .= $key.' = '.$langs->trans($val).'<br>';
837 }
838 $htmltext .= '</span></i>';
839
840 $availablelink = '<span class="opacitymedium hideonsmartphone small">'.$form->textwithpicto($langs->trans("AvailableVariables"), $htmltext, 1, 'helpclickable', '', 0, 2, 'availvar').'</span>';
841
842 // Print mail form
843 print load_fiche_titre($langs->trans("NewMailing"), $availablelink, 'object_email');
844
845 print dol_get_fiche_head(array(), '', '', -3, '', 0, '', 'noborderbottom');
846
847 print '<table class="border centpercent">';
848
849 $title = GETPOST('title');
850 if (empty($title)) {
851 $title = $langs->transnoentities("MailingOf", dol_print_date(dol_now(), 'dayrfc'));
852 }
853 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>';
854
855 // Project
856 if (isModEnabled('project')) {
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).'"></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);
1109 if ($proj->title) {
1110 $morehtmlref .= '<span class="opacitymedium"> - ' . dol_escape_htmltag($proj->title) . '</span>';
1111 }
1112 }
1113 }
1114 }
1115 $morehtmlref .= '</div>';
1116
1117 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', $morehtmlstatus);
1118
1119 print '<div class="fichecenter">';
1120 print '<div class="fichehalfleft">';
1121 print '<div class="underbanner clearboth"></div>';
1122
1123 print '<table class="border centpercent tableforfield">'."\n";
1124
1125 // From
1126 print '<tr><td class="titlefield">';
1127 print $form->editfieldkey("MailFrom", 'email_from', $object->email_from, $object, (int) ($user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY), 'string');
1128 print '</td><td>';
1129 print $form->editfieldval("MailFrom", 'email_from', $object->email_from, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1130 if ($action != 'editemail_from') {
1131 $email = CMailFile::getValidAddress($object->email_from, 2);
1132 if ($email && !isValidEmail($email)) {
1133 $langs->load("errors");
1134 print img_warning($langs->transnoentitiesnoconv("ErrorBadEMail", $email));
1135 } elseif ($email && !isValidMailDomain($email)) {
1136 $langs->load("errors");
1137 print img_warning($langs->transnoentitiesnoconv("ErrorBadMXDomain", $email));
1138 }
1139 }
1140 print '</td></tr>';
1141
1142 // Errors to
1143 if ($object->messtype != 'sms') {
1144 print '<tr><td>';
1145 print $form->editfieldkey("MailErrorsTo", 'email_errorsto', $object->email_errorsto, $object, (int) ($user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY), 'string');
1146 print '</td><td>';
1147 print $form->editfieldval("MailErrorsTo", 'email_errorsto', $object->email_errorsto, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1148
1149 $emailarray = CMailFile::getArrayAddress($object->email_errorsto);
1150 foreach ($emailarray as $email => $name) {
1151 if ($name != $email) {
1152 if ($action != 'editemail_errorsto') {
1153 if ($email && !isValidEmail($email)) {
1154 $langs->load("errors");
1155 print img_warning($langs->transnoentitiesnoconv("ErrorBadEMail", $email));
1156 } elseif ($email && !isValidMailDomain($email)) {
1157 $langs->load("errors");
1158 print img_warning($langs->transnoentitiesnoconv("ErrorBadMXDomain", $email));
1159 }
1160 }
1161 } else {
1162 if ($object->email_errorsto) {
1163 print dol_print_email($object->email_errorsto, 0, 0, 0, 0, 1);
1164 }
1165 }
1166 }
1167 print '</td></tr>';
1168 }
1169
1170 // Reply to
1171 if ($object->messtype != 'sms') {
1172 print '<tr><td>';
1173 print $form->editfieldkey("MailReply", 'email_replyto', $object->email_replyto, $object, (int) ($user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY), 'string');
1174 print '</td><td>';
1175 print $form->editfieldval("MailReply", 'email_replyto', $object->email_replyto, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1176 $email = CMailFile::getValidAddress($object->email_replyto, 2);
1177 if ($action != 'editemail_replyto') {
1178 if ($email && !isValidEmail($email)) {
1179 $langs->load("errors");
1180 print img_warning($langs->trans("ErrorBadEMail", $email));
1181 } elseif ($email && !isValidMailDomain($email)) {
1182 $langs->load("errors");
1183 print img_warning($langs->trans("ErrorBadMXDomain", $email));
1184 }
1185 }
1186 print '</td></tr>';
1187 }
1188
1189 print '</table>';
1190 print '</div>';
1191
1192 print '<div class="fichehalfright">';
1193 print '<div class="underbanner clearboth"></div>';
1194
1195 print '<table class="border centpercent tableforfield">';
1196
1197 // Number of distinct emails
1198 print '<tr><td>';
1199 print $langs->trans("TotalNbOfDistinctRecipients");
1200 print '</td><td>';
1201 $nbemail = ($object->nbemail ? $object->nbemail : 0);
1202 if (is_numeric($nbemail)) {
1203 $htmltooltip = '';
1204 if ((getDolGlobalString('MAILING_LIMIT_SENDBYWEB') && getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < $nbemail) && ($object->status == 1 || ($object->status == 2 && $nbtry < $nbemail))) {
1205 if (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') > 0) {
1206 $htmltooltip .= $langs->trans('LimitSendingEmailing', getDolGlobalString('MAILING_LIMIT_SENDBYWEB'));
1207 } else {
1208 $htmltooltip .= $langs->trans('SendingFromWebInterfaceIsNotAllowed');
1209 }
1210 }
1211 if (empty($nbemail)) {
1212 $nbemail .= ' '.img_warning('').' <span class="warning">'.$langs->trans("NoTargetYet").'</span>';
1213 }
1214 if ($htmltooltip) {
1215 print $form->textwithpicto($nbemail, $htmltooltip, 1, 'info');
1216 } else {
1217 print $nbemail;
1218 }
1219 }
1220 print '</td></tr>';
1221
1222 print '<tr><td>';
1223 print $langs->trans("MAIN_MAIL_SENDMODE");
1224 print '</td><td>';
1225 if ($object->messtype != 'sms') {
1226 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') && getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
1227 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING')];
1228 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE')) {
1229 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE')];
1230 } else {
1231 $text = $listofmethods['mail'];
1232 }
1233 print $text;
1234 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
1235 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'mail') {
1236 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER_EMAILING', getDolGlobalString('MAIN_MAIL_SMTP_SERVER')).')</span>';
1237 }
1238 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE') != 'mail' && getDolGlobalString('MAIN_MAIL_SMTP_SERVER')) {
1239 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
1240 }
1241 } else {
1242 print 'SMS ';
1243 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
1244 }
1245 print '</td></tr>';
1246
1247 // Other attributes. Fields from hook formObjectOptions and Extrafields.
1248 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
1249
1250 print '</table>';
1251 print '</div>';
1252 print '</div>';
1253
1254 print '<div class="clearboth"></div>';
1255
1256 print dol_get_fiche_end();
1257
1258
1259 // Clone confirmation
1260 if ($action == 'clone') {
1261 // Create an array for form
1262 $formquestion = array(
1263 'text' => $langs->trans("ConfirmClone"),
1264 0 => array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneContent"), 'value' => 1),
1265 1 => array('type' => 'checkbox', 'name' => 'clone_receivers', 'label' => $langs->trans("CloneReceivers"), 'value' => 0)
1266 );
1267 // Incomplete payment. On demande si motif = escompte ou autre
1268 print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneEMailing', $object->ref), 'confirm_clone', $formquestion, 'yes', 2, 240);
1269 }
1270
1271 // Actions Buttons
1272 if (GETPOST('cancel', 'alpha') || $confirm == 'no' || $action == '' || in_array($action, array('settodraft', 'valid', 'delete', 'sendall', 'clone', 'test', 'editevenunsubscribe'))) {
1273 print "\n\n<div class=\"tabsAction\">\n";
1274
1275 if (($object->status == 1) && ($user->hasRight('mailing', 'valider') || $object->user_validation_id == $user->id)) {
1276 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=settodraft&token='.newToken().'&id='.$object->id.'">'.$langs->trans("SetToDraft").'</a>';
1277 }
1278
1279 if (($object->status == 0 || $object->status == 1 || $object->status == 2) && $user->hasRight('mailing', 'creer')) {
1280 if (isModEnabled('fckeditor') && getDolGlobalInt('FCKEDITOR_ENABLE_MAILING') && $object->messtype != 'sms') {
1281 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=edit&token='.newToken().'&id='.$object->id.'">'.$langs->trans("Edit").'</a>';
1282 } else {
1283 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=edittxt&token='.newToken().'&id='.$object->id.'">'.$langs->trans("EditWithTextEditor").'</a>';
1284 }
1285
1286 if (!getDolGlobalInt('EMAILINGS_SUPPORT_ALSO_SMS')) {
1287 if (!empty($conf->use_javascript_ajax)) {
1288 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=edithtml&token='.newToken().'&id='.$object->id.'">'.$langs->trans("EditHTMLSource").'</a>';
1289 }
1290 }
1291 }
1292
1293 //print '<a class="butAction" href="card.php?action=test&amp;id='.$object->id.'">'.$langs->trans("PreviewMailing").'</a>';
1294
1295 if (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !$user->hasRight('mailing', 'mailing_advance', 'send')) {
1296 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("TestMailing").'</a>';
1297 } else {
1298 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=test&token='.newToken().'&id='.$object->id.'">'.$langs->trans("TestMailing").'</a>';
1299 }
1300
1301 if ($object->status == 0) {
1302 if ($object->nbemail <= 0) {
1303 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NoTargetYet")).'">'.$langs->trans("Validate").'</a>';
1304 } elseif (!$user->hasRight('mailing', 'valider')) {
1305 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("Validate").'</a>';
1306 } else {
1307 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=valid&amp;id='.$object->id.'">'.$langs->trans("Validate").'</a>';
1308 }
1309 }
1310
1311 if (($object->status == 1 || $object->status == 2) && $object->nbemail > 0 && $user->hasRight('mailing', 'valider')) {
1312 if (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < 0) {
1313 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("SendingFromWebInterfaceIsNotAllowed")).'">'.$langs->trans("SendMailing").'</a>';
1314 } elseif (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !$user->hasRight('mailing', 'mailing_advance', 'send')) {
1315 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("SendMailing").'</a>';
1316 } else {
1317 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=sendall&amp;id='.$object->id.'">'.$langs->trans("SendMailing").'</a>';
1318 }
1319 }
1320
1321 if ($user->hasRight('mailing', 'creer')) {
1322 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=clone&amp;object=emailing&amp;id='.$object->id.'">'.$langs->trans("ToClone").'</a>';
1323 }
1324
1325 if (($object->status == 2 || $object->status == 3) && $user->hasRight('mailing', 'valider')) {
1326 if (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !$user->hasRight('mailing', 'mailing_advance', 'send')) {
1327 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("ResetMailing").'</a>';
1328 } else {
1329 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=reset&amp;id='.$object->id.'">'.$langs->trans("ResetMailing").'</a>';
1330 }
1331 }
1332
1333 if (($object->status <= 1 && $user->hasRight('mailing', 'creer')) || $user->hasRight('mailing', 'supprimer')) {
1334 if ($object->status > 0 && (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !$user->hasRight('mailing', 'mailing_advance', 'delete'))) {
1335 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("Delete").'</a>';
1336 } else {
1337 print '<a class="butActionDelete" href="'.$_SERVER['PHP_SELF'].'?action=delete&token='.newToken().'&id='.$object->id.(!empty($urlfrom) ? '&urlfrom='.$urlfrom : '').'">'.$langs->trans("Delete").'</a>';
1338 }
1339 }
1340
1341 print '</div>';
1342 }
1343
1344 // Display of the TEST form
1345 if ($action == 'test') {
1346 print '<div id="formmailbeforetitle" name="formmailbeforetitle"></div>';
1347 print load_fiche_titre($langs->trans("TestMailing"));
1348
1349 print dol_get_fiche_head([], '', '', -1);
1350
1351 // Create mail form object
1352 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
1353 $formmail = new FormMail($db);
1354 $formmail->fromname = $object->email_from;
1355 $formmail->frommail = $object->email_from;
1356 $formmail->withsubstit = 0;
1357 $formmail->withfrom = 0;
1358 $formmail->withto = $user->email ? $user->email : 1;
1359 $formmail->withtocc = 0;
1360 $formmail->withtoccc = getDolGlobalString('MAIN_EMAIL_USECCC');
1361 $formmail->withtopic = 0;
1362 $formmail->withtopicreadonly = 1;
1363 $formmail->withfile = 0;
1364 $formmail->withlayout = '';
1365 $formmail->withaiprompt = '';
1366 $formmail->withbody = 0;
1367 $formmail->withbodyreadonly = 1;
1368 $formmail->withcancel = 1;
1369 $formmail->withdeliveryreceipt = 0;
1370 // Table of substitutions
1371 $formmail->substit = $object->substitutionarrayfortest;
1372 // Table of post's complementary params
1373 $formmail->param["action"] = "send";
1374 $formmail->param["models"] = 'none';
1375 $formmail->param["mailid"] = $object->id;
1376 $formmail->param["returnurl"] = $_SERVER['PHP_SELF']."?id=".$object->id;
1377
1378 print $formmail->get_form();
1379
1380 print '<br>';
1381
1382 print dol_get_fiche_end();
1383
1384 dol_set_focus('#sendto');
1385 }
1386
1387
1388 $htmltext = '<i>'.$langs->trans("FollowingConstantsWillBeSubstituted").':<br><br><span class="small">';
1389 foreach ($object->substitutionarray as $key => $val) {
1390 $htmltext .= $key.' = '.$langs->trans($val).'<br>';
1391 }
1392 $htmltext .= '</span></i>';
1393
1394 $availablelink = '<span class="opacitymedium hideonsmartphone">'.$form->textwithpicto($langs->trans("AvailableVariables"), $htmltext, 1, 'helpclickable', '', 0, 3, 'emailsubstitionhelp').'</span>';
1395
1396 // Print mail content
1397 print load_fiche_titre($langs->trans("EMail"), $availablelink, 'generic');
1398
1399 print dol_get_fiche_head([], '', '', -1);
1400
1401 print '<table class="bordernooddeven tableforfield centpercent">';
1402
1403 // Subject
1404 if ($object->messtype != 'sms') {
1405 print '<tr><td class="titlefield">'.$langs->trans("MailTopic").'</td><td colspan="3">'.$object->sujet.'</td></tr>';
1406 }
1407
1408 // Joined files
1409 if ($object->messtype != 'sms') {
1410 print '<tr><td>'.$langs->trans("MailFile").'</td><td colspan="3">';
1411 // List of files
1412 $listofpaths = dol_dir_list($upload_dir, 'all', 0, '', '', 'name', SORT_ASC, 0);
1413 if (count($listofpaths)) {
1414 foreach ($listofpaths as $key => $val) {
1415 print img_mime($listofpaths[$key]['name']).' '.$listofpaths[$key]['name'];
1416 print '<br>';
1417 }
1418 } else {
1419 print '<span class="opacitymedium">'.$langs->trans("NoAttachedFiles").'</span><br>';
1420 }
1421 print '</td></tr>';
1422 }
1423
1424 // Background color
1425 /* if (getDolGlobalString('EMAILING_CAN_EDIT_BACKGROUND_COLOR')) {
1426 print '<tr><td width="15%">'.$langs->trans("BackgroundColorByDefault").'</td><td colspan="3">';
1427 print $htmlother->selectColor($object->bgcolor,'bgcolor','',0);
1428 print '</td></tr>';
1429 }*/
1430
1431 print '</table>';
1432
1433 // Message
1434 print '<div class="previewemail" style="padding-top: 10px; background: '.($object->bgcolor ? (preg_match('/^#/', $object->bgcolor) ? '' : '#').$object->bgcolor : 'white').'">';
1435 if (empty($object->bgcolor) || strtolower($object->bgcolor) == 'ffffff') { // CKEditor does not apply the color of the div into its content area
1436 $readonly = 1;
1437 // wysiwyg editor
1438 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1439 $doleditor = new DolEditor('bodyemail', $object->body, '', 600, 'dolibarr_mailings', '', false, $acceptlocallinktomedia, getDolGlobalInt('FCKEDITOR_ENABLE_MAILING'), 20, '100%', $readonly);
1440 $doleditor->Create();
1441 } else {
1442 print dol_htmlentitiesbr($object->body);
1443 }
1444 print '</div>';
1445
1446 print dol_get_fiche_end();
1447 } else {
1448 /*
1449 * Edition mode mailing (CKeditor or HTML source)
1450 */
1451
1452 print dol_get_fiche_head($head, 'card', $langs->trans("Mailing"), -1, $object->picto);
1453
1454 $linkback = '<a href="'.DOL_URL_ROOT.'/comm/mailing/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
1455
1456 $morehtmlref = '<div class="refidno">';
1457 // Ref customer
1458 $morehtmlref .= $form->editfieldkey("", 'title', $object->title, $object, $user->hasRight('mailing', 'creer'), 'string', '', 0, 1);
1459 $morehtmlref .= $form->editfieldval("", 'title', $object->title, $object, $user->hasRight('mailing', 'creer'), 'string', '', null, null, '', 1);
1460
1461 $morehtmlstatus = '';
1462 $nbtry = $nbok = 0;
1463 if ($object->status == 2 || $object->status == 3) {
1464 $nbtry = $object->countNbOfTargets('alreadysent');
1465 $nbko = $object->countNbOfTargets('alreadysentko');
1466
1467 $morehtmlstatus .= ' ('.$nbtry.'/'.$object->nbemail;
1468 if ($nbko) {
1469 $morehtmlstatus .= ' - '.$nbko.' '.$langs->trans("Error");
1470 }
1471 $morehtmlstatus .= ') &nbsp; ';
1472 }
1473
1474 // Project
1475 if (isModEnabled('project')) {
1476 $langs->load("projects");
1477 $morehtmlref .= '<br>';
1478 if ($permissiontocreate) {
1479 $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
1480 $morehtmlref .= '<a class="editfielda" href="' . $_SERVER['PHP_SELF'] . '?action=classify&token=' . newToken() . '&id=' . $object->id . '">' . img_edit($langs->transnoentitiesnoconv('SetProject')) . '</a> ';
1481 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, -1, (string) $object->fk_project, 'none', 0, 0, 0, 1, '', 'maxwidth300');
1482 } else {
1483 if (!empty($object->fk_project)) {
1484 $proj = new Project($db);
1485 $proj->fetch($object->fk_project);
1486 $morehtmlref .= $proj->getNomUrl(1);
1487 if ($proj->title) {
1488 $morehtmlref .= '<span class="opacitymedium"> - ' . dol_escape_htmltag($proj->title) . '</span>';
1489 }
1490 }
1491 }
1492 }
1493 $morehtmlref .= '</div>';
1494
1495 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', $morehtmlstatus);
1496
1497 print '<div class="fichecenter">';
1498 print '<div class="fichehalfleft">';
1499 print '<div class="underbanner clearboth"></div>';
1500
1501 print '<table class="border centpercent tableforfield">';
1502
1503 /*
1504 print '<tr><td class="titlefield">'.$langs->trans("Ref").'</td>';
1505 print '<td colspan="3">';
1506 print $form->showrefnav($object,'id', $linkback);
1507 print '</td></tr>';
1508 */
1509
1510 // From
1511 print '<tr><td class="titlefield">';
1512 print $langs->trans("MailFrom");
1513 print '</td><td>'.dol_print_email($object->email_from, 0, 0, 0, 0, 1).'</td></tr>';
1514 // To
1515 if ($object->messtype != 'sms') {
1516 print '<tr><td>'.$langs->trans("MailErrorsTo").'</td><td>'.dol_print_email($object->email_errorsto, 0, 0, 0, 0, 1).'</td></tr>';
1517 print '<tr><td>'.$langs->trans("MailReply").'</td><td>'.dol_print_email($object->email_replyto, 0, 0, 0, 0, 1).'</td></tr>';
1518 }
1519
1520 print '</table>';
1521 print '</div>';
1522
1523
1524 print '<div class="fichehalfright">';
1525 print '<div class="underbanner clearboth"></div>';
1526
1527 print '<table class="border centpercent tableforfield">';
1528
1529 // Number of distinct emails
1530 print '<tr><td>';
1531 print $langs->trans("TotalNbOfDistinctRecipients");
1532 print '</td><td>';
1533 $nbemail = ($object->nbemail ? $object->nbemail : 0);
1534 if (is_numeric($nbemail)) {
1535 $htmltooltip = '';
1536 // MAILING_LIMIT_SENDBYWEB can be 'default'
1537 if ((getDolGlobalString('MAILING_LIMIT_SENDBYWEB') && getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < $nbemail) && ($object->status == 1 || $object->status == 2)) {
1538 if (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') > 0) {
1539 $htmltooltip .= $langs->trans('LimitSendingEmailing', getDolGlobalString('MAILING_LIMIT_SENDBYWEB'));
1540 } else {
1541 $htmltooltip .= $langs->trans('SendingFromWebInterfaceIsNotAllowed');
1542 }
1543 }
1544 if (empty($nbemail)) {
1545 $nbemail .= ' '.img_warning('').' <span class="warning">'.$langs->trans("NoTargetYet").'</span>';
1546 }
1547 if ($htmltooltip) {
1548 print $form->textwithpicto($nbemail, $htmltooltip, 1, 'warning');
1549 } else {
1550 print $nbemail;
1551 }
1552 }
1553 print '</td></tr>';
1554
1555 print '<tr><td>';
1556 print $langs->trans("MAIN_MAIL_SENDMODE");
1557 print '</td><td>';
1558 if ($object->messtype != 'sms') {
1559 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') && getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
1560 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING')];
1561 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE')) {
1562 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE')];
1563 } else {
1564 $text = $listofmethods['mail'];
1565 }
1566 print $text;
1567 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
1568 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'mail') {
1569 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER_EMAILING', getDolGlobalString('MAIN_MAIL_SMTP_SERVER')).')</span>';
1570 }
1571 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE') != 'mail' && getDolGlobalString('MAIN_MAIL_SMTP_SERVER')) {
1572 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
1573 }
1574 } else {
1575 print 'SMS ';
1576 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
1577 }
1578 print '</td></tr>';
1579
1580
1581 // Other attributes
1582 $parameters = array();
1583 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1584 print $hookmanager->resPrint;
1585 if (empty($reshook)) {
1586 print $object->showOptionals($extrafields, 'edit', $parameters);
1587 }
1588
1589 print '</table>';
1590 print '</div>';
1591 print '</div>';
1592
1593 print '<div class="clearboth"></div>';
1594
1595 print dol_get_fiche_end();
1596
1597
1598 print "<br><br>\n";
1599
1600 print '<form name="edit_mailing" action="card.php" method="post" enctype="multipart/form-data">'."\n";
1601 print '<input type="hidden" name="token" value="'.newToken().'">';
1602 print '<input type="hidden" name="action" value="update">';
1603 print '<input type="hidden" name="id" value="'.$object->id.'">';
1604 print '<input type="hidden" name="page_y" value="">';
1605
1606 $htmltext = '<i>'.$langs->trans("FollowingConstantsWillBeSubstituted").':<br><br><span class="small">';
1607 foreach ($object->substitutionarray as $key => $val) {
1608 $htmltext .= $key.' = '.$langs->trans($val).'<br>';
1609 }
1610 $htmltext .= '</span></i>';
1611
1612 $availablelink = '<span class="opacitymedium small">'.$form->textwithpicto($langs->trans("AvailableVariables"), $htmltext, 1, 'helpclickable', '', 0, 2, 'emailsubstitionhelp').'</span>';
1613
1614 // Print mail content
1615 print load_fiche_titre($langs->trans("EMail"), $availablelink, 'generic');
1616
1617 print dol_get_fiche_head([], '', '', -1);
1618
1619 print '<table class="bordernooddeven centpercent">';
1620
1621 // Subject
1622 if ($object->messtype != 'sms') {
1623 print '<tr><td class="fieldrequired titlefield">';
1624 print $form->textwithpicto($langs->trans("MailTopic"), $htmltext, 1, 'help', '', 0, 2, 'emailsubstitionhelp');
1625 print '</td><td colspan="3"><input class="flat quatrevingtpercent" type="text" id="subject" name="subject" value="'.$object->sujet.'"></td></tr>';
1626 }
1627
1628 $trackid = ''; // TODO To avoid conflicts with 2 mass emailing, we should set a trackid here, even if we use another one into email header.
1629 dol_init_file_process($upload_dir, $trackid);
1630
1631 // Joined files
1632 if ($object->messtype != 'sms') {
1633 $addfileaction = 'addfile';
1634 print '<tr><td>'.$langs->trans("MailFile").'</td>';
1635 print '<td colspan="3">';
1636 // List of files
1637 $listofpaths = dol_dir_list($upload_dir, 'all', 0, '', '', 'name', SORT_ASC, 0);
1638 $out = '';
1639
1640 // TODO Trick to have param removedfile containing nb of image to delete. But this does not works without javascript
1641 $out .= '<input type="hidden" class="removedfilehidden" name="removedfile" value="">'."\n";
1642 $out .= '<script type="text/javascript">';
1643 $out .= 'jQuery(document).ready(function () {';
1644 $out .= ' jQuery(".removedfile").click(function() {';
1645 $out .= ' jQuery(".removedfilehidden").val(jQuery(this).val());';
1646 $out .= ' });';
1647 $out .= '})';
1648 $out .= '</script>'."\n";
1649 if (count($listofpaths)) {
1650 foreach ($listofpaths as $key => $val) {
1651 $out .= '<div id="attachfile_'.$key.'">';
1652 $out .= img_mime($listofpaths[$key]['name']).' '.$listofpaths[$key]['name'];
1653 $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.'" />';
1654 $out .= '<br></div>';
1655 }
1656 } else {
1657 //$out .= '<span class="opacitymedium">'.$langs->trans("NoAttachedFiles").'</span><br>';
1658 }
1659
1660 // Add link to add file
1661 $maxfilesizearray = getMaxFileSizeArray();
1662 $maxmin = $maxfilesizearray['maxmin'];
1663 if ($maxmin > 0) {
1664 $out .= '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
1665 }
1666 $out .= '<input type="file" class="flat" id="addedfile" name="addedfile" value="'.$langs->trans("Upload").'" />';
1667 $out .= ' ';
1668 $out .= '<input type="submit" class="button smallpaddingimp" id="'.$addfileaction.'" name="'.$addfileaction.'" value="'.$langs->trans("MailingAddFile").'" />';
1669 print $out;
1670 print '</td></tr>';
1671
1672 // Background color
1673 print '<tr><td>'.$langs->trans("BackgroundColorByDefault").'</td><td colspan="3">';
1674 print $htmlother->selectColor($object->bgcolor, 'bgcolor', '', 0);
1675 print '</td></tr>';
1676 }
1677
1678
1679 // Add editor assistants
1680 $out = '';
1681 $out .= '<tr>';
1682 $out .= '<td class="tdtop">';
1683 $out .= $form->textwithpicto($langs->trans('MailText'), $htmltext, 1, 'help', '', 0, 2, 'substittooltipfrombody');
1684 $out .= '</td>';
1685 $out .= '<td class="tdtop">';
1686
1687 //$formmail = $this;
1688 $showlinktolayout = getDolGlobalInt('MAIN_EMAIL_USE_LAYOUT') ? 'emailing' : '';
1689 $showlinktolayoutlabel = $langs->trans("FillMessageWithALayout");
1690 $showlinktoai = isModEnabled('ai') ? 'textgenerationemail' : '';
1691 $showlinktoailabel = $langs->trans("AIEnhancements");
1692 $formatforouput = '';
1693 $htmlname = 'bodyemail';
1694 //$formai->substit = $this->substit;
1695 //$formai->substit_lines = $this->substit_lines;
1696
1697 // Fill $out
1698 include DOL_DOCUMENT_ROOT.'/core/tpl/formlayoutai.tpl.php';
1699
1700 $out .= '</td>';
1701 $out .= '</tr>';
1702
1703 print $out;
1704
1705 print '</table>';
1706
1707
1708 // Message
1709 print '<div style="padding-top: 10px">';
1710
1711 if ($action == 'edit') {
1712 // wysiwyg editor
1713 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1714 if ($object->bgcolor) {
1715 if (!preg_match('/^<div style="background-color: #'.$object->bgcolor.'">/', $object->body)) {
1716 $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>';
1717 }
1718 }
1719 $doleditor = new DolEditor('bodyemail', $object->body, '', 600, 'dolibarr_mailings', '', true, $acceptlocallinktomedia, getDolGlobalInt('FCKEDITOR_ENABLE_MAILING'), 20, '100%');
1720 $doleditor->Create();
1721 }
1722 if ($action == 'edittxt') {
1723 // wysiwyg editor
1724 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1725 $doleditor = new DolEditor('bodyemail', $object->body, '', 600, 'dolibarr_mailings', '', true, $acceptlocallinktomedia, 0, 20, '100%');
1726 $doleditor->Create();
1727 }
1728 if ($action == 'edithtml') {
1729 // HTML source editor
1730 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1731 $doleditor = new DolEditor('bodyemail', $object->body, '', 600, 'dolibarr_mailings', '', true, $acceptlocallinktomedia, 'ace', 20, '100%');
1732 $doleditor->Create(0, '', false, 'HTML Source', 'php');
1733 }
1734
1735 print '</div>';
1736
1737 print dol_get_fiche_end();
1738
1739 print '<div class="center">';
1740 print '<input type="submit" class="button buttonforacesave button-save" value="'.$langs->trans("Save").'" name="save">';
1741 print '&nbsp; &nbsp; &nbsp;';
1742 print '<input type="submit" class="button button-cancel" value="'.$langs->trans("Cancel").'" name="cancel">';
1743 print '</div>';
1744
1745 print '</form>';
1746 print '<br>';
1747 }
1748 } else {
1749 dol_print_error($db, $object->error);
1750 }
1751}
1752
1753// End of page
1754llxFooter();
1755$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 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 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.
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.
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.
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, $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'.
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, ....
dol_print_email($email, $contactid=0, $socid=0, $addlink=0, $max=0, $showinvalid=1, $withpicto=0, $morecss='paddingrightonly')
Show EMail link formatted for HTML output.
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.
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.
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...
dol_hash($chain, $type='0', $nosalt=0, $mode=0)
Returns a hash (non reversible encryption) of a string.
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.