28 if (!defined(
'NOSESSION')) {
29 define(
'NOSESSION',
'1');
32 $sapi_type = php_sapi_name();
33 $script_file = basename(__FILE__);
37 if (substr($sapi_type, 0, 3) ==
'cgi') {
38 echo
"Error: You are using PHP for CGI. To execute ".$script_file.
" from command line, you must use PHP for CLI mode.\n";
42 if (!isset($argv[1]) || !$argv[1]) {
43 print
"Usage: ".$script_file.
" (ID_MAILING|all) [userloginforsignature] [maxnbofemails]\n";
49 if (isset($argv[2]) || !empty($argv[2])) {
57 if (isset($argv[3]) || !empty($argv[3])) {
62 require_once $path.
"../../htdocs/master.inc.php";
63 require_once DOL_DOCUMENT_ROOT.
"/core/class/CMailFile.class.php";
64 require_once DOL_DOCUMENT_ROOT.
"/comm/mailing/class/mailing.class.php";
67 $version = DOL_VERSION;
70 if (empty($conf->global->MAILING_LIMIT_SENDBYCLI)) {
71 $conf->global->MAILING_LIMIT_SENDBYCLI = 0;
74 $langs->loadLangs(array(
"main",
"mails"));
82 print
"***** ".$script_file.
" (".$version.
") pid=".
dol_getmypid().
" *****\n";
84 if (!empty($conf->global->MAILING_DELAY)) {
85 print
'A delay of '.((float) $conf->global->MAILING_DELAY * 1000000).
' seconds has been set between each email'.
"\n";
88 if ($conf->global->MAILING_LIMIT_SENDBYCLI ==
'-1') {
91 if (!empty($dolibarr_main_db_readonly)) {
92 print
"Error: instance in read-only mode\n";
96 $user =
new User($db);
99 $user->fetch(
'', $login);
103 $sql =
"SELECT m.rowid";
104 $sql .=
" FROM ".MAIN_DB_PREFIX.
"mailing as m";
105 $sql .=
" WHERE m.statut IN (1,2)";
107 $sql .=
" AND m.rowid= ".((int) $id);
111 $resql = $db->query($sql);
113 $num = $db->num_rows(
$resql);
117 for ($j = 0; $j < $num; $j++) {
118 $obj = $db->fetch_object(
$resql);
120 dol_syslog(
"Process mailing with id ".$obj->rowid);
121 print
"Process mailing with id ".$obj->rowid.
"\n";
124 $emailing->fetch($obj->rowid);
126 $upload_dir = $conf->mailing->dir_output.
"/".
get_exdir($emailing->id, 2, 0, 1, $emailing,
'mailing');
129 $subject = $emailing->sujet;
130 $message = $emailing->body;
131 $from = $emailing->email_from;
132 $replyto = $emailing->email_replyto;
133 $errorsto = $emailing->email_errorsto;
136 if (preg_match(
'/[\s\t]*<html>/i', $message)) {
145 $sql2 =
"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";
146 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"mailing_cibles as mc";
147 $sql2 .=
" WHERE mc.statut < 1 AND mc.fk_mailing = ".((int) $id);
148 if ($conf->global->MAILING_LIMIT_SENDBYCLI > 0 && empty($max)) {
149 $sql2 .=
" LIMIT ".$conf->global->MAILING_LIMIT_SENDBYCLI;
150 } elseif ($conf->global->MAILING_LIMIT_SENDBYCLI > 0 && $max > 0) {
151 $sql2 .=
" LIMIT ".min($conf->global->MAILING_LIMIT_SENDBYCLI, $max);
152 } elseif ($max > 0) {
153 $sql2 .=
" LIMIT ".((int) $max);
156 $resql2 = $db->query($sql2);
158 $num2 = $db->num_rows($resql2);
159 dol_syslog(
"Nb of targets = ".$num2, LOG_DEBUG);
160 print
"Nb of targets = ".$num2.
"\n";
166 $sqlstartdate =
"UPDATE ".MAIN_DB_PREFIX.
"mailing SET date_envoi='".$db->idate($now).
"' WHERE rowid=".((int) $id);
167 $resqlstartdate = $db->query($sqlstartdate);
168 if (!$resqlstartdate) {
173 $thirdpartystatic =
new Societe($db);
182 $obj = $db->fetch_object($resql2);
185 $sendto = str_replace(
',',
' ',
dolGetFirstLastname($obj->firstname, $obj->lastname).
" <".$obj->email.
">");
188 $other = explode(
';', $obj->other);
189 $tmpfield = explode(
'=', $other[0], 2);
190 $other1 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
191 $tmpfield = explode(
'=', $other[1], 2);
192 $other2 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
193 $tmpfield = explode(
'=', $other[2], 2);
194 $other3 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
195 $tmpfield = explode(
'=', $other[3], 2);
196 $other4 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
197 $tmpfield = explode(
'=', $other[4], 2);
198 $other5 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
199 $signature = ((!empty($user->signature) && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN)) ? $user->signature :
'');
202 $parameters = array(
'mode' =>
'emailing');
206 $substitutionarray[
'__ID__'] = $obj->source_id;
207 if ($obj->source_type ==
"thirdparty") {
208 $result = $thirdpartystatic->fetch($obj->source_id);
211 $substitutionarray[
'__THIRDPARTY_CUSTOMER_CODE__'] = $thirdpartystatic->code_client;
213 $substitutionarray[
'__THIRDPARTY_CUSTOMER_CODE__'] =
'';
216 $substitutionarray[
'__EMAIL__'] = $obj->email;
217 $substitutionarray[
'__LASTNAME__'] = $obj->lastname;
218 $substitutionarray[
'__FIRSTNAME__'] = $obj->firstname;
219 $substitutionarray[
'__MAILTOEMAIL__'] =
'<a href="mailto:'.$obj->email.
'">'.$obj->email.
'</a>';
220 $substitutionarray[
'__OTHER1__'] = $other1;
221 $substitutionarray[
'__OTHER2__'] = $other2;
222 $substitutionarray[
'__OTHER3__'] = $other3;
223 $substitutionarray[
'__OTHER4__'] = $other4;
224 $substitutionarray[
'__OTHER5__'] = $other5;
225 $substitutionarray[
'__USER_SIGNATURE__'] = $signature;
226 $substitutionarray[
'__SIGNATURE__'] = $signature;
227 $substitutionarray[
'__CHECK_READ__'] =
'<img src="'.DOL_MAIN_URL_ROOT.
'/public/emailing/mailing-read.php?tag='.urlencode($obj->tag).
'&securitykey='.urlencode($conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY).
'&email='.urlencode($obj->email).
'&mtid='.$obj->rowid.
'" width="1" height="1" style="width:1px;height:1px" border="0"/>';
228 $substitutionarray[
'__UNSUBSCRIBE__'] =
'<a href="'.DOL_MAIN_URL_ROOT.
'/public/emailing/mailing-unsubscribe.php?tag='.urlencode($obj->tag).
'&unsuscrib=1&securitykey='.urlencode($conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY).
'&email='.urlencode($obj->email).
'&mtid='.$obj->rowid.
'" target="_blank">'.$langs->trans(
"MailUnsubcribe").
'</a>';
229 $substitutionarray[
'__UNSUBSCRIBE_URL__'] = DOL_MAIN_URL_ROOT.
'/public/emailing/mailing-unsubscribe.php?tag='.urlencode($obj->tag).
'&unsuscrib=1&securitykey='.urlencode($conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY).
'&email='.urlencode($obj->email).
'&mtid='.$obj->rowid;
231 $onlinepaymentenabled = 0;
232 if (!empty($conf->paypal->enabled)) {
233 $onlinepaymentenabled++;
235 if (!empty($conf->paybox->enabled)) {
236 $onlinepaymentenabled++;
238 if (!empty($conf->stripe->enabled)) {
239 $onlinepaymentenabled++;
241 if ($onlinepaymentenabled && !empty($conf->global->PAYMENT_SECURITY_TOKEN)) {
242 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
243 if (empty($conf->global->PAYMENT_SECURITY_TOKEN_UNIQUE)) {
244 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
245 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
246 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
247 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
249 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
dol_hash($conf->global->PAYMENT_SECURITY_TOKEN.
'membersubscription'.$obj->source_id, 2);
250 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
dol_hash($conf->global->PAYMENT_SECURITY_TOKEN.
'order'.$obj->source_id, 2);
251 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
dol_hash($conf->global->PAYMENT_SECURITY_TOKEN.
'invoice'.$obj->source_id, 2);
252 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
dol_hash($conf->global->PAYMENT_SECURITY_TOKEN.
'contractline'.$obj->source_id, 2);
256 if (!empty($conf->paypal->enabled) && !empty($conf->global->PAYPAL_SECURITY_TOKEN)) {
257 $substitutionarray[
'__SECUREKEYPAYPAL__'] =
dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
259 if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) {
260 $substitutionarray[
'__SECUREKEYPAYPAL_MEMBER__'] =
dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
262 $substitutionarray[
'__SECUREKEYPAYPAL_MEMBER__'] =
dol_hash($conf->global->PAYPAL_SECURITY_TOKEN.
'membersubscription'.$obj->source_id, 2);
265 if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) {
266 $substitutionarray[
'__SECUREKEYPAYPAL_ORDER__'] =
dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
268 $substitutionarray[
'__SECUREKEYPAYPAL_ORDER__'] =
dol_hash($conf->global->PAYPAL_SECURITY_TOKEN.
'order'.$obj->source_id, 2);
271 if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) {
272 $substitutionarray[
'__SECUREKEYPAYPAL_INVOICE__'] =
dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
274 $substitutionarray[
'__SECUREKEYPAYPAL_INVOICE__'] =
dol_hash($conf->global->PAYPAL_SECURITY_TOKEN.
'invoice'.$obj->source_id, 2);
277 if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) {
278 $substitutionarray[
'__SECUREKEYPAYPAL_CONTRACTLINE__'] =
dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
280 $substitutionarray[
'__SECUREKEYPAYPAL_CONTRACTLINE__'] =
dol_hash($conf->global->PAYPAL_SECURITY_TOKEN.
'contractline'.$obj->source_id, 2);
288 $substitutionisok =
true;
291 if (preg_match(
'/__UNSUBSCRIBE__/', $message)) {
292 $moreinheader =
"List-Unsubscribe: <__UNSUBSCRIBE_URL__>\n";
301 $listofpaths =
dol_dir_list($upload_dir,
'all', 0,
'',
'',
'name', SORT_ASC, 0);
303 if (count($listofpaths)) {
304 foreach ($listofpaths as $key => $val) {
305 $arr_file[] = $listofpaths[$key][
'fullname'];
307 $arr_name[] = $listofpaths[$key][
'name'];
311 $trackid =
'emailing-'.$obj->fk_mailing.
'-'.$obj->rowid;
312 $mail =
new CMailFile($newsubject, $sendto, $from, $newmessage, $arr_file, $arr_mime, $arr_name,
'',
'', 0, $msgishtml, $errorsto, $arr_css, $trackid, $moreinheader,
'emailing');
317 if (!$substitutionisok) {
318 $mail->error =
'Some substitution failed';
324 $res = $mail->sendfile();
331 dol_syslog(
"ok for emailing id ".$id.
" #".$i.($mail->error ?
' - '.$mail->error :
''), LOG_DEBUG);
351 $sqlok =
"UPDATE ".MAIN_DB_PREFIX.
"mailing_cibles";
352 $sqlok .=
" SET statut = 1, date_envoi = '".$db->idate($now).
"' WHERE rowid = ".((int) $obj->rowid);
353 $resqlok = $db->query($sqlok);
359 if (strpos($message,
'__CHECK_READ__') !==
false) {
361 $sqlx =
"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).
")";
362 dol_syslog(
"card.php: set prospect thirdparty status", LOG_DEBUG);
363 $resqlx = $db->query($sqlx);
370 $sqlx =
"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)";
371 dol_syslog(
"card.php: set prospect contact status", LOG_DEBUG);
373 $resqlx = $db->query($sqlx);
380 if (!empty($conf->global->MAILING_DELAY)) {
381 usleep((
float) $conf->global->MAILING_DELAY * 1000000);
388 dol_syslog(
"error for emailing id ".$id.
" #".$i.($mail->error ?
' - '.$mail->error :
''), LOG_DEBUG);
390 $sqlerror =
"UPDATE ".MAIN_DB_PREFIX.
"mailing_cibles";
391 $sqlerror .=
" SET statut=-1, date_envoi='".$db->idate($now).
"' WHERE rowid=".$obj->rowid;
392 $resqlerror = $db->query($sqlerror);
402 $mesg =
"Emailing id ".$id.
" has no recipient to target";
413 $sqlenddate =
"UPDATE ".MAIN_DB_PREFIX.
"mailing SET statut=".((int) $statut).
" WHERE rowid=".((int) $id);
415 dol_syslog(
"update global status", LOG_DEBUG);
416 print
"Update status of emailing id ".$id.
" to ".$statut.
"\n";
417 $resqlenddate = $db->query($sqlenddate);
418 if (!$resqlenddate) {
428 $mesg =
"No validated emailing id to send found.";