Browse Source

PSR et touti via phpcbf (c'est sans douleur)

pull/13/head
Cerdic 8 months ago
parent
commit
2c4dcb1ae3
  1. 63
      formulaires/configurer_facteur.php
  2. 53
      formulaires/tester_facteur.php
  3. 221
      inc/Facteur/FacteurMail.php
  4. 32
      inc/Facteur/FacteurSMTP.php
  5. 195
      inc/envoyer_mail.php
  6. 51
      inc/facteur.php
  7. 61
      inc/facteur_convertir_styles_inline.php
  8. 7
      inc/facteur_envoyer_alerte_fail.php
  9. 82
      inc/facteur_mail_html2text.php
  10. 28
      inc/facteur_mail_wrap_to_html.php

63
formulaires/configurer_facteur.php

@ -1,4 +1,5 @@
<?php
/**
* Plugin Facteur 4
* (c) 2009-2019 Collectif SPIP
@ -34,7 +35,7 @@ function formulaires_configurer_facteur_lister_champs_password_masques() {
* @param $dummy
* @return int[]|string[]
*/
function formulaires_configurer_facteur_lister_methodes_mailer($dummy=null) {
function formulaires_configurer_facteur_lister_methodes_mailer($dummy = null) {
include_spip('inc/facteur');
$methodes = facteur_lister_methodes_mailer();
@ -48,8 +49,8 @@ function formulaires_configurer_facteur_charger_dist() {
$valeurs = cvtconf_formulaires_configurer_recense('configurer_facteur');
$valeurs['editable'] = true;
foreach(formulaires_configurer_facteur_lister_champs_password_masques() as $_key){
$valeurs['_'.$_key] = $valeurs[$_key];
foreach (formulaires_configurer_facteur_lister_champs_password_masques() as $_key) {
$valeurs['_' . $_key] = $valeurs[$_key];
$valeurs[$_key] = '';
}
@ -60,13 +61,13 @@ function formulaires_configurer_facteur_charger_dist() {
$valeurs['_from_defaut_nom'] = '';
$valeurs['_from_defaut_email'] = $from_defaut['adresse_envoi_email'];
if (!empty($from_defaut['adresse_envoi_nom'])) {
$valeurs['_from_defaut'] = $from_defaut['adresse_envoi_nom'] . ' &lt;'.$valeurs['_from_defaut'].'&gt;';
$valeurs['_from_defaut'] = $from_defaut['adresse_envoi_nom'] . ' &lt;' . $valeurs['_from_defaut'] . '&gt;';
$valeurs['_from_defaut_nom'] = $from_defaut['adresse_envoi_nom'];
}
if (defined('_TEST_EMAIL_DEST')) {
if (_TEST_EMAIL_DEST) {
$valeurs['_message_warning'] = _T('facteur:info_envois_forces_vers_email', array('email' => _TEST_EMAIL_DEST));
$valeurs['_message_warning'] = _T('facteur:info_envois_forces_vers_email', ['email' => _TEST_EMAIL_DEST]);
}
else {
$valeurs['_message_warning'] = _T('facteur:info_envois_bloques_constante');
@ -77,10 +78,12 @@ function formulaires_configurer_facteur_charger_dist() {
}
function formulaires_configurer_facteur_verifier_dist() {
$erreurs = array();
$erreurs = [];
include_spip('inc/config');
if ($email = _request('adresse_envoi_email')
and !email_valide($email)) {
if (
$email = _request('adresse_envoi_email')
and !email_valide($email)
) {
$erreurs['adresse_envoi_email'] = _T('form_email_non_valide');
set_request('adresse_envoi', 'oui');
}
@ -88,12 +91,16 @@ function formulaires_configurer_facteur_verifier_dist() {
if (function_exists($verifier_mailer = 'formulaires_configurer_facteur_verifier_' . $mailer)) {
$verifier_mailer($erreurs);
}
if ($emailcc = _request('cc')
and !email_valide($emailcc)) {
if (
$emailcc = _request('cc')
and !email_valide($emailcc)
) {
$erreurs['cc'] = _T('form_email_non_valide');
}
if ($emailbcc = _request('bcc')
and !email_valide($emailbcc)) {
if (
$emailbcc = _request('bcc')
and !email_valide($emailbcc)
) {
$erreurs['bcc'] = _T('form_email_non_valide');
}
@ -107,7 +114,7 @@ function formulaires_configurer_facteur_verifier_dist() {
* Verifier la configuration du smtp si besoin
* @param $erreurs
*/
function formulaires_configurer_facteur_verifier_smtp(&$erreurs){
function formulaires_configurer_facteur_verifier_smtp(&$erreurs) {
if (!($h = _request('smtp_host'))) {
$erreurs['smtp_host'] = _T('info_obligatoire');
} else {
@ -115,8 +122,10 @@ function formulaires_configurer_facteur_verifier_smtp(&$erreurs){
$regexp_ip_valide = '#^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$#';
// Source : http://www.d-sites.com/2008/10/09/regex-ipv4-et-ipv6/
if (!preg_match($regexp_ip_valide, $h)) { // ce n'est pas une IP
if (!preg_match(';^([^.\s/?:]+[.])*[^.\s/?:]+$;', $h)
or gethostbyname($h) == $h) {
if (
!preg_match(';^([^.\s/?:]+[.])*[^.\s/?:]+$;', $h)
or gethostbyname($h) == $h
) {
$erreurs['smtp_host'] = _T('facteur:erreur_invalid_host');
}
} else {
@ -126,7 +135,7 @@ function formulaires_configurer_facteur_verifier_smtp(&$erreurs){
}
set_request('smtp_host', $h);
}
if (!($p=_request('smtp_port'))) {
if (!($p = _request('smtp_port'))) {
$erreurs['smtp_port'] = _T('info_obligatoire');
} elseif (!preg_match(';^[0-9]+$;', $p) or !intval($p)) {
$erreurs['smtp_port'] = _T('facteur:erreur_invalid_port');
@ -136,7 +145,7 @@ function formulaires_configurer_facteur_verifier_smtp(&$erreurs){
$erreurs['smtp_auth'] = _T('info_obligatoire');
}
if (_request('smtp_auth')=='oui') {
if (_request('smtp_auth') == 'oui') {
if (!_request('smtp_username')) {
$erreurs['smtp_username'] = _T('info_obligatoire');
}
@ -150,22 +159,22 @@ function formulaires_configurer_facteur_traiter_dist() {
include_spip('inc/config');
// reinjecter les password pas saisis si besoin
$restore_after_save = array();
foreach(formulaires_configurer_facteur_lister_champs_password_masques() as $_key){
if (!_request($_key)){
$restore_after_save = [];
foreach (formulaires_configurer_facteur_lister_champs_password_masques() as $_key) {
if (!_request($_key)) {
$restore_after_save[$_key] = '';
set_request($_key,lire_config('facteur/'.$_key));
set_request($_key, lire_config('facteur/' . $_key));
}
}
include_spip('inc/cvt_configurer');
$trace = cvtconf_formulaires_configurer_enregistre('configurer_facteur', array());
$res = array(
$trace = cvtconf_formulaires_configurer_enregistre('configurer_facteur', []);
$res = [
'editable' => true
);
];
include_spip('inc/facteur');
try {
$facteur = facteur_factory(array('exceptions' => true));
$facteur = facteur_factory(['exceptions' => true]);
$facteur->configure();
$res['message_ok'] = _T('facteur:config_info_enregistree') . $trace;
}
@ -173,8 +182,8 @@ function formulaires_configurer_facteur_traiter_dist() {
$res['message_erreur'] = $e->getMessage();
}
foreach($restore_after_save as $k=>$v){
set_request($k,$v);
foreach ($restore_after_save as $k => $v) {
set_request($k, $v);
}
return $res;

53
formulaires/tester_facteur.php

@ -1,4 +1,5 @@
<?php
/**
* Plugin Facteur 4
* (c) 2009-2019 Collectif SPIP
@ -14,19 +15,19 @@ if (!defined('_ECRIRE_INC_VERSION')) {
function formulaires_tester_facteur_charger_dist() {
include_spip('inc/config');
$valeurs = array(
$valeurs = [
'email_test' => $GLOBALS['meta']['email_webmaster'],
'email_test_from' => '',
'email_test_piece_jointe' => 0,
'email_test_important' => 0,
);
];
if (!empty($GLOBALS['visiteur_session']['email'])) {
$valeurs['email_test'] = $GLOBALS['visiteur_session']['email'];
}
if (defined('_TEST_EMAIL_DEST')) {
if (_TEST_EMAIL_DEST) {
$valeurs['_message_warning'] = _T('facteur:info_envois_forces_vers_email', array('email' => _TEST_EMAIL_DEST));
$valeurs['_message_warning'] = _T('facteur:info_envois_forces_vers_email', ['email' => _TEST_EMAIL_DEST]);
}
else {
$valeurs['_message_warning'] = _T('facteur:info_envois_bloques_constante');
@ -41,15 +42,17 @@ function formulaires_tester_facteur_charger_dist() {
}
function formulaires_tester_facteur_verifier_dist() {
$erreurs = array();
$erreurs = [];
if (!$email = _request('email_test')) {
$erreurs['email_test'] = _T('info_obligatoire');
} elseif (!email_valide($email)) {
$erreurs['email_test'] = _T('form_email_non_valide');
}
if ($from = _request('email_test_from')
and !email_valide($from)) {
if (
$from = _request('email_test_from')
and !email_valide($from)
) {
$erreurs['email_test_from'] = _T('form_email_non_valide');
}
@ -59,10 +62,10 @@ function formulaires_tester_facteur_verifier_dist() {
function formulaires_tester_facteur_traiter_dist() {
// envoyer un message de test ?
$res = array();
$res = [];
$destinataire = _request('email_test');
$message_html = '';
$options = array();
$options = [];
if ($from = _request('email_test_from')) {
$options['from'] = $from;
}
@ -90,8 +93,8 @@ function formulaires_tester_facteur_traiter_dist() {
* @param string $type
* @return string
*/
function facteur_inline_base64src($texte, $type="text/html"){
return "data:$type;charset=".$GLOBALS['meta']['charset'].";base64,".base64_encode($texte);
function facteur_inline_base64src($texte, $type = 'text/html') {
return "data:$type;charset=" . $GLOBALS['meta']['charset'] . ';base64,' . base64_encode($texte);
}
/**
@ -104,25 +107,25 @@ function facteur_inline_base64src($texte, $type="text/html"){
* @return string
* message erreur ou vide si tout est OK
*/
function facteur_envoyer_mail_test($destinataire, $titre, &$message_html, $options = array()) {
function facteur_envoyer_mail_test($destinataire, $titre, &$message_html, $options = []) {
$piece_jointe = array();
$piece_jointe = [];
if (test_plugin_actif('medias') and !empty($options['piece_jointe'])) {
include_spip('inc/documents');
// trouver une piece jointe dans les documents si possible, la plus legere possible, c'est juste pour le principe
// mais de preference un pdf car ça trig moins les antispam qu'un fichier office par exemple
foreach (['pdf', '%'] as $ext) {
$docs = sql_allfetsel('*', 'spip_documents', 'extension LIKE ' . sql_quote($ext) . ' AND media='.sql_quote('file').' AND distant='.sql_quote('non').' AND brise=0','', 'taille', '0,10');
$docs = sql_allfetsel('*', 'spip_documents', 'extension LIKE ' . sql_quote($ext) . ' AND media=' . sql_quote('file') . ' AND distant=' . sql_quote('non') . ' AND brise=0', '', 'taille', '0,10');
foreach ($docs as $doc) {
$file = get_spip_doc($doc['fichier']);
if (file_exists($file)) {
$mime = sql_getfetsel('mime_type', 'spip_types_documents', 'extension='.sql_quote($doc['extension']));
$piece_jointe = array(
$mime = sql_getfetsel('mime_type', 'spip_types_documents', 'extension=' . sql_quote($doc['extension']));
$piece_jointe = [
'chemin' => $file,
'nom' => $doc['titre'] ? $doc['titre'] : basename($doc['fichier']),
'mime' => $mime,
);
];
break 2;
}
}
@ -132,27 +135,27 @@ function facteur_envoyer_mail_test($destinataire, $titre, &$message_html, $optio
// trouver un article, de preference dans la langue du site, avec une image jointe
foreach ([$GLOBALS['meta']['langue_site'], '%'] as $lang) {
foreach (['%<img%', '%<emb%', '%<doc%', '%'] as $modele){
foreach (['%<img%', '%<emb%', '%<doc%', '%'] as $modele) {
if ($modele === '%' and $lang !== '%') {
continue;
}
$id_article = sql_getfetsel('id_article', 'spip_articles', "statut='publie' AND lang LIKE ".sql_quote($lang). " AND texte LIKE ".sql_quote($modele), '', 'LENGTH(texte) DESC,id_article', '0,1');
$id_article = sql_getfetsel('id_article', 'spip_articles', "statut='publie' AND lang LIKE " . sql_quote($lang) . ' AND texte LIKE ' . sql_quote($modele), '', 'LENGTH(texte) DESC,id_article', '0,1');
if ($id_article) {
break 2;
}
}
}
$message_html = recuperer_fond('emails/test_email_html', array('piece_jointe' => $piece_jointe, 'id_article' => $id_article));
$message_texte = recuperer_fond('emails/test_email_texte', array('piece_jointe' => $piece_jointe, 'id_article' => $id_article));
$corps = array(
$message_html = recuperer_fond('emails/test_email_html', ['piece_jointe' => $piece_jointe, 'id_article' => $id_article]);
$message_texte = recuperer_fond('emails/test_email_texte', ['piece_jointe' => $piece_jointe, 'id_article' => $id_article]);
$corps = [
'html' => $message_html,
'texte' => $message_texte,
'exceptions' => true,
);
];
if ($piece_jointe) {
$corps['pieces_jointes'] = array($piece_jointe);
$corps['pieces_jointes'] = [$piece_jointe];
}
if ($options) {
@ -160,7 +163,7 @@ function facteur_envoyer_mail_test($destinataire, $titre, &$message_html, $optio
}
// prefixer le titre par la date, c'est utile quand on debug et teste de nombreuses fois...
$titre = "[".date('Y-m-d H:i:s').'] ' . $titre;
$titre = '[' . date('Y-m-d H:i:s') . '] ' . $titre;
// passer par envoyer_mail pour bien passer par les pipeline et avoir tous les logs
$envoyer_mail = charger_fonction('envoyer_mail', 'inc');
@ -172,7 +175,7 @@ function facteur_envoyer_mail_test($destinataire, $titre, &$message_html, $optio
// si echec mais pas d'exception, on signale de regarder dans les logs
if (!$retour) {
return _T('facteur:erreur').' '._T('facteur:erreur_dans_log');
return _T('facteur:erreur') . ' ' . _T('facteur:erreur_dans_log');
}
// tout est OK, pas d'erreur

221
inc/Facteur/FacteurMail.php

@ -1,4 +1,5 @@
<?php
/**
* Plugin Facteur 4
* (c) 2009-2019 Collectif SPIP
@ -12,7 +13,7 @@ namespace SPIP\Facteur;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
if (!defined("_ECRIRE_INC_VERSION")){
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -51,7 +52,7 @@ class FacteurMail extends PHPMailer {
* Les URLs du site
* @var array
*/
protected $urlsBase = array();
protected $urlsBase = [];
/**
* CC Auto a remettre quand on clear les recipients
@ -79,7 +80,7 @@ class FacteurMail extends PHPMailer {
* @param $message
* @param $level
*/
public static function logDebug($message, $level){
public static function logDebug($message, $level) {
$facteurClass = get_called_class();
spip_log("$facteurClass: $level: " . trim($message), $facteurClass::$logName . _LOG_DEBUG);
}
@ -102,14 +103,14 @@ class FacteurMail extends PHPMailer {
* @param array $options
* @throws Exception
*/
public function __construct($options = array()){
public function __construct($options = []) {
// par defaut on log rien car tres verbeux
// on utilise facteur_log_debug qui filtre log SPIP en _LOG_DEBUG
$this->SMTPDebug = 0;
$this->Debugoutput = __NAMESPACE__ . '\FacteurMail::logDebug';
// Il est possible d'avoir beaucoup plus de logs avec 2, 3 ou 4, ce qui logs les échanges complets avec le serveur
// utiliser avec un define('_MAX_LOG',1000); car sinon on est limite a 100 lignes par hit et phpMailer est tres verbeux
if (defined('_FACTEUR_DEBUG_SMTP')){
if (defined('_FACTEUR_DEBUG_SMTP')) {
$this->SMTPDebug = _FACTEUR_DEBUG_SMTP;
}
$this->exceptions = false;
@ -117,13 +118,13 @@ class FacteurMail extends PHPMailer {
$this->exceptions = ($options['exceptions'] ? true : false);
}
if (!empty($options['adresse_envoi_email'])){
if (!empty($options['adresse_envoi_email'])) {
$this->From = $options['adresse_envoi_email'];
}
// Si plusieurs emails dans le from, pas de Name !
if (strpos($this->From, ",")===false){
if (!empty($options['adresse_envoi_nom'])){
if (strpos($this->From, ',') === false) {
if (!empty($options['adresse_envoi_nom'])) {
$this->FromName = $options['adresse_envoi_nom'];
}
}
@ -131,27 +132,27 @@ class FacteurMail extends PHPMailer {
// si forcer_from, on sauvegarde le From et FromName par defaut, qui seront utilises
// si From n'est pas dans le meme domaine
// (utiliser le facteur avec un service externe qui necessite la validation des domaines d'envoi)
if (isset($options['forcer_from']) and ($options['forcer_from'] === 'oui' or $options['forcer_from'] === true)){
if (isset($options['forcer_from']) and ($options['forcer_from'] === 'oui' or $options['forcer_from'] === true)) {
$this->ForceFrom = $this->From;
$this->ForceFromName = $this->FromName;
}
$this->CharSet = "utf-8";
$this->CharSet = 'utf-8';
$this->Mailer = 'mail';
// Retour des erreurs
if (!empty($options['smtp_sender'])){
if (!empty($options['smtp_sender'])) {
$this->Sender = $options['smtp_sender'];
$this->AddCustomHeader("Errors-To: " . $this->Sender);
$this->AddCustomHeader('Errors-To: ' . $this->Sender);
}
// Destinataires en copie, seulement s'il n'y a pas de destinataire de test
if (!defined('_TEST_EMAIL_DEST')){
if (!empty($options['cc'])){
if (!defined('_TEST_EMAIL_DEST')) {
if (!empty($options['cc'])) {
$this->autoCc = $options['cc'];
$this->AddCC($this->autoCc);
}
if (!empty($options['bcc'])){
if (!empty($options['bcc'])) {
$this->autoBcc = $options['bcc'];
$this->AddBCC($this->autoBcc);
}
@ -168,7 +169,6 @@ class FacteurMail extends PHPMailer {
if (!empty($options['adresses_site'])) {
$this->urlsBase = $options['adresses_site'];
}
}
/**
@ -176,7 +176,7 @@ class FacteurMail extends PHPMailer {
* (rien a faire ici dans le cas par defaut)
* @return bool
*/
public function configure(){
public function configure() {
return true;
}
@ -185,7 +185,7 @@ class FacteurMail extends PHPMailer {
* @param $objet
* @param $charset
*/
public function setObjet($objet, $charset = null){
public function setObjet($objet, $charset = null) {
if (is_null($charset)) {
$charset = $GLOBALS['meta']['charset'];
}
@ -203,9 +203,9 @@ class FacteurMail extends PHPMailer {
$this->clearAllRecipients();
//Pour un envoi multiple de mail, $email doit être un tableau avec les adresses.
if (is_array($email)){
foreach ($email as $cle => $adresseMail){
if (!$this->AddAddress($adresseMail)){
if (is_array($email)) {
foreach ($email as $cle => $adresseMail) {
if (!$this->AddAddress($adresseMail)) {
$this->log("Erreur AddAddress $adresseMail : " . print_r($this->ErrorInfo, true), _LOG_ERREUR);
}
}
@ -227,7 +227,7 @@ class FacteurMail extends PHPMailer {
}
// S'il y a un contenu HTML
if (!empty($message_html)){
if (!empty($message_html)) {
$message_html = unicode_to_utf_8(charset2unicode($message_html, $charset));
$this->Body = $message_html;
@ -240,11 +240,11 @@ class FacteurMail extends PHPMailer {
}
// S'il y a un contenu texte brut
if (!empty($message_texte)){
if (!empty($message_texte)) {
$message_texte = unicode_to_utf_8(charset2unicode($message_texte, $charset));
// Si pas de HTML on le remplace en tant que contenu principal
if (!$this->Body){
if (!$this->Body) {
$this->IsHTML(false);
$this->Body = $message_texte;
} // Sinon on met le texte brut en contenu alternatif
@ -252,7 +252,6 @@ class FacteurMail extends PHPMailer {
$this->AltBody = $message_texte;
}
}
}
/**
@ -260,9 +259,9 @@ class FacteurMail extends PHPMailer {
*/
public function setImportant($important = true) {
if ($important) {
$this->addCustomHeader("X-Priority", "1 (High)");
$this->addCustomHeader("X-MSMail-Priority", "High");
$this->addCustomHeader("Importance", "High");
$this->addCustomHeader('X-Priority', '1 (High)');
$this->addCustomHeader('X-MSMail-Priority', 'High');
$this->addCustomHeader('Importance', 'High');
}
$this->important = $important;
}
@ -274,57 +273,57 @@ class FacteurMail extends PHPMailer {
* @param $include
*/
public function setSendFailFunction($function, $args, $include) {
$this->sendFailFunction = array(
$this->sendFailFunction = [
'function' => $function,
'args' => $args,
'include' => $include,
);
];
}
/**
* Generer le log informatif sur le mail qui va etre envoye
* @return string
*/
public function getMessageLog(){
public function getMessageLog() {
$this->forceFromIfNeeded();
$header = $this->CreateHeader();
$trace = trim($header) . "\n";
// completer le header avec les infos essentielles qu'on veut dans les logs
if (!empty($this->to) and strpos($trace, "To:") === false) {
if (!empty($this->to) and strpos($trace, 'To:') === false) {
$trace .= $this->addrAppend('To', $this->to);
}
if (!empty($this->cc) and strpos($trace, "Cc:") === false) {
if (!empty($this->cc) and strpos($trace, 'Cc:') === false) {
$trace .= $this->addrAppend('Cc', $this->cc);
}
if (!empty($this->bcc) and strpos($trace, "Bcc:") === false) {
if (!empty($this->bcc) and strpos($trace, 'Bcc:') === false) {
$trace .= $this->addrAppend('Bcc', $this->bcc);
}
if (strpos($trace, 'Subject:') === false) {
$trace .= "Subject: " . $this->Subject . "\n";
$trace .= 'Subject: ' . $this->Subject . "\n";
}
$message_desc = [];
if (!empty($this->Body)) {
$message_desc[] = "Body(".strlen($this->Body)."c)";
$message_desc[] = 'Body(' . strlen($this->Body) . 'c)';
}
if (!empty($this->AltBody)) {
$message_desc[] = "AltBody(".strlen($this->AltBody)."c)";
$message_desc[] = 'AltBody(' . strlen($this->AltBody) . 'c)';
}
if (!empty($this->attachment)) {
$message_desc[] = "Files(".count($this->attachment).")";
$message_desc[] = 'Files(' . count($this->attachment) . ')';
}
$trace .= "Message: " . implode(' ', $message_desc)."\n";
$trace .= 'Message: ' . implode(' ', $message_desc) . "\n";
return "Sent by " . get_class($this) . "\n" . rtrim($trace);
return 'Sent by ' . get_class($this) . "\n" . rtrim($trace);
}
/**
* @param bool $exceptions
*/
public function setExceptions($exceptions){
public function setExceptions($exceptions) {
$this->exceptions = ($exceptions ? true : false);
}
@ -334,24 +333,36 @@ class FacteurMail extends PHPMailer {
*
* @param string|null $baseUrl
*/
protected function urlsToAbsUrls($baseUrl = null){
if (preg_match_all(',(<(a|link)[[:space:]]+[^<>]*href=["\']?)([^"\' ><[:space:]]+)([^<>]*>),imsS',
$this->Body, $liens, PREG_SET_ORDER)){
foreach ($liens as $lien){
if (strncmp($lien[3], "cid:", 4)!==0){
protected function urlsToAbsUrls($baseUrl = null) {
if (
preg_match_all(
',(<(a|link)[[:space:]]+[^<>]*href=["\']?)([^"\' ><[:space:]]+)([^<>]*>),imsS',
$this->Body,
$liens,
PREG_SET_ORDER
)
) {
foreach ($liens as $lien) {
if (strncmp($lien[3], 'cid:', 4) !== 0) {
$abs = url_absolue($lien[3], $baseUrl);
if ($abs<>$lien[3] and !preg_match('/^#/', $lien[3])){
if ($abs <> $lien[3] and !preg_match('/^#/', $lien[3])) {
$this->Body = str_replace($lien[0], $lien[1] . $abs . $lien[4], $this->Body);
}
}
}
}
if (preg_match_all(',(<(img|script)[[:space:]]+[^<>]*src=["\']?)([^"\' ><[:space:]]+)([^<>]*>),imsS',
$this->Body, $liens, PREG_SET_ORDER)){
foreach ($liens as $lien){
if (strncmp($lien[3], "cid:", 4)!==0){
if (
preg_match_all(
',(<(img|script)[[:space:]]+[^<>]*src=["\']?)([^"\' ><[:space:]]+)([^<>]*>),imsS',
$this->Body,
$liens,
PREG_SET_ORDER
)
) {
foreach ($liens as $lien) {
if (strncmp($lien[3], 'cid:', 4) !== 0) {
$abs = url_absolue($lien[3], $baseUrl);
if ($abs<>$lien[3]){
if ($abs <> $lien[3]) {
$this->Body = str_replace($lien[0], $lien[1] . $abs . $lien[4], $this->Body);
}
}
@ -363,8 +374,8 @@ class FacteurMail extends PHPMailer {
* Embed les images HTML dans l'email
* @throws Exception
*/
protected function embedReferencedImages(){
$image_types = array(
protected function embedReferencedImages() {
$image_types = [
'gif' => 'image/gif',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
@ -374,37 +385,42 @@ class FacteurMail extends PHPMailer {
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
//'swf' => 'application/x-shockwave-flash' // on elever pour des raisons de securite et deprecie
);
$src_found = array();
$images_embeded = array();
if (preg_match_all(
'/["\'](([^"\']+)\.(' . implode('|', array_keys($image_types)) . '))([?][^"\']+)?([#][^"\']+)?["\']/Uims',
$this->Body, $images, PREG_SET_ORDER)){
];
$src_found = [];
$images_embeded = [];
if (
preg_match_all(
'/["\'](([^"\']+)\.(' . implode('|', array_keys($image_types)) . '))([?][^"\']+)?([#][^"\']+)?["\']/Uims',
$this->Body,
$images,
PREG_SET_ORDER
)
) {
$adresse_site = $GLOBALS['meta']['adresse_site'] . '/';
foreach ($images as $im){
foreach ($images as $im) {
$im = array_pad($im, 6, null);
$src_orig = $im[1] . $im[4] . $im[5];
if (!isset($src_found[$src_orig])){ // deja remplace ? rien a faire (ie la meme image presente plusieurs fois)
if (!isset($src_found[$src_orig])) { // deja remplace ? rien a faire (ie la meme image presente plusieurs fois)
// examiner le src et voir si embedable
$src = $im[1];
foreach ($this->urlsBase as $base) {
if ($src AND strncmp($src, $base, strlen($base))==0){
if ($src and strncmp($src, $base, strlen($base)) == 0) {
$src = _DIR_RACINE . substr($src, strlen($base));
}
}
if ($src
AND !preg_match(",^([a-z0-9]+:)?//,i", $src)
AND (
if (
$src
and !preg_match(',^([a-z0-9]+:)?//,i', $src)
and (
file_exists($f = $src) // l'image a ete generee depuis le meme cote que l'envoi
OR (_DIR_RACINE AND file_exists($f = _DIR_RACINE . $src)) // l'image a ete generee dans le public et on est dans le prive
OR (!_DIR_RACINE AND file_exists($f = _DIR_RESTREINT . $src)) // l'image a ete generee dans le prive et on est dans le public
or (_DIR_RACINE and file_exists($f = _DIR_RACINE . $src)) // l'image a ete generee dans le public et on est dans le prive
or (!_DIR_RACINE and file_exists($f = _DIR_RESTREINT . $src)) // l'image a ete generee dans le prive et on est dans le public
)
){
if (!isset($images_embeded[$f])){
) {
if (!isset($images_embeded[$f])) {
$extension = strtolower($im[3]);
$header_extension = $image_types[$extension];
$cid = md5($f); // un id unique pour un meme fichier
@ -412,7 +428,7 @@ class FacteurMail extends PHPMailer {
$this->AddEmbeddedImage($f, $cid, basename($f), 'base64', $header_extension);
}
$this->Body = str_replace($src_orig, "cid:" . $images_embeded[$f], $this->Body);
$this->Body = str_replace($src_orig, 'cid:' . $images_embeded[$f], $this->Body);
$src_found[$src_orig] = $f;
}
}
@ -427,17 +443,17 @@ class FacteurMail extends PHPMailer {
* @param string $mode
* @return string
*/
protected function safeUtf8Decode($text, $mode = 'texte_brut'){
if (!is_utf8($text)){
protected function safeUtf8Decode($text, $mode = 'texte_brut') {
if (!is_utf8($text)) {
return ($text);
}
if (function_exists('iconv') && $mode=='texte_brut'){
if (function_exists('iconv') && $mode == 'texte_brut') {
$text = str_replace('’', "'", $text);
$text = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text);
$text = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $text);
return str_replace('&#8217;', "'", $text);
} else {
if ($mode=='texte_brut'){
if ($mode == 'texte_brut') {
$text = str_replace('’', "'", $text);
}
$text = unicode2charset(utf_8_to_unicode($text), 'iso-8859-1');
@ -448,7 +464,7 @@ class FacteurMail extends PHPMailer {
/**
* Convertir tout le mail utf en isotruc
*/
protected function convertMessageFromUtf8ToIso8859(){
protected function convertMessageFromUtf8ToIso8859() {
$this->CharSet = 'iso-8859-1';
$this->Body = str_ireplace('charset=utf-8', 'charset=iso-8859-1', $this->Body);
$this->Body = $this->safeUtf8Decode($this->Body, 'html');
@ -462,15 +478,16 @@ class FacteurMail extends PHPMailer {
* @throws Exception
*/
protected function forceFromIfNeeded() {
if ($this->ForceFrom
AND $this->From!==$this->ForceFrom){
if (
$this->ForceFrom
and $this->From !== $this->ForceFrom
) {
$forcedomain = explode('@', $this->ForceFrom);
$forcedomain = end($forcedomain);
$domain = explode('@', $this->From);
$domain = end($domain);
if ($domain!==$forcedomain){
if ($domain !== $forcedomain) {
// le From passe en ReplyTo
$this->AddReplyTo($this->From, $this->FromName);
// on force le From
@ -483,12 +500,12 @@ class FacteurMail extends PHPMailer {
/**
* Clear all recipients
*/
public function clearAllRecipients(){
public function clearAllRecipients() {
parent::clearAllRecipients();
if (!empty($this->autoCc)) {
$this->AddCC($this->autoCc);
}
if (!empty($this->autoBcc)){
if (!empty($this->autoBcc)) {
$this->AddBCC($this->autoBcc);
}
}
@ -502,7 +519,7 @@ class FacteurMail extends PHPMailer {
protected function sendAlertIfNeeded($res) {
if ($res === false) {
if ($this->important and !empty($this->sendFailFunction)) {
$facteur_envoyer_alerte_fail = charger_fonction('facteur_envoyer_alerte_fail','inc');
$facteur_envoyer_alerte_fail = charger_fonction('facteur_envoyer_alerte_fail', 'inc');
$facteur_envoyer_alerte_fail($this->sendFailFunction['function'], $this->sendFailFunction['args'], $this->sendFailFunction['include']);
}
}
@ -517,22 +534,22 @@ class FacteurMail extends PHPMailer {
* @return bool
* @throws phpmailerException
*/
protected function callWrapper($function, $args){
protected function callWrapper($function, $args) {
$exceptions = $this->exceptions;
$this->exceptions = true;
try {
$retour = call_user_func_array($function, $args);
$this->exceptions = $exceptions;
} catch (Exception $exc) {
$this->log((is_array($function) ? implode('::', $function) : $function) . "() : " . $exc->getMessage(), _LOG_ERREUR);
$this->log((is_array($function) ? implode('::', $function) : $function) . '() : ' . $exc->getMessage(), _LOG_ERREUR);
$this->exceptions = $exceptions;
if ($this->exceptions){
if ($this->exceptions) {
throw $exc;
}
return false;
}
if ($this->ErrorInfo){
$this->log((is_array($function) ? implode('::', $function) : $function) . "() : " . $this->ErrorInfo, _LOG_ERREUR);
if ($this->ErrorInfo) {
$this->log((is_array($function) ? implode('::', $function) : $function) . '() : ' . $this->ErrorInfo, _LOG_ERREUR);
}
return $retour;
@ -548,33 +565,33 @@ class FacteurMail extends PHPMailer {
* @return bool
* @throws Exception
*/
public function Send(){
public function Send() {
$this->forceFromIfNeeded();
if ($this->convertMessageToIso8859){
if ($this->convertMessageToIso8859) {
$this->convertMessageFromUtf8ToIso8859();
}
$args = func_get_args();
$res = $this->callWrapper(array('parent', 'Send'), $args);
$res = $this->callWrapper(['parent', 'Send'], $args);
return $this->sendAlertIfNeeded($res);
}
public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment'){
public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment') {
$args = func_get_args();
return $this->callWrapper(array('parent', 'AddAttachment'), $args);
return $this->callWrapper(['parent', 'AddAttachment'], $args);
}
public function AddReplyTo($address, $name = ''){
public function AddReplyTo($address, $name = '') {
$args = func_get_args();
return $this->callWrapper(array('parent', 'AddReplyTo'), $args);
return $this->callWrapper(['parent', 'AddReplyTo'], $args);
}
public function AddBCC($address, $name = ''){
public function AddBCC($address, $name = '') {
$args = func_get_args();
return $this->callWrapper(array('parent', 'AddBCC'), $args);
return $this->callWrapper(['parent', 'AddBCC'], $args);
}
public function AddCC($address, $name = ''){
public function AddCC($address, $name = '') {
$args = func_get_args();
return $this->callWrapper(array('parent', 'AddCC'), $args);
return $this->callWrapper(['parent', 'AddCC'], $args);
}
}

32
inc/Facteur/FacteurSMTP.php

@ -1,4 +1,5 @@
<?php
/**
* Plugin Facteur 4
* (c) 2009-2019 Collectif SPIP
@ -12,55 +13,56 @@ namespace SPIP\Facteur;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
if (!defined("_ECRIRE_INC_VERSION")){
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/Facteur/FacteurMail');
class FacteurSMTP extends FacteurMail {
/**
* Facteur constructor.
* @param array $options
* @throws Exception
*/
public function __construct($options = array()){
public function __construct($options = []) {
parent::__construct($options);
// il faut quand meme avoir un host et un port, sinon on reste sur le mailer par defaut
if (!empty($options['smtp_host']) and !empty($options['smtp_port'])){
if (!empty($options['smtp_host']) and !empty($options['smtp_port'])) {
$this->Mailer = 'smtp';
$this->Host = $options['smtp_host'];
$this->Port = $options['smtp_port'];
// SMTP authentifié ?
$this->SMTPAuth = false;
if (isset($options['smtp_auth'])
and ($options['smtp_auth']==='oui' or $options['smtp_auth']===true)
if (
isset($options['smtp_auth'])
and ($options['smtp_auth'] === 'oui' or $options['smtp_auth'] === true)
and !empty($options['smtp_username'])
and !empty($options['smtp_password'])){
and !empty($options['smtp_password'])
) {
$this->SMTPAuth = true;
$this->Username = $options['smtp_username'];
$this->Password = $options['smtp_password'];
}
if (!empty($options['smtp_secure'])
and in_array($options['smtp_secure'], ['ssl', 'tls'])){
if (
!empty($options['smtp_secure'])
and in_array($options['smtp_secure'], ['ssl', 'tls'])
) {
$this->SMTPSecure = $options['smtp_secure'];
}
if ($options['smtp_tls_allow_self_signed']=='oui'){
$this->SMTPOptions = array(
'ssl' => array('allow_self_signed' => true)
);
if ($options['smtp_tls_allow_self_signed'] == 'oui') {
$this->SMTPOptions = [
'ssl' => ['allow_self_signed' => true]
];
}
// Pour le moment on remet l'ancien fonctionnement :
// on ne doit pas tester les certificats si pas demandé explicitement avec l'option TLS !
$this->SMTPAutoTLS = false;
}
}
}

195
inc/envoyer_mail.php

@ -1,4 +1,5 @@
<?php
/**
* Plugin Facteur 4
* (c) 2009-2019 Collectif SPIP
@ -7,17 +8,18 @@
* @package SPIP\Facteur\Inc\Envoyer_mails
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
if (!defined('_ECRIRE_INC_VERSION')) { return;
}
if (!defined('_LOG_FACTEUR')) {
define('_LOG_FACTEUR',_LOG_INFO);
define('_LOG_FACTEUR', _LOG_INFO);
}
if (!defined('_EMAIL_AUTO_CONVERT_TEXT_TO_HTML')) {
define('_EMAIL_AUTO_CONVERT_TEXT_TO_HTML', true);
}
// inclure le fichier natif de SPIP, pour les fonctions annexes
include_once _DIR_RESTREINT."inc/envoyer_mail.php";
include_once _DIR_RESTREINT . 'inc/envoyer_mail.php';
/**
* Extraire automatiquement le sujet d'un message si besoin
@ -28,11 +30,11 @@ include_once _DIR_RESTREINT."inc/envoyer_mail.php";
function facteur_extraire_sujet($message_html, $message_texte = '') {
if (strlen($message_html = trim($message_html))) {
// dans ce cas on ruse un peu : extraire le sujet du title
if (preg_match(",<title>(.*)</title>,Uims",$message_html,$m))
if (preg_match(',<title>(.*)</title>,Uims', $message_html, $m)) {
return ($sujet = $m[1]);
else {
} else {
// fallback, on prend le body si on le trouve
if (preg_match(",<body[^>]*>(.*)</body>,Uims", $message_html, $m)){
if (preg_match(',<body[^>]*>(.*)</body>,Uims', $message_html, $m)) {
$message_html = $m[1];
}
// et on le nettoie/decoupe comme du texte
@ -59,7 +61,7 @@ function facteur_extraire_sujet($message_html, $message_texte = '') {
/**
* @param array|string $destinataire
* si array : un tableau de mails
si string : un mail ou une liste de mails séparés par des virgules
si string : un mail ou une liste de mails séparés par des virgules
* @param string $sujet
* @param string|array $message
* au format string, c'est un corps d'email au format texte, comme supporte nativement par le core
@ -89,30 +91,30 @@ function facteur_extraire_sujet($message_html, $message_texte = '') {
* @return bool
* @throws Exception
*/
function inc_envoyer_mail($destinataire, $sujet, $message, $from = "", $headers = "") {
function inc_envoyer_mail($destinataire, $sujet, $message, $from = '', $headers = '') {
$message_html = '';
$message_texte = '';
$nom_envoyeur = $cc = $bcc = $repondre_a = '';
$pieces_jointes = array();
$pieces_jointes = [];
$important = false;
// si $message est un tableau -> fonctionnalites etendues
// avec entrees possible : html, texte, pieces_jointes, nom_envoyeur, ...
if (is_array($message)) {
// si on fournit un $message['html'] deliberemment vide, c'est qu'on n'en veut pas, et donc on restera au format texte
$message_html = isset($message['html']) ? ($message['html'] ? $message['html'] : ' ') : "";
$message_texte = isset($message['texte']) ? nettoyer_caracteres_mail($message['texte']) : "";
$pieces_jointes = isset($message['pieces_jointes']) ? $message['pieces_jointes'] : array();
$nom_envoyeur = isset($message['nom_envoyeur']) ? $message['nom_envoyeur'] : "";
$from = isset($message['from']) ? $message['from']: $from;
$cc = isset($message['cc']) ? $message['cc'] : "";
$bcc = isset($message['bcc']) ? $message['bcc'] : "";
$repondre_a = isset($message['repondre_a']) ? $message['repondre_a'] : "";
$message_html = isset($message['html']) ? ($message['html'] ? $message['html'] : ' ') : '';
$message_texte = isset($message['texte']) ? nettoyer_caracteres_mail($message['texte']) : '';
$pieces_jointes = isset($message['pieces_jointes']) ? $message['pieces_jointes'] : [];
$nom_envoyeur = isset($message['nom_envoyeur']) ? $message['nom_envoyeur'] : '';
$from = isset($message['from']) ? $message['from'] : $from;
$cc = isset($message['cc']) ? $message['cc'] : '';
$bcc = isset($message['bcc']) ? $message['bcc'] : '';
$repondre_a = isset($message['repondre_a']) ? $message['repondre_a'] : '';
$nom_repondre_a = isset($message['nom_repondre_a']) ? $message['nom_repondre_a'] : '';
$adresse_erreur = isset($message['adresse_erreur']) ? $message['adresse_erreur'] : "";
$adresse_erreur = isset($message['adresse_erreur']) ? $message['adresse_erreur'] : '';
$headers = isset($message['headers']) ? $message['headers'] : $headers;
if (is_string($headers)){
$headers = array_map('trim',explode("\n",$headers));
if (is_string($headers)) {
$headers = array_map('trim', explode("\n", $headers));
$headers = array_filter($headers);
}
$important = (isset($message['important']) ? !!$message['important'] : $important);
@ -120,29 +122,30 @@ function inc_envoyer_mail($destinataire, $sujet, $message, $from = "", $headers
// si $message est une chaine -> compat avec la fonction native SPIP
// gerer le cas ou le corps est du html avec un Content-Type: text/html dans les headers
else {
if (preg_match(',Content-Type:\s*text/html,ims',$headers)){
if (preg_match(',Content-Type:\s*text/html,ims', $headers)) {
$message_html = $message;
}
else {
// Autodetection : tester si le mail est en HTML
if (strpos($headers,"Content-Type:")===false
AND strpos($message,"<")!==false // eviter les tests suivants si possible
AND $ttrim = trim($message)
AND substr($ttrim,0,1)=="<"
AND substr($ttrim,-1,1)==">"
AND stripos($ttrim,"</html>")!==false){
if (
strpos($headers, 'Content-Type:') === false
and strpos($message, '<') !== false // eviter les tests suivants si possible
and $ttrim = trim($message)
and substr($ttrim, 0, 1) == '<'
and substr($ttrim, -1, 1) == '>'
and stripos($ttrim, '</html>') !== false
) {
$message_html = $message;
}
// c'est vraiment un message texte
else
$message_texte = nettoyer_caracteres_mail($message);
else { $message_texte = nettoyer_caracteres_mail($message);
}
}
$headers = array_map('trim',explode("\n",$headers));
$headers = array_map('trim', explode("\n", $headers));
$headers = array_filter($headers);
}
if(!strlen($sujet)){
if (!strlen($sujet)) {
$sujet = facteur_extraire_sujet($message_html, $message_texte);
}
@ -150,32 +153,32 @@ function inc_envoyer_mail($destinataire, $sujet, $message, $from = "", $headers
// si le mail est en texte brut, on l'encapsule dans un modele surchargeable
// pour garder le texte brut, il suffit de faire un modele qui renvoie uniquement #ENV*{texte}
if ($message_texte AND ! $message_html AND _EMAIL_AUTO_CONVERT_TEXT_TO_HTML){
$message_html = recuperer_fond("emails/texte",array('texte'=>$message_texte,'sujet'=>$sujet));
if ($message_texte and ! $message_html and _EMAIL_AUTO_CONVERT_TEXT_TO_HTML) {
$message_html = recuperer_fond('emails/texte', ['texte' => $message_texte,'sujet' => $sujet]);
}
$message_html = trim($message_html);
// si le mail est en HTML sans alternative, la generer
if ($message_html AND !$message_texte){
if ($message_html and !$message_texte) {
$message_texte = facteur_mail_html2text($message_html);
}
$exceptions = false;
if (is_array($message) AND isset($message['exceptions'])){
if (is_array($message) and isset($message['exceptions'])) {
$exceptions = $message['exceptions'];
}
// mode TEST : forcer l'email
if (defined('_TEST_EMAIL_DEST')) {
if (!_TEST_EMAIL_DEST){
spip_log($e=_T('facteur:erreur_envoi_bloque_constante'), 'mail.' . _LOG_ERREUR);
if (!_TEST_EMAIL_DEST) {
spip_log($e = _T('facteur:erreur_envoi_bloque_constante'), 'mail.' . _LOG_ERREUR);
if ($exceptions) {
throw new Exception($e);
}
return false;
}
else
$destinataire = _TEST_EMAIL_DEST;
else { $destinataire = _TEST_EMAIL_DEST;
}
}
// plusieurs destinataires peuvent etre fournis separes par des virgules
@ -184,17 +187,19 @@ function inc_envoyer_mail($destinataire, $sujet, $message, $from = "", $headers
// mais ne pas casser si on a deja un array en entree
// si pas destinataire du courriel on renvoie false (eviter les warning PHP : ligne 464 de phpmailer-php5/class.phpmailer.php
// suppression des adresses de courriels invalides, si aucune valide, renvoyer false (eviter un warning PHP : ligne 464 de phpmailer-php5/class.phpmailer.php)
if (is_array($destinataire))
$destinataire = implode(", ",$destinataire);
if (is_array($destinataire)) {
$destinataire = implode(', ', $destinataire);
}
if(strlen($destinataire) > 0){
$destinataire = array_map('trim',explode(",",$destinataire));
if (strlen($destinataire) > 0) {
$destinataire = array_map('trim', explode(',', $destinataire));
foreach ($destinataire as $key => $value) {
if(!email_valide($value))
if (!email_valide($value)) {
unset($destinataire[$key]);
}
}
if(count($destinataire) == 0) {
spip_log($e="Aucune adresse email de destination valable pour l'envoi du courriel.", 'mail.' . _LOG_ERREUR);
if (count($destinataire) == 0) {
spip_log($e = "Aucune adresse email de destination valable pour l'envoi du courriel.", 'mail.' . _LOG_ERREUR);
if ($exceptions) {
throw new Exception($e);
}
@ -206,7 +211,7 @@ function inc_envoyer_mail($destinataire, $sujet, $message, $from = "", $headers
// On peut envoyer de mail que en bcc
$destinataire = '';
} else {
spip_log($e="Aucune adresse email de destination valable pour l'envoi du courriel.", 'mail.' . _LOG_ERREUR);
spip_log($e = "Aucune adresse email de destination valable pour l'envoi du courriel.", 'mail.' . _LOG_ERREUR);
if ($exceptions) {
throw new Exception($e);
}
@ -215,8 +220,8 @@ function inc_envoyer_mail($destinataire, $sujet, $message, $from = "", $headers
}
// On crée l'objet Facteur (PHPMailer) pour le manipuler ensuite
$options = array();
if ($exceptions){
$options = [];
if ($exceptions) {
$options['exceptions'] = $exceptions;
}
include_spip('inc/facteur');
@ -227,23 +232,23 @@ function inc_envoyer_mail($destinataire, $sujet, $message, $from = "", $headers
$facteur->setMessage($message_html, $message_texte);
// On ajoute le courriel de l'envoyeur s'il est fournit par la fonction
if (empty($from) AND empty($facteur->From)) {
$from = $GLOBALS['meta']["email_envoi"];
if (empty($from) OR !email_valide($from)) {
spip_log("Meta email_envoi invalide. Le mail sera probablement vu comme spam.", 'mail.' . _LOG_ERREUR);
if(is_array($destinataire) && count($destinataire) > 0)
if (empty($from) and empty($facteur->From)) {
$from = $GLOBALS['meta']['email_envoi'];
if (empty($from) or !email_valide($from)) {
spip_log('Meta email_envoi invalide. Le mail sera probablement vu comme spam.', 'mail.' . _LOG_ERREUR);
if (is_array($destinataire) && count($destinataire) > 0) {
$from = $destinataire[0];
else
$from = $destinataire;
} else { $from = $destinataire;
}
}
}
// "Marie Toto <Marie@toto.com>"
if (preg_match(",^([^<>\"]*)<([^<>\"]+)>$,i",$from,$m)){
if (preg_match(',^([^<>"]*)<([^<>"]+)>$,i', $from, $m)) {
$nom_envoyeur = trim($m[1]);
$from = trim($m[2]);
}
if (!empty($from)){
if (!empty($from)) {
$facteur->From = $from;
// la valeur par défaut de la config n'est probablement pas valable pour ce mail,
// on l'écrase pour cet envoi
@ -251,31 +256,33 @@ function inc_envoyer_mail($destinataire, $sujet, $message, $from = "", $headers
}
// On ajoute le nom de l'envoyeur s'il fait partie des options
if ($nom_envoyeur){
if ($nom_envoyeur) {
$facteur->FromName = $nom_envoyeur;
}
// Si plusieurs emails dans le from, pas de Name !
if (strpos($facteur->From,",")!==false){
$facteur->FromName = "";
if (strpos($facteur->From, ',') !== false) {
$facteur->FromName = '';
}
// S'il y a des copies à envoyer
if ($cc){
if (is_array($cc))
foreach ($cc as $courriel)
if ($cc) {
if (is_array($cc)) {
foreach ($cc as $courriel) {
$facteur->AddCC($courriel);
else
$facteur->AddCC($cc);
}
} else { $facteur->AddCC($cc);
}
}
// S'il y a des copies cachées à envoyer
if ($bcc){
if (is_array($bcc))
foreach ($bcc as $courriel)
if ($bcc) {
if (is_array($bcc)) {
foreach ($bcc as $courriel) {
$facteur->AddBCC($courriel);
else
$facteur->AddBCC($bcc);
}
} else { $facteur->AddBCC($bcc);
}
}
// S'il y a une adresse de reply-to
@ -301,20 +308,21 @@ function inc_envoyer_mail($destinataire, $sujet, $message, $from = "", $headers
if (!empty($piece['chemin']) and file_exists($piece['chemin'])) {
$facteur->AddAttachment(
$piece['chemin'],
isset($piece['nom']) ? $piece['nom']:'',
(isset($piece['encodage']) AND in_array($piece['encodage'],array('base64', '7bit', '8bit', 'binary', 'quoted-printable'))) ? $piece['encodage']:'base64',
isset($piece['mime']) ? $piece['mime']:Facteur::_mime_types(pathinfo($piece['chemin'], PATHINFO_EXTENSION))
isset($piece['nom']) ? $piece['nom'] : '',
(isset($piece['encodage']) and in_array($piece['encodage'], ['base64', '7bit', '8bit', 'binary', 'quoted-printable'])) ? $piece['encodage'] : 'base64',
isset($piece['mime']) ? $piece['mime'] : Facteur::_mime_types(pathinfo($piece['chemin'], PATHINFO_EXTENSION))
);
}
else {
spip_log("Piece jointe manquante ignoree : ".json_encode($piece),'facteur' . _LOG_ERREUR);
spip_log('Piece jointe manquante ignoree : ' . json_encode($piece), 'facteur' . _LOG_ERREUR);
}
}
}
// Si une adresse email a été spécifiée pour les retours en erreur, on l'ajoute
if (!empty($adresse_erreur))
if (!empty($adresse_erreur)) {
$facteur->Sender = $adresse_erreur;
}
if ($important) {
$facteur->setImportant();
@ -325,12 +333,15 @@ function inc_envoyer_mail($destinataire, $sujet, $message, $from = "", $headers
// et qu'on envoie en meme temps un header Cc: xxx, yyy
// on aura 2 lignes Cc: dans les headers
if (!empty($headers)) {
foreach($headers as $h){
foreach ($headers as $h) {
// verifions le format correct : il faut au moins un ":" dans le header
// et on filtre le Content-Type: qui sera de toute facon fourni par facteur
if (strpos($h,":")!==false
AND strncmp($h,"Content-Type:",13)!==0)
if (
strpos($h, ':') !== false
and strncmp($h, 'Content-Type:', 13) !== 0
) {
$facteur->AddCustomHeader($h);
}
}
}
@ -340,21 +351,21 @@ function inc_envoyer_mail($destinataire, $sujet, $message, $from = "", $headers
// Et c'est parti on envoie enfin
$backtrace = facteur_backtrace();
$trace = $facteur->getMessageLog();
spip_log("mail via facteur\n$trace",'mail'._LOG_FACTEUR);
spip_log("mail\n$backtrace\n$trace",'facteur'._LOG_FACTEUR);
spip_log("mail via facteur\n$trace", 'mail' . _LOG_FACTEUR);
spip_log("mail\n$backtrace\n$trace", 'facteur' . _LOG_FACTEUR);
// si c'est un mail important, preparer le forward a envoyer en cas d'echec
// mais on delegue la gestion de cet envoi au facteur qui est le seul a savoir quoi faire
// en fonction de la reponse et du modus operandi pour connaitre le status du message
if ($important and $dest_alertes = $facteur->Sender) {
$dest = (is_array($destinataire) ? implode(', ', $destinataire) : $destinataire);
$sujet_alerte = _T('facteur:sujet_alerte_mail_fail', array('dest' => $dest, 'sujet' => $sujet));
$sujet_alerte = _T('facteur:sujet_alerte_mail_fail', ['dest' => $dest, 'sujet' => $sujet]);
$args = func_get_args();
$args[0] = $dest_alertes;
$args[1] = $sujet_alerte;
$args[2]['important'] = false; // ne pas faire une alerte sur l'envoi de l'alerte etc.
if (!empty($args[2]['pieces_jointes'])) {
foreach ($args[2]['pieces_jointes'] as $k=>$pj) {
foreach ($args[2]['pieces_jointes'] as $k => $pj) {
// passer les chemins en absolus car on sait pas si l'alerte sera lancee depuis le meme cote racine/ecrire
$args[2]['pieces_jointes'][$k]['chemin'] = realpath($pj['chemin']);
}
@ -364,8 +375,8 @@ function inc_envoyer_mail($destinataire, $sujet, $message, $from = "", $headers
$retour = $facteur->Send();
if (!$retour){
spip_log("Erreur Envoi mail via Facteur : ".print_r($facteur->ErrorInfo,true),'mail'._LOG_ERREUR);
if (!$retour) {
spip_log('Erreur Envoi mail via Facteur : ' . print_r($facteur->ErrorInfo, true), 'mail' . _LOG_ERREUR);
// si le mail est important, c'est le facteur qui aura gere l'envoi de l'alerte fail
}
@ -380,23 +391,23 @@ function inc_envoyer_mail($destinataire, $sujet, $message, $from = "", $headers
* @return array|string
* pile d'appel
**/
function facteur_backtrace($limit=10) {
function facteur_backtrace($limit = 10) {
$trace = debug_backtrace();
$caller = array_shift($trace);
while (count($trace) and (empty($trace[0]['file']) or $trace[0]['file'] === $caller['file'] or $trace[0]['file'] === __FILE__)) {
array_shift($trace);
}
$message = count($trace) ? $trace[0]['file'] . " L" . $trace[0]['line'] : "";
$f = array();
while (count($trace) and $t = array_shift($trace) and count($f)<$limit) {
if (in_array($t['function'], array('include_once', 'include_spip', 'find_in_path'))) {
$message = count($trace) ? $trace[0]['file'] . ' L' . $trace[0]['line'] : '';
$f = [];
while (count($trace) and $t = array_shift($trace) and count($f) < $limit) {
if (in_array($t['function'], ['include_once', 'include_spip', 'find_in_path'])) {
break;
}
$f[] = $t['function'];
}
if (count($f)) {
$message .= " [" . implode("(),", $f) . "()]";
$message .= ' [' . implode('(),', $f) . '()]';
}
return $message;

51
inc/facteur.php

@ -1,4 +1,5 @@
<?php
/**
* Plugin Facteur 4
* (c) 2009-2019 Collectif SPIP
@ -15,19 +16,21 @@
* @throws \PHPMailer\PHPMailer\Exception
* @api
*/
function facteur_factory($options = array()) {
function facteur_factory($options = []) {
if (!is_array($options)) {
$options = array();
$options = [];
}
$options = facteur_config($options);
$config_mailer = $options['mailer'];
$methodes = facteur_lister_methodes_mailer();
if (!empty($methodes[$config_mailer]['class'])
and $FacteurClass = $methodes[$config_mailer]['class']
and include_spip("inc/Facteur/$FacteurClass")
and class_exists($FacteurClass = "SPIP\\Facteur\\{$FacteurClass}")){
if (
!empty($methodes[$config_mailer]['class'])
and $FacteurClass = $methodes[$config_mailer]['class']
and include_spip("inc/Facteur/$FacteurClass")
and class_exists($FacteurClass = "SPIP\\Facteur\\{$FacteurClass}")
) {
return new $FacteurClass($options);
}
else {
@ -45,24 +48,24 @@ function facteur_factory($options = array()) {
*/
function facteur_lister_methodes_mailer() {
$methodes = array(
'mail' => array(
$methodes = [
'mail' => [
'class' => 'FacteurMail',
'password' => array(),
),
'smtp' => array(
'password' => [],
],
'smtp' => [
'class' => 'FacteurSMTP',
'password' => array('smtp_password'),
),
);
'password' => ['smtp_password'],
],
];
// permettre l'extension via un pipeline
$methodes = pipeline(
'facteur_lister_methodes_mailer',
array(
'args' => array(),
[
'args' => [],
'data' => $methodes
)
]
);
return $methodes;
@ -76,7 +79,7 @@ function facteur_lister_methodes_mailer() {
* @param array $options
* @return array
*/
function facteur_config($options = array()) {
function facteur_config($options = []) {
if (!function_exists('lire_config')) {
include_spip('inc/config');
}
@ -96,10 +99,10 @@ function facteur_config($options = array()) {
$config = array_merge($config, facteur_config_envoyeur_par_defaut());
}
$config['adresses_site'] = array(
$config['adresses_site'] = [
$GLOBALS['meta']['adresse_site'] . '/',
url_de_base(),
);
];
// et on emule la globale facteur_smtp pour les plugins qui s'appuient dessus comme mailshot
// @deprecated : ne devrait plus servir
@ -113,13 +116,13 @@ function facteur_config($options = array()) {
* @return array
*/
function facteur_config_envoyeur_par_defaut() {
$config = array(
$config = [
'adresse_envoi_email' => '',
'adresse_envoi_nom' => '',
);
];
$config['adresse_envoi_email'] = (isset($GLOBALS['meta']["email_envoi"]) AND $GLOBALS['meta']["email_envoi"]) ?
$GLOBALS['meta']["email_envoi"]
$config['adresse_envoi_email'] = (isset($GLOBALS['meta']['email_envoi']) and $GLOBALS['meta']['email_envoi']) ?
$GLOBALS['meta']['email_envoi']
: $GLOBALS['meta']['email_webmaster'];
if (!function_exists('extraire_multi')) {