gamuMail/inc/envoyer_gamumail.php

310 lines
9.7 KiB
PHP

<?php
if (!defined('_ECRIRE_INC_VERSION')){
return;
}
/*
* fonction pour préparer et envoyer un mail basé sur un slug gamumail
*
* @param string $slug
* @param string|array $destinataires = adresses mails et id_auteur séparées par , ou en array
* si un des destinataire est au format numérique, on considère que c'est un id_auteur et on va choper son mail dans spip_auteurs
* @param array $options :
* $options['debug' => true] pour afficher le $corps final sans envoyer le mail
* $options['cci' => true] pour passer les destinataires en cci si il y en a plus qu'un
* $options['dest_cci' => 'toto@truc.tld'] le destinataire (to) si $options['cci'] === true
* (sinon c'est le compte expéditeur du site)
* $options['pdfs' => [ 0 => [...], 1 => [...] ] array des fichiers PDF générés à attacher dont les éléments peuvent être :
* - soit un nom de squelette PDF
* - soit un array avec 3 éléments (seul le 1er est obligatoire):
* [ 'fichier' => 'squelette_PDF',
* 'contexte' => ['parametre_url_1' => 'valeur_1', 'parametre_url_2' => 'valeur_2', ...]
* 'nom' => 'nom_fichier_attache' ]
* $options['pieces_jointes'][] = [
* 'chemin' => 'tmp/cache/toto.xls',
* 'nom' => 'toto.xls',
* 'encodage' => 'base64',
* 'mime' => 'application/vnd.ms-excel'
* ]
* ]
* $options['args' => ['param_1' => 'valeur_1, 'param_2' => 'valeur_2', ...]]
* @param Array $Tid_doc_piece_jointe => Array id_doc a ajouter comme piece jointe
*
*/
function inc_envoyer_gamumail($slug, $destinataires, $options = [], $Tid_doc_piece_jointe = []) {
//var_dump($options) ;die;
//var_dump($destinataires);
include_spip('inc/texte');
include_spip('classes/facteur');
$retour = array();
// blocage de l'envoi pour le pseudo-slug "no_gamumail"
if ($slug === 'no_gamumail') {
$retour['message_ok'] = _T('gamumail:message_no_gamumail');
spip_log("Pas d'envoi de mail pour cause de slug no_gamumail","gamumail");
return $retour;
}
// sécu
if (preg_match('/[^a-zA-Z0-9_\-]/', $slug)) {
$retour['message_erreur'] = _T("gamumail:erreur_format_slug");
return $retour;
}
// langue (par défaut langue du site)
$lang = !empty($options['lang']) ? $options['lang'] : lire_config('langue_site', 'fr');
$id_docs = '';
if ($slug === 'no_slug' && array_key_exists('message', $options)) {
$html = $options['message'];
if (array_key_exists('sujet', $options)) {
$sujet = $options['sujet'];
} else {
$sujet = array_shift($html);
}
} else {
// contenus du slug
$res = sql_fetsel('*', 'spip_gamumails', 'slug = "'.$slug.'"');
if ($res) {
$sujet = extraire_multi($res['sujet'], $lang);
$html = propre($res['texte']);
$id_docs = $res['id_docs'];
}
else {
$retour['message_erreur'] = _T("gamumail:pas_de_slug");
return $retour;
}
}
// destinataires (id_auteur ou mails) => $pour[] est un array avec les adresses mails valides
if (!is_array($destinataires)) {
$destinataires = explode(',', $destinataires);
}
$pour = array();
foreach ($destinataires as $dest) {
if (is_numeric($dest)) {
if ($mail = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.$dest)) {
$pour[] = $mail;
}
}
elseif (email_valide($dest)) {
$pour[] = $dest;
}
}
$non_vide = function ($elem) {
return ($elem != NULL AND $elem != '');
};
$cc = array_filter(explode(',', (lire_config('gamumail/mail_cc') ?? '')), $non_vide);
$cci = array_filter(explode(',', (lire_config('gamumail/mail_cci') ?? '')), $non_vide);
// si on a plusieurs destinataires et $options['cci' => true] les passer en cci et mettre le compte expéditeur du site en to
if (count($pour) > 1 AND isset($options['cci']) AND $options['cci']) {
$cci = array_unique(array_merge($cci, $pour));
if (isset($options['dest_cci']) and email_valide($options['dest_cci'])) {
$pour = [$options['dest_cci']];
} else {
$pour = [lire_config('facteur/adresse_envoi_email',lire_config('email_webmaster'))];
}
}
// documents joints
$pieces_jointes = [];
// filtrage des id_docs attachés au slug (ici on ne veut que des id_docs valides)
$Tid_doc = [];
$id_docs = array_filter(explode(',', $id_docs), 'is_numeric');
foreach ($id_docs as $doc) {
if ($res = sql_getfetsel('id_document', 'spip_documents', 'id_document='.$doc)) {
$Tid_doc[] = $doc;
}
}
$Tid_doc = array_merge($Tid_doc, $Tid_doc_piece_jointe);
// récup des paramètres des docs à attacher
if (!empty($Tid_doc)) {
foreach ($Tid_doc as $id_document) {
$protected = '';
$Tdocument = sql_fetsel('*','spip_documents','id_document='.intval($id_document));
if (
array_key_exists('protected', $Tdocument)
and $Tdocument['protected'] === 'oui'
) {
$protected = 'PROTECTED/';
}
$destination = _DIR_IMG.$protected.$Tdocument['fichier'];
$extension = $Tdocument['extension'];
if ($Tdocument['titre']) {
$nom_fichier = $Tdocument['titre'] .".".$extension;
}
else {
$nom_fichier = basename($Tdocument['fichier']);
}
include_spip('bigup_fonctions');
$type_mime = bigup_get_mime_type_extension($extension);
$pieces_jointes[] = [
'chemin' => $destination,
'nom' => $nom_fichier,
'encodage' => 'base64',
'mime' => $type_mime
];
}
}
// les docs attachés
if (isset($options['pieces_jointes'])) {
if (is_array($options['pieces_jointes'])) {
foreach ($options['pieces_jointes'] as $Tpj) {
$pieces_jointes[] = $Tpj;
}
}
}
// les pdfs
$Tpdf_dell = [];
if (isset($options['pdfs'])) {
$Tpdfs = $options['pdfs'];
if (!is_array($Tpdfs)) {
$Tpdfs = explode(',', $Tpdfs);
}
$Tpdfs = array_filter($Tpdfs, function($p) {
return $p != '';
});
// approximation pour passage dans les fonctions traiter_av_pdf() :
// si plusieurs destinataires dans $pour[], on utilise le premier comme 2ème arg ($auteur)
if ($f = charger_fonction('traiter_av_pdf', 'gamumail', true)) {
$options = $f($options, $pour[0], [], $Tpdfs);
}
if ($f = charger_fonction($slug . '_traiter_av_pdf', 'gamumail', true)) {
$options = $f($options, $pour[0], [], $Tpdfs);
}
if (!empty($Tpdfs) and is_array($Tpdfs)) {
foreach ($Tpdfs as $pdf) {
if (!is_array($pdf)) {
$sq_pdf = $pdf;
$contexte = [];
$nom = $pdf;
}
elseif (array_key_exists('fichier', $pdf)) {
$sq_pdf = $pdf['fichier'];
$contexte = array_key_exists('contexte', $pdf) ? $pdf['contexte'] : [];
$nom = array_key_exists('nom', $pdf) ? $pdf['nom'] : $pdf;
}
else break;
}
$recup_pdf = charger_fonction('charger_pdf','inc');
$pdf = $recup_pdf($sq_pdf, $contexte);
$nom_fichier = $nom.'.pdf';
$destination = _DIR_TMP.basename($nom_fichier);
$Tpdf_dell[] = $destination;
file_put_contents($destination,$pdf);
$pieces_jointes[] = [
'chemin' => $destination,
'nom' => $nom_fichier,
'encodage' => 'base64',
'mime' => 'application/pdf'
];
}
}
$html_header = '';
if (find_in_path('gamumail/'.$slug .'_html_header.html')) {
$html_header = recuperer_fond('gamumail/'.$slug . '_html_header', $options);
}
elseif(find_in_path('gamumail/html_header.html')) {
$html_header = recuperer_fond('gamumail/html_header', $options);
}
$html_footer = '';
if (find_in_path('gamumail/'.$slug . '_html_footer.html')) {
$html_footer = recuperer_fond('gamumail/'.$slug . '_html_footer', $options);
}
elseif (find_in_path('gamumail/html_footer.html')) {
$html_footer = recuperer_fond('gamumail/html_footer', $options);
}
$html = $html_header . $html . $html_footer;
// pipeline pour les remplacements du contenu des slugs spécifiques de chaque plugins
$args = $options;
$args['slug'] = $slug;
$args['destinataires'] = $pour;
$html = pipeline('remplacements_slug', [
'args' => $args,
'data' => $html
]);
$sujet = pipeline('remplacements_slug',[
'args' => $args,
'data' => $sujet
]);
// traitement des remplacements génériques fournis par Gamumail
$remplacement_generiques = charger_fonction('gamumail_remplacements', 'inc');
$html = $remplacement_generiques($args, $html);
$sujet = $remplacement_generiques($args, $sujet);
// traduction des <multi> intégrés par les remplacements
$html = extraire_multi($html, $lang);
$sujet = extraire_multi($sujet, $lang);
include_spip('facteur_fonctions');
$texte = facteur_mail_html2text($html);
$corps = [
'html' => $html,
'texte' => $texte,
'cc' => $cc,
'bcc' => $cci,
'pieces_jointes' => $pieces_jointes
];
/*
if ($f = charger_fonction('traiter', 'gamumail', true)) {
$corps = $f($corps, $options, $slug, $auteur, $Tclient, $Tpdf, $redirect);
}
*/
// appel d'une éventuelle fonction de traitement du contenu spécifique du slug
if ($f = charger_fonction($slug . '_traiter', 'gamumail', true)) {
$corps = $f($corps, $options, $slug, $pour);
}
// si debug on affiche sans envoyer le mail
if (isset($options['debug']) AND $options['debug']) {
echo '<br>slug : '.$slug;
echo '<br>$options :';
var_dump($options);
echo '<br>$pour : ';
var_dump($pour);
echo '<br>$sujet : '.$sujet;
echo '<br>$corps : ';
var_dump($corps);
$ok = true;
//exit;
} else {
// pour ne pas avoir de warning de la fonction envoyer_mail() on doit lui passer un paramètre $from et un $header
$from = '';
$header = $options['header'] ?? '';
$envoyer_mail = charger_fonction('envoyer_mail', 'inc/');
$ok = $envoyer_mail($pour, $sujet, $corps, $from, $header);
}
if (!$ok) {
spip_log("Erreur d'envoi du mail : ","gamumail");
spip_log($corps,"gamumail");
$retour['message_erreur'] = _L("gamumail:erreur_envoi_mail");
}
else {
$retour['message_ok'] = _L('gamumail:mail_envoye');
}
// on supprime les pdfs temporaires
if (count($Tpdf_dell)) {
foreach ($Tpdf_dell as $pdf) {
unlink($pdf);
}
}
return $retour;
}