dolibarr 21.0.0-beta
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2005-2019 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2016 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2021 Waël Almoman <info@almoman.com>
6 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
7 * 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', 'aZ09');
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", 'alpha'), GETPOST("clone_receivers", 'alpha'));
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 if ($obj->source_type == "thirdparty") {
261 $result = $thirdpartystatic->fetch($obj->source_id);
262
263 if ($result > 0) {
264 $substitutionarray['__THIRDPARTY_CUSTOMER_CODE__'] = $thirdpartystatic->code_client;
265 } else {
266 $substitutionarray['__THIRDPARTY_CUSTOMER_CODE__'] = '';
267 }
268 }
269 $substitutionarray['__EMAIL__'] = $obj->email;
270 $substitutionarray['__LASTNAME__'] = $obj->lastname;
271 $substitutionarray['__FIRSTNAME__'] = $obj->firstname;
272 $substitutionarray['__MAILTOEMAIL__'] = '<a href="mailto:'.$obj->email.'">'.$obj->email.'</a>';
273 $substitutionarray['__OTHER1__'] = $other1;
274 $substitutionarray['__OTHER2__'] = $other2;
275 $substitutionarray['__OTHER3__'] = $other3;
276 $substitutionarray['__OTHER4__'] = $other4;
277 $substitutionarray['__OTHER5__'] = $other5;
278 $substitutionarray['__USER_SIGNATURE__'] = $signature; // Signature is empty when ran from command line or taken from user in parameter)
279 $substitutionarray['__SENDEREMAIL_SIGNATURE__'] = $signature; // Signature is empty when ran from command line or taken from user in parameter)
280 $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"/>';
281 $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>';
282 $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);
283
284 $onlinepaymentenabled = 0;
285 if (isModEnabled('paypal')) {
286 $onlinepaymentenabled++;
287 }
288 if (isModEnabled('paybox')) {
289 $onlinepaymentenabled++;
290 }
291 if (isModEnabled('stripe')) {
292 $onlinepaymentenabled++;
293 }
294 if ($onlinepaymentenabled && getDolGlobalString('PAYMENT_SECURITY_TOKEN')) {
295 require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
296 $substitutionarray['__ONLINEPAYMENTLINK_MEMBER__'] = getHtmlOnlinePaymentLink('member', $obj->source_id);
297 $substitutionarray['__ONLINEPAYMENTLINK_DONATION__'] = getHtmlOnlinePaymentLink('donation', $obj->source_id);
298 $substitutionarray['__ONLINEPAYMENTLINK_ORDER__'] = getHtmlOnlinePaymentLink('order', $obj->source_id);
299 $substitutionarray['__ONLINEPAYMENTLINK_INVOICE__'] = getHtmlOnlinePaymentLink('invoice', $obj->source_id);
300 $substitutionarray['__ONLINEPAYMENTLINK_CONTRACTLINE__'] = getHtmlOnlinePaymentLink('contractline', $obj->source_id);
301
302 $substitutionarray['__SECUREKEYPAYMENT__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), '2');
303 if (!getDolGlobalString('PAYMENT_SECURITY_TOKEN_UNIQUE')) {
304 $substitutionarray['__SECUREKEYPAYMENT_MEMBER__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), '2');
305 $substitutionarray['__SECUREKEYPAYMENT_DONATION__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), '2');
306 $substitutionarray['__SECUREKEYPAYMENT_ORDER__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), '2');
307 $substitutionarray['__SECUREKEYPAYMENT_INVOICE__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), '2');
308 $substitutionarray['__SECUREKEYPAYMENT_CONTRACTLINE__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN'), '2');
309 } else {
310 $substitutionarray['__SECUREKEYPAYMENT_MEMBER__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'member'.$obj->source_id, '2');
311 $substitutionarray['__SECUREKEYPAYMENT_DONATION__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'donation'.$obj->source_id, '2');
312 $substitutionarray['__SECUREKEYPAYMENT_ORDER__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'order'.$obj->source_id, '2');
313 $substitutionarray['__SECUREKEYPAYMENT_INVOICE__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'invoice'.$obj->source_id, '2');
314 $substitutionarray['__SECUREKEYPAYMENT_CONTRACTLINE__'] = dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . 'contractline'.$obj->source_id, '2');
315 }
316 }
317 if (getDolGlobalString('MEMBER_ENABLE_PUBLIC')) {
318 $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>';
319 }
320 /* For backward compatibility, deprecated */
321 if (isModEnabled('paypal') && getDolGlobalString('PAYPAL_SECURITY_TOKEN')) {
322 $substitutionarray['__SECUREKEYPAYPAL__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), '2');
323
324 if (!getDolGlobalString('PAYPAL_SECURITY_TOKEN_UNIQUE')) {
325 $substitutionarray['__SECUREKEYPAYPAL_MEMBER__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), '2');
326 } else {
327 $substitutionarray['__SECUREKEYPAYPAL_MEMBER__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN') . 'membersubscription'.$obj->source_id, '2');
328 }
329
330 if (!getDolGlobalString('PAYPAL_SECURITY_TOKEN_UNIQUE')) {
331 $substitutionarray['__SECUREKEYPAYPAL_ORDER__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), '2');
332 } else {
333 $substitutionarray['__SECUREKEYPAYPAL_ORDER__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN') . 'order'.$obj->source_id, '2');
334 }
335
336 if (!getDolGlobalString('PAYPAL_SECURITY_TOKEN_UNIQUE')) {
337 $substitutionarray['__SECUREKEYPAYPAL_INVOICE__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), '2');
338 } else {
339 $substitutionarray['__SECUREKEYPAYPAL_INVOICE__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN') . 'invoice'.$obj->source_id, '2');
340 }
341
342 if (!getDolGlobalString('PAYPAL_SECURITY_TOKEN_UNIQUE')) {
343 $substitutionarray['__SECUREKEYPAYPAL_CONTRACTLINE__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN'), '2');
344 } else {
345 $substitutionarray['__SECUREKEYPAYPAL_CONTRACTLINE__'] = dol_hash(getDolGlobalString('PAYPAL_SECURITY_TOKEN') . 'contractline'.$obj->source_id, '2');
346 }
347 }
348 //$substitutionisok=true;
349
350 complete_substitutions_array($substitutionarray, $langs);
351 $newsubject = make_substitutions($subject, $substitutionarray);
352 $newmessage = make_substitutions($message, $substitutionarray, null, 0);
353
354 $moreinheader = '';
355 if (preg_match('/__UNSUBSCRIBE_(_|URL_)/', $message)) {
356 $moreinheader = "List-Unsubscribe: <__UNSUBSCRIBE_URL__>\n";
357 $moreinheader = make_substitutions($moreinheader, $substitutionarray);
358 }
359
360 $arr_file = array();
361 $arr_mime = array();
362 $arr_name = array();
363 $arr_css = array();
364
365 $listofpaths = dol_dir_list($upload_dir, 'all', 0, '', '', 'name', SORT_ASC, 0);
366 if (count($listofpaths)) {
367 foreach ($listofpaths as $key => $val) {
368 $arr_file[] = $listofpaths[$key]['fullname'];
369 $arr_mime[] = dol_mimetype($listofpaths[$key]['name']);
370 $arr_name[] = $listofpaths[$key]['name'];
371 }
372 }
373
374 // Mail making
375 $trackid = 'emailing-'.$obj->fk_mailing.'-'.$obj->rowid;
376 $upload_dir_tmp = $upload_dir;
377 $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);
378
379 if ($mail->error) {
380 $res = 0;
381 }
382 /*if (! $substitutionisok)
383 {
384 $mail->error='Some substitution failed';
385 $res=0;
386 }*/
387
388 // Send mail
389 if ($res) {
390 $res = $mail->sendfile();
391 }
392
393 if ($res) {
394 // Mail successful
395 $nbok++;
396
397 dol_syslog("comm/mailing/card.php: ok for #".$iforemailloop.($mail->error ? ' - '.$mail->error : ''), LOG_DEBUG);
398
399 $sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles";
400 $sql .= " SET statut=1, date_envoi = '".$db->idate($now)."' WHERE rowid=".((int) $obj->rowid);
401 $resql2 = $db->query($sql);
402 if (!$resql2) {
403 dol_print_error($db);
404 } else {
405 //if check read is use then update prospect contact status
406 if (strpos($message, '__CHECK_READ__') !== false) {
407 //Update status communication of thirdparty prospect
408 $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).")";
409 dol_syslog("card.php: set prospect thirdparty status", LOG_DEBUG);
410 $resql2 = $db->query($sql);
411 if (!$resql2) {
412 dol_print_error($db);
413 }
414
415 //Update status communication of contact prospect
416 $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)";
417 dol_syslog("card.php: set prospect contact status", LOG_DEBUG);
418
419 $resql2 = $db->query($sql);
420 if (!$resql2) {
421 dol_print_error($db);
422 }
423 }
424 }
425
426 if (getDolGlobalString('MAILING_DELAY')) {
427 dol_syslog("Wait a delay of MAILING_DELAY=".((float) $conf->global->MAILING_DELAY));
428 usleep((int) ((float) $conf->global->MAILING_DELAY * 1000000));
429 }
430
431 //test if CHECK READ change statut prospect contact
432 } else {
433 // Mail failed
434 $nbko++;
435
436 dol_syslog("comm/mailing/card.php: error for #".$iforemailloop.($mail->error ? ' - '.$mail->error : ''), LOG_WARNING);
437
438 $sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles";
439 $sql .= " SET statut=-1, error_text='".$db->escape(dol_trunc($mail->error, 250))."', date_envoi='".$db->idate($now)."' WHERE rowid=".((int) $obj->rowid);
440 $resql2 = $db->query($sql);
441 if (!$resql2) {
442 dol_print_error($db);
443 }
444 }
445
446 $iforemailloop++;
447 }
448 } else {
449 setEventMessages($langs->transnoentitiesnoconv("NoMoreRecipientToSendTo"), null, 'mesgs');
450 }
451
452 // Loop finished, set global statut of mail
453 if ($nbko > 0) {
454 $statut = 2; // Status 'sent partially' (because at least one error)
455 setEventMessages($langs->transnoentitiesnoconv("EMailSentToNRecipients", $nbok), null, 'mesgs');
456 } else {
457 if ($nbok >= $num) {
458 $statut = 3; // Send to everybody
459 } else {
460 $statut = 2; // Status 'sent partially' (because not send to everybody)
461 }
462 setEventMessages($langs->transnoentitiesnoconv("EMailSentToNRecipients", $nbok), null, 'mesgs');
463 }
464
465 $sql = "UPDATE ".MAIN_DB_PREFIX."mailing SET statut=".((int) $statut)." WHERE rowid = ".((int) $object->id);
466 dol_syslog("comm/mailing/card.php: update global status", LOG_DEBUG);
467 $resql2 = $db->query($sql);
468 if (!$resql2) {
469 dol_print_error($db);
470 }
471 } else {
472 dol_syslog($db->error());
473 dol_print_error($db);
474 }
475 $object->fetch($id);
476 $action = '';
477 }
478 }
479
480 // Action send test emailing
481 if ($action == 'send' && ! $cancel && $permissiontovalidatesend) {
482 $error = 0;
483
484 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, 2, 0, 1, $object, 'mailing');
485
486 $object->sendto = GETPOST("sendto", 'alphawithlgt');
487 if (!$object->sendto) {
488 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("MailTo")), null, 'errors');
489 $error++;
490 }
491
492 if (!$error) {
493 // Is the message in html
494 $msgishtml = -1; // Unknown = autodetect by default
495 if (preg_match('/[\s\t]*<html>/i', $object->body)) {
496 $msgishtml = 1;
497 }
498
499 $signature = ((!empty($user->signature) && !getDolGlobalString('MAIN_MAIL_DO_NOT_USE_SIGN')) ? $user->signature : '');
500
501 $parameters = array('mode' => 'emailing');
502 $substitutionarray = getCommonSubstitutionArray($langs, 0, array('object', 'objectamount'), $targetobject); // Note: On mass emailing, this is null because be don't know object
503
504 // other are set at begin of page
505 $substitutionarray['__EMAIL__'] = $object->sendto;
506 $substitutionarray['__MAILTOEMAIL__'] = '<a href="mailto:'.$object->sendto.'">'.$object->sendto.'</a>';
507 $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"/>';
508 $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>';
509 $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';
510
511 // Subject and message substitutions
512 complete_substitutions_array($substitutionarray, $langs, $targetobject);
513
514 $tmpsujet = make_substitutions($object->sujet, $substitutionarray);
515 $tmpbody = make_substitutions($object->body, $substitutionarray);
516
517 $arr_file = array();
518 $arr_mime = array();
519 $arr_name = array();
520 $arr_css = array();
521
522 // Add CSS
523 if (!empty($object->bgcolor)) {
524 $arr_css['bgcolor'] = (preg_match('/^#/', $object->bgcolor) ? '' : '#').$object->bgcolor;
525 }
526 if (!empty($object->bgimage)) {
527 $arr_css['bgimage'] = $object->bgimage;
528 }
529
530 // Attached files
531 $listofpaths = dol_dir_list($upload_dir, 'all', 0, '', '', 'name', SORT_ASC, 0);
532 if (count($listofpaths)) {
533 foreach ($listofpaths as $key => $val) {
534 $arr_file[] = $listofpaths[$key]['fullname'];
535 $arr_mime[] = dol_mimetype($listofpaths[$key]['name']);
536 $arr_name[] = $listofpaths[$key]['name'];
537 }
538 }
539
540 $trackid = 'emailing-test';
541 $upload_dir_tmp = $upload_dir;
542 $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);
543
544 $result = $mailfile->sendfile();
545 if ($result) {
546 setEventMessages($langs->trans("MailSuccessfulySent", $mailfile->getValidAddress($object->email_from, 2), $mailfile->getValidAddress($object->sendto, 2)), null, 'mesgs');
547 $action = '';
548 } else {
549 setEventMessages($langs->trans("ResultKo").'<br>'.$mailfile->error.' '.json_encode($result), null, 'errors');
550 $action = 'test';
551 }
552 }
553 }
554
555 $mesgs = array();
556 // Action add emailing
557 if ($action == 'add' && $permissiontocreate) {
558 $object->messtype = (string) GETPOST("messtype");
559 if ($object->messtype == 'sms') {
560 $object->email_from = (string) GETPOST("from_phone", 'alphawithlgt'); // Must allow 'name <email>'
561 } else {
562 $object->email_from = (string) GETPOST("from", 'alphawithlgt'); // Must allow 'name <email>'
563 }
564 $object->email_replyto = (string) GETPOST("replyto", 'alphawithlgt'); // Must allow 'name <email>'
565 $object->email_errorsto = (string) GETPOST("errorsto", 'alphawithlgt'); // Must allow 'name <email>'
566 $object->title = (string) GETPOST("title");
567 $object->sujet = (string) GETPOST("sujet");
568 $object->body = (string) GETPOST("bodyemail", 'restricthtml');
569 $object->bgcolor = preg_replace('/^#/', '', (string) GETPOST("bgcolor"));
570 $object->bgimage = (string) GETPOST("bgimage");
571
572 if (!$object->title) {
573 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTitle"));
574 }
575 if ($object->messtype != 'sms' && !$object->sujet) {
576 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTopic"));
577 }
578 if (!$object->body) {
579 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailMessage"));
580 }
581
582 if (!count($mesgs)) {
583 if ($object->create($user) >= 0) {
584 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
585 exit;
586 }
587 $mesgs[] = $object->error;
588 $mesgs = array_merge($mesgs, $object->errors);
589 }
590
591 setEventMessages('', $mesgs, 'errors');
592 $action = "create";
593 }
594
595 // Action update description of emailing
596 if (($action == 'settitle' || $action == 'setemail_from' || $action == 'setemail_replyto' || $action == 'setreplyto' || $action == 'setemail_errorsto' || $action == 'setevenunsubscribe') && $permissiontovalidatesend) {
597 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, 2, 0, 1, $object, 'mailing');
598
599 if ($action == 'settitle') { // Test on permission already done
600 $object->title = trim(GETPOST('title', 'alpha'));
601 } elseif ($action == 'setemail_from') { // Test on permission already done
602 $object->email_from = trim(GETPOST('email_from', 'alphawithlgt')); // Must allow 'name <email>'
603 } elseif ($action == 'setemail_replyto') { // Test on permission already done
604 $object->email_replyto = trim(GETPOST('email_replyto', 'alphawithlgt')); // Must allow 'name <email>'
605 } elseif ($action == 'setemail_errorsto') { // Test on permission already done
606 $object->email_errorsto = trim(GETPOST('email_errorsto', 'alphawithlgt')); // Must allow 'name <email>'
607 } elseif ($action == 'settitle' && empty($object->title)) { // Test on permission already done
608 $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTitle"));
609 } elseif ($action == 'setfrom' && empty($object->email_from)) { // Test on permission already done
610 $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailFrom"));
611 } elseif ($action == 'setevenunsubscribe') { // Test on permission already done
612 $object->evenunsubscribe = (GETPOST('evenunsubscribe') ? 1 : 0);
613 }
614
615 if (!$mesg) {
616 $result = $object->update($user);
617 if ($result >= 0) {
618 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
619 exit;
620 }
621 $mesg = $object->error;
622 }
623
624 setEventMessages($mesg, $mesgs, 'errors');
625 $action = "";
626 }
627
628 /*
629 * Action of adding a file in email form
630 */
631 if (GETPOST('addfile') && $permissiontocreate) {
632 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, 2, 0, 1, $object, 'mailing');
633
634 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
635
636 // Set tmp user directory
637 dol_add_file_process($upload_dir, 0, 0, 'addedfile', '', null, '', 0);
638
639 $action = "edit";
640 }
641
642 // Action of file remove
643 if (GETPOST("removedfile") && $permissiontocreate) {
644 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, 2, 0, 1, $object, 'mailing');
645
646 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
647
648 dol_remove_file_process(GETPOST('removedfile'), 0, 0); // We really delete file linked to mailing
649
650 $action = "edit";
651 }
652
653 // Action of emailing update
654 if ($action == 'update' && !GETPOST("removedfile") && !$cancel && $permissiontocreate) {
655 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
656
657 $isupload = 0;
658
659 if (!$isupload) {
660 $mesgs = array();
661
662 //$object->messtype = (string) GETPOST("messtype"); // We must not be able to change the messtype
663 $object->sujet = (string) GETPOST("sujet");
664 $object->body = (string) GETPOST("bodyemail", 'restricthtml');
665 $object->bgcolor = preg_replace('/^#/', '', (string) GETPOST("bgcolor"));
666 $object->bgimage = (string) GETPOST("bgimage");
667
668 if ($object->messtype != 'sms' && !$object->sujet) {
669 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTopic"));
670 }
671 if (!$object->body) {
672 $mesgs[] = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailMessage"));
673 }
674
675 if (!count($mesgs)) {
676 if ($object->update($user) >= 0) {
677 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
678 exit;
679 }
680 $mesgs[] = $object->error;
681 $mesgs = array_merge($mesgs, $object->errors);
682 }
683
684 setEventMessages('', $mesgs, 'errors');
685 $action = "edit";
686 } else {
687 $action = "edit";
688 }
689 }
690
691 // Action of validation confirmation
692 if ($action == 'confirm_valid' && $confirm == 'yes' && $permissiontovalidatesend) {
693 if ($object->id > 0) {
694 $object->valid($user);
695 setEventMessages($langs->trans("MailingSuccessfullyValidated"), null, 'mesgs');
696 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
697 exit;
698 } else {
699 dol_print_error($db);
700 }
701 }
702
703 // Action of validation confirmation
704 if ($action == 'confirm_settodraft' && $confirm == 'yes' && $permissiontocreate) {
705 if ($object->id > 0) {
706 $result = $object->setStatut(0);
707 if ($result > 0) {
708 //setEventMessages($langs->trans("MailingSuccessfullyValidated"), null, 'mesgs');
709 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
710 exit;
711 } else {
712 setEventMessages($object->error, $object->errors, 'errors');
713 }
714 } else {
715 dol_print_error($db);
716 }
717 }
718
719 // Resend
720 if ($action == 'confirm_reset' && $confirm == 'yes' && $permissiontocreate) {
721 if ($object->id > 0) {
722 $db->begin();
723
724 $result = $object->valid($user);
725 if ($result > 0) {
726 $result = $object->reset_targets_status($user);
727 }
728
729 if ($result > 0) {
730 $db->commit();
731 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
732 exit;
733 } else {
734 setEventMessages($object->error, $object->errors, 'errors');
735 $db->rollback();
736 }
737 } else {
738 dol_print_error($db);
739 }
740 }
741
742 // Action of delete confirmation
743 if ($action == 'confirm_delete' && $confirm == 'yes' && $permissiontodelete) {
744 if ($object->delete($user)) {
745 $url = (!empty($urlfrom) ? $urlfrom : 'list.php');
746 header("Location: ".$url);
747 exit;
748 }
749 }
750
751 if ($cancel) {
752 $action = '';
753 }
754}
755
756
757/*
758 * View
759 */
760
761$form = new Form($db);
762$htmlother = new FormOther($db);
763
764$help_url = 'EN:Module_EMailing|FR:Module_Mailing|ES:M&oacute;dulo_Mailing';
766 '',
767 $langs->trans("Mailing"),
768 $help_url,
769 '',
770 0,
771 0,
772 array(
773 '/includes/ace/src/ace.js',
774 '/includes/ace/src/ext-statusbar.js',
775 '/includes/ace/src/ext-language_tools.js',
776 //'/includes/ace/src/ext-chromevox.js'
777 ),
778 array()
779);
780
781
782if ($action == 'create') { // aaa
783 // EMailing in creation mode
784 print '<form name="new_mailing" action="'.$_SERVER['PHP_SELF'].'" method="POST">'."\n";
785 print '<input type="hidden" name="token" value="'.newToken().'">';
786 print '<input type="hidden" name="action" value="add">';
787
788 $htmltext = '<i>'.$langs->trans("FollowingConstantsWillBeSubstituted").':<br><br><span class="small">';
789 foreach ($object->substitutionarray as $key => $val) {
790 $htmltext .= $key.' = '.$langs->trans($val).'<br>';
791 }
792 $htmltext .= '</span></i>';
793
794
795 $availablelink = $form->textwithpicto('<span class="opacitymedium">'.$langs->trans("AvailableVariables").'</span>', $htmltext, 1, 'helpclickable', '', 0, 2, 'availvar');
796 //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>';
797
798
799 // Print mail form
800 print load_fiche_titre($langs->trans("NewMailing"), $availablelink, 'object_email');
801
802 print dol_get_fiche_head(array(), '', '', -4, '', 0, '', '');
803
804 print '<table class="border centpercent">';
805
806 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>';
807
808 if (getDolGlobalInt('EMAILINGS_SUPPORT_ALSO_SMS')) {
809 $arrayoftypes = array("email" => "Email", "sms" => "SMS");
810 print '<tr><td class="fieldrequired titlefieldcreate">'.$langs->trans("Type").'</td><td>';
811 print $form->selectarray('messtype', $arrayoftypes, (GETPOSTISSET('messtype') ? GETPOST('messtype') : 'email'), 0, 0);
812
813 print '<script>
814 $( document ).ready(function() {
815 jQuery("#messtype").on("change", function() {
816 console.log("We change the message ttpe");
817 if (jQuery("#messtype").val() == "email") {
818 jQuery(".fieldsforsms").hide();
819 jQuery(".fieldsforemail").show();
820 }
821 if (jQuery("#messtype").val() == "sms") {
822 jQuery(".fieldsforsms").show();
823 jQuery(".fieldsforemail").hide();
824 }
825 });
826 jQuery("#messtype").change();
827 })
828 </script>';
829
830 print '</td></tr>';
831 }
832 print '</table>';
833
834 print '<br><br>';
835
836 print '<table class="border centpercent">';
837
838 print '<tr class="fieldsforemail"><td class="fieldrequired titlefieldcreate">'.$langs->trans("MailFrom").'</td><td><input class="flat minwidth200" name="from" value="'.(GETPOSTISSET('from') ? GETPOST('from') : getDolGlobalString('MAILING_EMAIL_FROM')).'"></td></tr>';
839
840 print '<tr class="fieldsforsms hidden"><td class="fieldrequired titlefieldcreate">'.$langs->trans("PhoneFrom").'</td><td><input class="flat minwidth200" name="fromphone" value="'.(GETPOSTISSET('fromphone') ? GETPOST('fromphone') : getDolGlobalString('MAILING_SMS_FROM')).'" placeholder="+123..."></td></tr>';
841
842 print '<tr class="fieldsforemail"><td>'.$langs->trans("MailErrorsTo").'</td><td><input class="flat minwidth200" name="errorsto" value="'.getDolGlobalString('MAILING_EMAIL_ERRORSTO', getDolGlobalString('MAIN_MAIL_ERRORS_TO')).'"></td></tr>';
843
844 print '<tr class="fieldsforemail"><td>'.$langs->trans("MailReply").'</td><td><input class="flat minwidth200" name="replyto" value="'.getDolGlobalString('MAILING_EMAIL_REPLYTO', getDolGlobalString('MAIN_MAIL_REPLY_TO')).'"></td></tr>';
845
846 // Other attributes
847 $parameters = array();
848 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
849 print $hookmanager->resPrint;
850 if (empty($reshook)) {
851 print $object->showOptionals($extrafields, 'create');
852 }
853
854 print '</table>';
855 print '<br><br>';
856
857 print '<table class="border centpercent">';
858 print '<tr class="fieldsforemail"><td class="fieldrequired titlefieldcreate">'.$langs->trans("MailTopic").'</td><td><input id="sujet" class="flat minwidth200 quatrevingtpercent" name="sujet" value="'.dol_escape_htmltag(GETPOST('sujet', 'alphanohtml')).'"></td></tr>';
859 print '<tr class="fieldsforemail"><td>'.$langs->trans("BackgroundColorByDefault").'</td><td colspan="3">';
860 print $htmlother->selectColor(GETPOST('bgcolor'), 'bgcolor', '', 0);
861 print '</td></tr>';
862
863 $formmail = new FormMail($db);
864 $formmail->withfckeditor = 1;
865 $formmail->withlayout = 'emailing';
866 $formmail->withaiprompt = 'html';
867
868 print '<tr class="fieldsforemail"><td></td><td class="tdtop"></td></tr>';
869
870 print '<tr class="fieldsforemail"><td></td><td class="tdtop">';
871
872 $out = '';
873 $showlinktolayout = ($formmail->withfckeditor ? $formmail->withlayout : '');
874 $showlinktolayoutlabel = $langs->trans("FillMessageWithALayout");
875 $showlinktoai = ($formmail->withaiprompt && isModEnabled('ai')) ? 'textgenerationemail' : '';
876 $showlinktoailabel = $langs->trans("FillMessageWithAIContent");
877 $formatforouput = 'html';
878 $htmlname = 'bodyemail';
879
880 // Fill $out
881 include DOL_DOCUMENT_ROOT.'/core/tpl/formlayoutai.tpl.php';
882
883 print $out;
884
885 print '</td></tr>';
886 print '</table>';
887
888
889 print '<div style="padding-top: 10px">';
890 // wysiwyg editor
891 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
892 $doleditor = new DolEditor('bodyemail', GETPOST('bodyemail', 'restricthtmlallowunvalid'), '', 600, 'dolibarr_mailings', '', true, true, getDolGlobalInt('FCKEDITOR_ENABLE_MAILING'), 20, '90%');
893 $doleditor->Create();
894 print '</div>';
895
896 print dol_get_fiche_end();
897
898 print $form->buttonsSaveCancel("Create", 'Cancel');
899
900 print '</form>';
901} else {
902 if ($object->id > 0) {
903 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, 2, 0, 1, $object, 'mailing');
904
906
907 if ($action == 'settodraft') {
908 // Confirmation back to draft
909 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("SetToDraft"), $langs->trans("ConfirmUnvalidateEmailing"), "confirm_settodraft", '', '', 1);
910 } elseif ($action == 'valid') {
911 // Confirmation of mailing validation
912 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("ValidMailing"), $langs->trans("ConfirmValidMailing"), "confirm_valid", '', '', 1);
913 } elseif ($action == 'reset') {
914 // Confirm reset
915 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("ResetMailing"), $langs->trans("ConfirmResetMailing", $object->ref), "confirm_reset", '', '', 2);
916 } elseif ($action == 'delete') {
917 // Confirm delete
918 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id.(!empty($urlfrom) ? '&urlfrom='.urlencode($urlfrom) : ''), $langs->trans("DeleteMailing"), $langs->trans("ConfirmDeleteMailing"), "confirm_delete", '', '', 1);
919 }
920
921 if ($action != 'edit' && $action != 'edittxt' && $action != 'edithtml') {
922 print dol_get_fiche_head($head, 'card', $langs->trans("Mailing"), -1, 'email');
923
924 // View mode mailing
925 if ($action == 'sendall') {
926 // Define message to recommend from command line
927 $sendingmode = getDolGlobalString('EMAILING_MAIL_SENDMODE');
928 if (empty($sendingmode)) {
929 $sendingmode = getDolGlobalString('MAIN_MAIL_SENDMODE');
930 }
931 if (empty($sendingmode)) {
932 $sendingmode = 'mail'; // If not defined, we use php mail function
933 }
934
935 // MAILING_NO_USING_PHPMAIL may be defined or not.
936 // MAILING_LIMIT_SENDBYWEB is always defined to something != 0 (-1=forbidden).
937 // MAILING_LIMIT_SENDBYCLI may be defined or not (-1=forbidden, 0 or undefined=no limit).
938 // MAILING_LIMIT_SENDBYDAY may be defined or not (0 or undefined=no limit).
939 if (getDolGlobalString('MAILING_NO_USING_PHPMAIL') && $sendingmode == 'mail') {
940 // 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.
941 // You ensure that every user is using its own SMTP server when using the mass emailing module.
942 $linktoadminemailbefore = '<a href="'.DOL_URL_ROOT.'/admin/mails_emailing.php">';
943 $linktoadminemailend = '</a>';
944 setEventMessages($langs->trans("MailSendSetupIs", $listofmethods[$sendingmode]), null, 'warnings');
945 $messagetoshow = $langs->trans("MailSendSetupIs2", '{s1}', '{s2}', '{s3}', '{s4}');
946 $messagetoshow = str_replace('{s1}', $linktoadminemailbefore, $messagetoshow);
947 $messagetoshow = str_replace('{s2}', $linktoadminemailend, $messagetoshow);
948 $messagetoshow = str_replace('{s3}', $langs->transnoentitiesnoconv("MAIN_MAIL_SENDMODE"), $messagetoshow);
949 $messagetoshow = str_replace('{s4}', $listofmethods['smtps'], $messagetoshow);
950 setEventMessages($messagetoshow, null, 'warnings');
951
952 if (getDolGlobalString('MAILING_SMTP_SETUP_EMAILS_FOR_QUESTIONS')) {
953 setEventMessages($langs->trans("MailSendSetupIs3", getDolGlobalString('MAILING_SMTP_SETUP_EMAILS_FOR_QUESTIONS')), null, 'warnings');
954 }
955 $action = '';
956 } elseif (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < 0) {
957 if (getDolGlobalString('MAILING_LIMIT_WARNING_PHPMAIL') && $sendingmode == 'mail') {
958 setEventMessages($langs->transnoentitiesnoconv($conf->global->MAILING_LIMIT_WARNING_PHPMAIL), null, 'warnings');
959 }
960 if (getDolGlobalString('MAILING_LIMIT_WARNING_NOPHPMAIL') && $sendingmode != 'mail') {
961 setEventMessages($langs->transnoentitiesnoconv($conf->global->MAILING_LIMIT_WARNING_NOPHPMAIL), null, 'warnings');
962 }
963
964 // The feature is forbidden from GUI, we show just message to use from command line.
965 setEventMessages($langs->trans("MailingNeedCommand"), null, 'warnings');
966 setEventMessages('<textarea cols="60" rows="'.ROWS_1.'" wrap="soft">php ./scripts/emailings/mailing-send.php '.$object->id.'</textarea>', null, 'warnings');
967 if ($conf->file->mailing_limit_sendbyweb != '-1') { // MAILING_LIMIT_SENDBYWEB was set to -1 in database, but it is allowed to increase it.
968 setEventMessages($langs->trans("MailingNeedCommand2"), null, 'warnings'); // You can send online with constant...
969 }
970 $action = '';
971 } else {
972 if (getDolGlobalString('MAILING_LIMIT_WARNING_PHPMAIL') && $sendingmode == 'mail') {
973 setEventMessages($langs->transnoentitiesnoconv($conf->global->MAILING_LIMIT_WARNING_PHPMAIL), null, 'warnings');
974 }
975 if (getDolGlobalString('MAILING_LIMIT_WARNING_NOPHPMAIL') && $sendingmode != 'mail') {
976 setEventMessages($langs->transnoentitiesnoconv($conf->global->MAILING_LIMIT_WARNING_NOPHPMAIL), null, 'warnings');
977 }
978
979 $text = '';
980
981 if (getDolGlobalInt('MAILING_LIMIT_SENDBYDAY') > 0) {
982 $text .= $langs->trans('WarningLimitSendByDay', getDolGlobalInt('MAILING_LIMIT_SENDBYDAY'));
983 $text .= '<br><br>';
984 }
985 $text .= $langs->trans('ConfirmSendingEmailing').'<br>';
986 $text .= $langs->trans('LimitSendingEmailing', getDolGlobalString('MAILING_LIMIT_SENDBYWEB'));
987
988 if (!isset($conf->global->MAILING_LIMIT_SENDBYCLI) || getDolGlobalInt('MAILING_LIMIT_SENDBYCLI') >= 0) {
989 $text .= '<br><br>';
990 $text .= '<u>'.$langs->trans("AdvancedAlternative").':</u> '.$langs->trans("MailingNeedCommand");
991 $text .= '<br><textarea class="quatrevingtpercent" rows="'.ROWS_2.'" wrap="soft" disabled>php ./scripts/emailings/mailing-send.php '.$object->id.' '.$user->login.'</textarea>';
992 }
993
994 print $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('SendMailing'), $text, 'sendallconfirmed', '', '', 1, 380, 660, 0, $langs->trans("Confirm"), $langs->trans("Cancel"));
995 }
996 }
997
998 $linkback = '<a href="'.DOL_URL_ROOT.'/comm/mailing/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
999
1000 $morehtmlref = '<div class="refidno">';
1001 // Ref customer
1002 $morehtmlref .= $form->editfieldkey("", 'title', $object->title, $object, $user->hasRight('mailing', 'creer'), 'string', '', 0, 1);
1003 $morehtmlref .= $form->editfieldval("", 'title', $object->title, $object, $user->hasRight('mailing', 'creer'), 'string', '', null, null, '', 1);
1004 $morehtmlref .= '</div>';
1005
1006 $morehtmlstatus = '';
1007 $nbtry = $nbok = 0;
1008 if ($object->status == 2 || $object->status == 3) {
1009 $nbtry = $object->countNbOfTargets('alreadysent');
1010 $nbko = $object->countNbOfTargets('alreadysentko');
1011
1012 $morehtmlstatus .= ' ('.$nbtry.'/'.$object->nbemail;
1013 if ($nbko) {
1014 $morehtmlstatus .= ' - '.$nbko.' '.$langs->trans("Error");
1015 }
1016 $morehtmlstatus .= ') &nbsp; ';
1017 }
1018
1019 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', $morehtmlstatus);
1020
1021 print '<div class="fichecenter">';
1022 print '<div class="fichehalfleft">';
1023 print '<div class="underbanner clearboth"></div>';
1024 print '<table class="border centpercent tableforfield">'."\n";
1025
1026 // From
1027 print '<tr><td class="titlefield">';
1028 print $form->editfieldkey("MailFrom", 'email_from', $object->email_from, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1029 print '</td><td>';
1030 print $form->editfieldval("MailFrom", 'email_from', $object->email_from, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1031 $email = CMailFile::getValidAddress($object->email_from, 2);
1032 if ($email && !isValidEmail($email)) {
1033 $langs->load("errors");
1034 print img_warning($langs->trans("ErrorBadEMail", $email));
1035 } elseif ($email && !isValidMailDomain($email)) {
1036 $langs->load("errors");
1037 print img_warning($langs->trans("ErrorBadMXDomain", $email));
1038 }
1039
1040 print '</td></tr>';
1041
1042 // Errors to
1043 if ($object->messtype != 'sms') {
1044 print '<tr><td>';
1045 print $form->editfieldkey("MailErrorsTo", 'email_errorsto', $object->email_errorsto, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1046 print '</td><td>';
1047 print $form->editfieldval("MailErrorsTo", 'email_errorsto', $object->email_errorsto, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1048 $emailarray = CMailFile::getArrayAddress($object->email_errorsto);
1049 foreach ($emailarray as $email => $name) {
1050 if ($name != $email) {
1051 print dol_escape_htmltag($name).' &lt;'.$email;
1052 print '&gt;';
1053 if ($email && !isValidEmail($email)) {
1054 $langs->load("errors");
1055 print img_warning($langs->trans("ErrorBadEMail", $email));
1056 } elseif ($email && !isValidMailDomain($email)) {
1057 $langs->load("errors");
1058 print img_warning($langs->trans("ErrorBadMXDomain", $email));
1059 }
1060 } else {
1061 print dol_print_email($object->email_errorsto, 0, 0, 0, 0, 1);
1062 }
1063 }
1064 print '</td></tr>';
1065 }
1066
1067 // Reply to
1068 if ($object->messtype != 'sms') {
1069 print '<tr><td>';
1070 print $form->editfieldkey("MailReply", 'email_replyto', $object->email_replyto, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1071 print '</td><td>';
1072 print $form->editfieldval("MailReply", 'email_replyto', $object->email_replyto, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
1073 $email = CMailFile::getValidAddress($object->email_replyto, 2);
1074 if ($action != 'editemail_replyto') {
1075 if ($email && !isValidEmail($email)) {
1076 $langs->load("errors");
1077 print img_warning($langs->trans("ErrorBadEMail", $email));
1078 } elseif ($email && !isValidMailDomain($email)) {
1079 $langs->load("errors");
1080 print img_warning($langs->trans("ErrorBadMXDomain", $email));
1081 }
1082 }
1083 print '</td></tr>';
1084 }
1085
1086 print '</table>';
1087 print '</div>';
1088
1089 print '<div class="fichehalfright">';
1090 print '<div class="underbanner clearboth"></div>';
1091
1092 print '<table class="border centpercent tableforfield">';
1093
1094 // Number of distinct emails
1095 print '<tr><td>';
1096 print $langs->trans("TotalNbOfDistinctRecipients");
1097 print '</td><td>';
1098 $nbemail = ($object->nbemail ? $object->nbemail : 0);
1099 if (is_numeric($nbemail)) {
1100 $text = '';
1101 if ((getDolGlobalString('MAILING_LIMIT_SENDBYWEB') && getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < $nbemail) && ($object->status == 1 || ($object->status == 2 && $nbtry < $nbemail))) {
1102 if (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') > 0) {
1103 $text .= $langs->trans('LimitSendingEmailing', getDolGlobalString('MAILING_LIMIT_SENDBYWEB'));
1104 } else {
1105 $text .= $langs->trans('SendingFromWebInterfaceIsNotAllowed');
1106 }
1107 }
1108 if (empty($nbemail)) {
1109 $nbemail .= ' '.img_warning('').' <span class="warning">'.$langs->trans("NoTargetYet").'</span>';
1110 }
1111 if ($text) {
1112 print $form->textwithpicto($nbemail, $text, 1, 'warning');
1113 } else {
1114 print $nbemail;
1115 }
1116 }
1117 print '</td></tr>';
1118
1119 print '<tr><td>';
1120 print $langs->trans("MAIN_MAIL_SENDMODE");
1121 print '</td><td>';
1122 if ($object->messtype != 'sms') {
1123 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') && getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
1124 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING')];
1125 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE')) {
1126 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE')];
1127 } else {
1128 $text = $listofmethods['mail'];
1129 }
1130 print $text;
1131 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
1132 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'mail') {
1133 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER_EMAILING', getDolGlobalString('MAIN_MAIL_SMTP_SERVER')).')</span>';
1134 }
1135 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE') != 'mail' && getDolGlobalString('MAIN_MAIL_SMTP_SERVER')) {
1136 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
1137 }
1138 } else {
1139 print 'SMS ';
1140 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
1141 }
1142 print '</td></tr>';
1143
1144 // Other attributes. Fields from hook formObjectOptions and Extrafields.
1145 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
1146
1147 print '</table>';
1148 print '</div>';
1149 print '</div>';
1150
1151 print '<div class="clearboth"></div>';
1152
1153 print dol_get_fiche_end();
1154
1155
1156 // Clone confirmation
1157 if ($action == 'clone') {
1158 // Create an array for form
1159 $formquestion = array(
1160 'text' => $langs->trans("ConfirmClone"),
1161 0 => array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneContent"), 'value' => 1),
1162 1 => array('type' => 'checkbox', 'name' => 'clone_receivers', 'label' => $langs->trans("CloneReceivers"), 'value' => 0)
1163 );
1164 // Incomplete payment. On demande si motif = escompte ou autre
1165 print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneEMailing', $object->ref), 'confirm_clone', $formquestion, 'yes', 2, 240);
1166 }
1167
1168 // Actions Buttons
1169 if (GETPOST('cancel', 'alpha') || $confirm == 'no' || $action == '' || in_array($action, array('settodraft', 'valid', 'delete', 'sendall', 'clone', 'test', 'editevenunsubscribe'))) {
1170 print "\n\n<div class=\"tabsAction\">\n";
1171
1172 if (($object->status == 1) && ($user->hasRight('mailing', 'valider') || $object->user_validation_id == $user->id)) {
1173 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=settodraft&token='.newToken().'&id='.$object->id.'">'.$langs->trans("SetToDraft").'</a>';
1174 }
1175
1176 if (($object->status == 0 || $object->status == 1 || $object->status == 2) && $user->hasRight('mailing', 'creer')) {
1177 if (isModEnabled('fckeditor') && getDolGlobalString('FCKEDITOR_ENABLE_MAILING') && $object->messtype != 'sms') {
1178 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=edit&token='.newToken().'&id='.$object->id.'">'.$langs->trans("Edit").'</a>';
1179 } else {
1180 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=edittxt&token='.newToken().'&id='.$object->id.'">'.$langs->trans("EditWithTextEditor").'</a>';
1181 }
1182
1183 if (!getDolGlobalInt('EMAILINGS_SUPPORT_ALSO_SMS')) {
1184 if (!empty($conf->use_javascript_ajax)) {
1185 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=edithtml&token='.newToken().'&id='.$object->id.'">'.$langs->trans("EditHTMLSource").'</a>';
1186 }
1187 }
1188 }
1189
1190 //print '<a class="butAction" href="card.php?action=test&amp;id='.$object->id.'">'.$langs->trans("PreviewMailing").'</a>';
1191
1192 if (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !$user->hasRight('mailing', 'mailing_advance', 'send')) {
1193 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("TestMailing").'</a>';
1194 } else {
1195 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=test&token='.newToken().'&id='.$object->id.'">'.$langs->trans("TestMailing").'</a>';
1196 }
1197
1198 if ($object->status == 0) {
1199 if ($object->nbemail <= 0) {
1200 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NoTargetYet")).'">'.$langs->trans("Validate").'</a>';
1201 } elseif (!$user->hasRight('mailing', 'valider')) {
1202 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("Validate").'</a>';
1203 } else {
1204 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=valid&amp;id='.$object->id.'">'.$langs->trans("Validate").'</a>';
1205 }
1206 }
1207
1208 if (($object->status == 1 || $object->status == 2) && $object->nbemail > 0 && $user->hasRight('mailing', 'valider')) {
1209 if (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < 0) {
1210 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("SendingFromWebInterfaceIsNotAllowed")).'">'.$langs->trans("SendMailing").'</a>';
1211 } elseif (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !$user->hasRight('mailing', 'mailing_advance', 'send')) {
1212 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("SendMailing").'</a>';
1213 } else {
1214 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=sendall&amp;id='.$object->id.'">'.$langs->trans("SendMailing").'</a>';
1215 }
1216 }
1217
1218 if ($user->hasRight('mailing', 'creer')) {
1219 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=clone&amp;object=emailing&amp;id='.$object->id.'">'.$langs->trans("ToClone").'</a>';
1220 }
1221
1222 if (($object->status == 2 || $object->status == 3) && $user->hasRight('mailing', 'valider')) {
1223 if (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !$user->hasRight('mailing', 'mailing_advance', 'send')) {
1224 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("ResetMailing").'</a>';
1225 } else {
1226 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=reset&amp;id='.$object->id.'">'.$langs->trans("ResetMailing").'</a>';
1227 }
1228 }
1229
1230 if (($object->status <= 1 && $user->hasRight('mailing', 'creer')) || $user->hasRight('mailing', 'supprimer')) {
1231 if ($object->status > 0 && (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !$user->hasRight('mailing', 'mailing_advance', 'delete'))) {
1232 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("Delete").'</a>';
1233 } else {
1234 print '<a class="butActionDelete" href="'.$_SERVER['PHP_SELF'].'?action=delete&token='.newToken().'&id='.$object->id.(!empty($urlfrom) ? '&urlfrom='.$urlfrom : '').'">'.$langs->trans("Delete").'</a>';
1235 }
1236 }
1237
1238 print '</div>';
1239 }
1240
1241 // Display of the TEST form
1242 if ($action == 'test') {
1243 print '<div id="formmailbeforetitle" name="formmailbeforetitle"></div>';
1244 print load_fiche_titre($langs->trans("TestMailing"));
1245
1246 print dol_get_fiche_head([], '', '', -1);
1247
1248 // Create mail form object
1249 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
1250 $formmail = new FormMail($db);
1251 $formmail->fromname = $object->email_from;
1252 $formmail->frommail = $object->email_from;
1253 $formmail->withsubstit = 0;
1254 $formmail->withfrom = 0;
1255 $formmail->withto = $user->email ? $user->email : 1;
1256 $formmail->withtocc = 0;
1257 $formmail->withtoccc = getDolGlobalString('MAIN_EMAIL_USECCC');
1258 $formmail->withtopic = 0;
1259 $formmail->withtopicreadonly = 1;
1260 $formmail->withfile = 0;
1261 $formmail->withlayout = '';
1262 $formmail->withaiprompt = '';
1263 $formmail->withbody = 0;
1264 $formmail->withbodyreadonly = 1;
1265 $formmail->withcancel = 1;
1266 $formmail->withdeliveryreceipt = 0;
1267 // Table of substitutions
1268 $formmail->substit = $object->substitutionarrayfortest;
1269 // Table of post's complementary params
1270 $formmail->param["action"] = "send";
1271 $formmail->param["models"] = 'none';
1272 $formmail->param["mailid"] = $object->id;
1273 $formmail->param["returnurl"] = $_SERVER['PHP_SELF']."?id=".$object->id;
1274
1275 print $formmail->get_form();
1276
1277 print '<br>';
1278
1279 print dol_get_fiche_end();
1280
1281 dol_set_focus('#sendto');
1282 }
1283
1284
1285 $htmltext = '<i>'.$langs->trans("FollowingConstantsWillBeSubstituted").':<br><br><span class="small">';
1286 foreach ($object->substitutionarray as $key => $val) {
1287 $htmltext .= $key.' = '.$langs->trans($val).'<br>';
1288 }
1289 $htmltext .= '</span></i>';
1290
1291 // Print mail content
1292 print load_fiche_titre($langs->trans("EMail"), $form->textwithpicto('<span class="opacitymedium hideonsmartphone">'.$langs->trans("AvailableVariables").'</span>', $htmltext, 1, 'helpclickable', '', 0, 3, 'emailsubstitionhelp'), 'generic');
1293
1294 print dol_get_fiche_head([], '', '', -1);
1295
1296 print '<table class="bordernooddeven tableforfield centpercent">';
1297
1298 // Subject
1299 if ($object->messtype != 'sms') {
1300 print '<tr><td class="titlefield">'.$langs->trans("MailTopic").'</td><td colspan="3">'.$object->sujet.'</td></tr>';
1301 }
1302
1303 // Joined files
1304 if ($object->messtype != 'sms') {
1305 print '<tr><td>'.$langs->trans("MailFile").'</td><td colspan="3">';
1306 // List of files
1307 $listofpaths = dol_dir_list($upload_dir, 'all', 0, '', '', 'name', SORT_ASC, 0);
1308 if (count($listofpaths)) {
1309 foreach ($listofpaths as $key => $val) {
1310 print img_mime($listofpaths[$key]['name']).' '.$listofpaths[$key]['name'];
1311 print '<br>';
1312 }
1313 } else {
1314 print '<span class="opacitymedium">'.$langs->trans("NoAttachedFiles").'</span><br>';
1315 }
1316 print '</td></tr>';
1317 }
1318
1319 // Background color
1320 /*print '<tr><td width="15%">'.$langs->trans("BackgroundColorByDefault").'</td><td colspan="3">';
1321 print $htmlother->selectColor($object->bgcolor,'bgcolor','',0);
1322 print '</td></tr>';*/
1323
1324 print '</table>';
1325
1326 // Message
1327 print '<div style="padding-top: 10px; background: '.($object->bgcolor ? (preg_match('/^#/', $object->bgcolor) ? '' : '#').$object->bgcolor : 'white').'">';
1328 if (empty($object->bgcolor) || strtolower($object->bgcolor) == 'ffffff') { // CKEditor does not apply the color of the div into its content area
1329 $readonly = 1;
1330 // wysiwyg editor
1331 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1332 $doleditor = new DolEditor('bodyemail', $object->body, '', 600, 'dolibarr_mailings', '', false, true, !getDolGlobalString('FCKEDITOR_ENABLE_MAILING') ? 0 : 1, 20, '90%', $readonly);
1333 $doleditor->Create();
1334 } else {
1335 print dol_htmlentitiesbr($object->body);
1336 }
1337 print '</div>';
1338
1339 print dol_get_fiche_end();
1340 } else {
1341 /*
1342 * Edition mode mailing (CKeditor or HTML source)
1343 */
1344
1345 print dol_get_fiche_head($head, 'card', $langs->trans("Mailing"), -1, 'email');
1346
1347 $linkback = '<a href="'.DOL_URL_ROOT.'/comm/mailing/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
1348
1349 $morehtmlref = '<div class="refidno">';
1350 // Ref customer
1351 $morehtmlref .= $form->editfieldkey("", 'title', $object->title, $object, $user->hasRight('mailing', 'creer'), 'string', '', 0, 1);
1352 $morehtmlref .= $form->editfieldval("", 'title', $object->title, $object, $user->hasRight('mailing', 'creer'), 'string', '', null, null, '', 1);
1353 $morehtmlref .= '</div>';
1354
1355 $morehtmlstatus = '';
1356 $nbtry = $nbok = 0;
1357 if ($object->status == 2 || $object->status == 3) {
1358 $nbtry = $object->countNbOfTargets('alreadysent');
1359 $nbko = $object->countNbOfTargets('alreadysentko');
1360
1361 $morehtmlstatus .= ' ('.$nbtry.'/'.$object->nbemail;
1362 if ($nbko) {
1363 $morehtmlstatus .= ' - '.$nbko.' '.$langs->trans("Error");
1364 }
1365 $morehtmlstatus .= ') &nbsp; ';
1366 }
1367
1368 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', $morehtmlstatus);
1369
1370 print '<div class="fichecenter">';
1371 print '<div class="fichehalfleft">';
1372 print '<div class="underbanner clearboth"></div>';
1373
1374 print '<table class="border centpercent tableforfield">';
1375
1376 /*
1377 print '<tr><td class="titlefield">'.$langs->trans("Ref").'</td>';
1378 print '<td colspan="3">';
1379 print $form->showrefnav($object,'id', $linkback);
1380 print '</td></tr>';
1381 */
1382
1383 // From
1384 print '<tr><td class="titlefield">';
1385 print $langs->trans("MailFrom");
1386 print '</td><td>'.dol_print_email($object->email_from, 0, 0, 0, 0, 1).'</td></tr>';
1387 // To
1388 if ($object->messtype != 'sms') {
1389 print '<tr><td>'.$langs->trans("MailErrorsTo").'</td><td>'.dol_print_email($object->email_errorsto, 0, 0, 0, 0, 1).'</td></tr>';
1390 print '<tr><td>'.$langs->trans("MailReply").'</td><td>'.dol_print_email($object->email_replyto, 0, 0, 0, 0, 1).'</td></tr>';
1391 }
1392
1393 print '</table>';
1394 print '</div>';
1395
1396
1397 print '<div class="fichehalfright">';
1398 print '<div class="underbanner clearboth"></div>';
1399
1400 print '<table class="border centpercent tableforfield">';
1401
1402 // Number of distinct emails
1403 print '<tr><td>';
1404 print $langs->trans("TotalNbOfDistinctRecipients");
1405 print '</td><td>';
1406 $nbemail = ($object->nbemail ? $object->nbemail : 0);
1407 if (is_numeric($nbemail)) {
1408 $text = '';
1409 if ((getDolGlobalString('MAILING_LIMIT_SENDBYWEB') && $conf->global->MAILING_LIMIT_SENDBYWEB < $nbemail) && ($object->status == 1 || $object->status == 2)) {
1410 if (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') > 0) {
1411 $text .= $langs->trans('LimitSendingEmailing', getDolGlobalString('MAILING_LIMIT_SENDBYWEB'));
1412 } else {
1413 $text .= $langs->trans('SendingFromWebInterfaceIsNotAllowed');
1414 }
1415 }
1416 if (empty($nbemail)) {
1417 $nbemail .= ' '.img_warning('').' <span class="warning">'.$langs->trans("NoTargetYet").'</span>';
1418 }
1419 if ($text) {
1420 print $form->textwithpicto($nbemail, $text, 1, 'warning');
1421 } else {
1422 print $nbemail;
1423 }
1424 }
1425 print '</td></tr>';
1426
1427 print '<tr><td>';
1428 print $langs->trans("MAIN_MAIL_SENDMODE");
1429 print '</td><td>';
1430 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') && getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
1431 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING')];
1432 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE')) {
1433 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE')];
1434 } else {
1435 $text = $listofmethods['mail'];
1436 }
1437 print $text;
1438 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
1439 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'mail') {
1440 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER_EMAILING').')</span>';
1441 }
1442 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE') != 'mail' && getDolGlobalString('MAIN_MAIL_SMTP_SERVER')) {
1443 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
1444 }
1445 print '</td></tr>';
1446
1447
1448 // Other attributes
1449 $parameters = array();
1450 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1451 print $hookmanager->resPrint;
1452 if (empty($reshook)) {
1453 print $object->showOptionals($extrafields, 'edit', $parameters);
1454 }
1455
1456 print '</table>';
1457 print '</div>';
1458 print '</div>';
1459
1460 print '<div class="clearboth"></div>';
1461
1462 print dol_get_fiche_end();
1463
1464
1465 print "<br><br>\n";
1466
1467 print '<form name="edit_mailing" action="card.php" method="post" enctype="multipart/form-data">'."\n";
1468 print '<input type="hidden" name="token" value="'.newToken().'">';
1469 print '<input type="hidden" name="action" value="update">';
1470 print '<input type="hidden" name="id" value="'.$object->id.'">';
1471
1472 $htmltext = '<i>'.$langs->trans("FollowingConstantsWillBeSubstituted").':<br><br><span class="small">';
1473 foreach ($object->substitutionarray as $key => $val) {
1474 $htmltext .= $key.' = '.$langs->trans($val).'<br>';
1475 }
1476 $htmltext .= '</span></i>';
1477
1478 // Print mail content
1479 print load_fiche_titre($langs->trans("EMail"), '<span class="opacitymedium">'.$form->textwithpicto($langs->trans("AvailableVariables").'</span>', $htmltext, 1, 'help', '', 0, 2, 'emailsubstitionhelp'), 'generic');
1480
1481 print dol_get_fiche_head([], '', '', -1);
1482
1483 print '<table class="bordernooddeven centpercent">';
1484
1485 // Subject
1486 if ($object->messtype != 'sms') {
1487 print '<tr><td class="fieldrequired titlefield">';
1488 print $langs->trans("MailTopic");
1489 print '</td><td colspan="3"><input class="flat quatrevingtpercent" type="text" name="sujet" value="'.$object->sujet.'"></td></tr>';
1490 }
1491
1492 $trackid = ''; // TODO To avoid conflicts with 2 mass emailing, we should set a trackid here, even if we use another one into email header.
1493 dol_init_file_process($upload_dir, $trackid);
1494
1495 // Joined files
1496 if ($object->messtype != 'sms') {
1497 $addfileaction = 'addfile';
1498 print '<tr><td>'.$langs->trans("MailFile").'</td>';
1499 print '<td colspan="3">';
1500 // List of files
1501 $listofpaths = dol_dir_list($upload_dir, 'all', 0, '', '', 'name', SORT_ASC, 0);
1502 $out = '';
1503
1504 // TODO Trick to have param removedfile containing nb of image to delete. But this does not works without javascript
1505 $out .= '<input type="hidden" class="removedfilehidden" name="removedfile" value="">'."\n";
1506 $out .= '<script type="text/javascript">';
1507 $out .= 'jQuery(document).ready(function () {';
1508 $out .= ' jQuery(".removedfile").click(function() {';
1509 $out .= ' jQuery(".removedfilehidden").val(jQuery(this).val());';
1510 $out .= ' });';
1511 $out .= '})';
1512 $out .= '</script>'."\n";
1513 if (count($listofpaths)) {
1514 foreach ($listofpaths as $key => $val) {
1515 $out .= '<div id="attachfile_'.$key.'">';
1516 $out .= img_mime($listofpaths[$key]['name']).' '.$listofpaths[$key]['name'];
1517 $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.'" />';
1518 $out .= '<br></div>';
1519 }
1520 } else {
1521 //$out .= '<span class="opacitymedium">'.$langs->trans("NoAttachedFiles").'</span><br>';
1522 }
1523
1524 // Add link to add file
1525 $maxfilesizearray = getMaxFileSizeArray();
1526 $maxmin = $maxfilesizearray['maxmin'];
1527 if ($maxmin > 0) {
1528 $out .= '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
1529 }
1530 $out .= '<input type="file" class="flat" id="addedfile" name="addedfile" value="'.$langs->trans("Upload").'" />';
1531 $out .= ' ';
1532 $out .= '<input type="submit" class="button smallpaddingimp" id="'.$addfileaction.'" name="'.$addfileaction.'" value="'.$langs->trans("MailingAddFile").'" />';
1533 print $out;
1534 print '</td></tr>';
1535
1536 // Background color
1537 print '<tr><td>'.$langs->trans("BackgroundColorByDefault").'</td><td colspan="3">';
1538 print $htmlother->selectColor($object->bgcolor, 'bgcolor', '', 0);
1539 print '</td></tr>';
1540 }
1541
1542 print '</table>';
1543
1544
1545 // Message
1546 print '<div style="padding-top: 10px">';
1547
1548 if ($action == 'edit') {
1549 // wysiwyg editor
1550 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1551 $doleditor = new DolEditor('bodyemail', $object->body, '', 600, 'dolibarr_mailings', '', true, true, getDolGlobalInt('FCKEDITOR_ENABLE_MAILING'), 20, '90%');
1552 $doleditor->Create();
1553 }
1554 if ($action == 'edittxt') {
1555 // wysiwyg editor
1556 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1557 $doleditor = new DolEditor('bodyemail', $object->body, '', 600, 'dolibarr_mailings', '', true, true, 0, 20, '90%');
1558 $doleditor->Create();
1559 }
1560 if ($action == 'edithtml') {
1561 // HTML source editor
1562 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1563 $doleditor = new DolEditor('bodyemail', $object->body, '', 600, 'dolibarr_mailings', '', true, true, 'ace', 20, '90%');
1564 $doleditor->Create(0, '', false, 'HTML Source', 'php');
1565 }
1566
1567 print '</div>';
1568
1569
1570 print dol_get_fiche_end();
1571
1572 print '<div class="center">';
1573 print '<input type="submit" class="button buttonforacesave button-save" value="'.$langs->trans("Save").'" name="save">';
1574 print '&nbsp; &nbsp; &nbsp;';
1575 print '<input type="submit" class="button button-cancel" value="'.$langs->trans("Cancel").'" name="cancel">';
1576 print '</div>';
1577
1578 print '</form>';
1579 print '<br>';
1580 }
1581 } else {
1582 dol_print_error($db, $object->error);
1583 }
1584}
1585
1586// End of page
1587llxFooter();
1588$db->close();
$id
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
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:71
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
static getValidAddress($address, $format, $encode=0, $maxnumberofemail=0)
Return a formatted address string for SMTP protocol.
static getArrayAddress($address)
Return a formatted array of address string for SMTP protocol.
Class to manage a WYSIWYG editor.
Class to manage standard extra fields.
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation du formulaire html d'envoi de mail unitaire Usage: $formail = new Form...
static getAvailableSubstitKey($mode='formemail', $object=null)
Get list of substitution keys available for emails.
Class permettant la generation de composants html autre Only common components are here.
Class to manage emailings module.
Class to manage third parties objects (customers, suppliers, prospects...)
llxFooter()
Footer empty.
Definition document.php:107
emailing_prepare_head(Mailing $object)
Prepare array with list of tabs.
dol_add_file_process($upload_dir, $allowoverwrite=0, $updatesessionordb=0, $varfiles='addedfile', $savingdocmask='', $link=null, $trackid='', $generatethumbs=1, $object=null, $forceFullTestIndexation='')
Get and save an upload file (for example after submitting a new file a mail form).
dol_init_file_process($pathtoscan='', $trackid='')
Scan a directory and init $_SESSION to manage uploaded files with list of all found files.
dol_remove_file_process($filenb, $donotupdatesession=0, $donotdeletefile=1, $trackid='')
Remove an uploaded file (for example after submitting a new file a mail form).
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
Definition files.lib.php:63
isValidMailDomain($mail)
Return true if email has a domain name that can be resolved to MX type.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
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)
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...
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return 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
getMaxFileSizeArray()
Return the max allowed for file upload.
dol_hash($chain, $type='0', $nosalt=0)
Returns a hash (non reversible encryption) of a string.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.