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