- les sujets et textes des slugs peuvent désormais être multilangue en utilisant des <multi> - la langue utilisée pour le mail est celle passée dans options[lang] de l'appel de FORMULAIRE_GAMUMAIL TODO : voir comment on pourrait faire pour gérer la langue du mail non pas pour l'ensemble des destinataires mais pour chacun d'eux....
414 lines
14 KiB
PHP
414 lines
14 KiB
PHP
<?php
|
|
if (!defined('_ECRIRE_INC_VERSION')) return;
|
|
|
|
include_spip('inc/filtres');
|
|
|
|
/**
|
|
* formulaire générique pour envoyer des mails avec pieces attachés
|
|
*
|
|
* @param string $slug modele du mail a charger
|
|
* @param string $destinataires = adresses mails et id_auteurs 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 $Tclient = un ou plusieurs mails de destinataires sortis d'une table objet spécifique
|
|
* de la forme []['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email', 'copie' => 'cc|cci'] ou ['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email']
|
|
* le paramètre 'copie' est facultatif : cc ou cci pour mettre un destinataire en copie, '' par défaut = destinataire principal
|
|
* @param array $Tpdf = un ou plusieurs fichiers PDF générés par spiPDF (le contexte permet la personnalisation du contenu)
|
|
* []['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3]] ou ['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3]]
|
|
* @param string $redirect
|
|
* @param array $options = un gros fourre-tout sous forme d'un array
|
|
* utilisé en particulier par les inclure HTML de gamumail/#SLUG_soustexte et gamumail/#SLUG_fichiers
|
|
*
|
|
* @return array $valeurs
|
|
*
|
|
*/
|
|
function formulaires_gamumail_charger_dist($slug, $destinataires = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []){
|
|
$Tmails = [];
|
|
|
|
$Tcc = lire_config('gamumail/mail_cc') !== '' ? explode(',', lire_config('gamumail/mail_cc', '')) : [];
|
|
$Tcci = lire_config('gamumail/mail_cci') !== '' ? explode(',', lire_config('gamumail/mail_cci', '')) : [];
|
|
|
|
if (!empty($destinataires) and !is_array($destinataires)) {
|
|
$destinataires = explode(',', $destinataires);
|
|
} else {
|
|
$destinataires = [];
|
|
}
|
|
|
|
foreach ($destinataires as $dest) {
|
|
if (is_numeric($dest)) {
|
|
if ($mail = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.$dest)) {
|
|
$Tmails[] = $mail;
|
|
}
|
|
}
|
|
elseif (email_valide($dest)) {
|
|
$Tmails[] = $dest;
|
|
}
|
|
}
|
|
|
|
if (is_array($Tclient) and count($Tclient)) {
|
|
if (array_key_exists('objet', $Tclient)) {
|
|
$Tclient = [$Tclient];
|
|
}
|
|
foreach ($Tclient as $o) {
|
|
$table = table_objet_sql($o['objet']);
|
|
$id = id_table_objet($o['objet']);
|
|
$mail = sql_getfetsel("{$o['champ']}", $table, "$id=".intval($o['id_objet']));
|
|
$copie = (isset($o['copie']) and in_array($o['copie'], ['cc', 'cci'])) ? $o['copie'] : false;
|
|
if (email_valide($mail)) {
|
|
if (!$copie) {
|
|
$Tmails[] = $mail;
|
|
} else {
|
|
$copie == 'cc' ? $Tcc[] = $mail : $Tcci[] = $mail;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$TFichierPdf = [];
|
|
if (is_array($Tpdf) and count($Tpdf)) {
|
|
if (array_key_exists('fichier', $Tpdf)) {
|
|
$Tpdf = [$Tpdf];
|
|
}
|
|
foreach ($Tpdf as $id => $pdf) {
|
|
//$TFichierPdf[] = $pdf['fichier'];
|
|
$TFichierPdf[$id] = $pdf;
|
|
//$options[$id] = $pdf;
|
|
}
|
|
}
|
|
//var_dump($Tcc);
|
|
$gamuMail = sql_fetsel('sujet, texte, id_docs', 'spip_gamumails', 'slug='.sql_quote($slug));
|
|
$texte = $gamuMail['texte'] ?? '';
|
|
$sujet = $gamuMail['sujet'] ?? '';
|
|
// faire les remplacement <multi> selon la langue du destinataire (passée en $options[lang])
|
|
if (!empty($options['lang']) && in_array($options['lang'], liste_options_langues('var_lang'))) {
|
|
$texte = extraire_multi($texte, $options['lang']);
|
|
$sujet = extraire_multi($sujet, $options['lang']);
|
|
}
|
|
$valeurs = array(
|
|
"slug" => $slug,
|
|
'sujet' => $sujet,
|
|
'texte' => $texte,
|
|
'pour' => implode(',', $Tmails),
|
|
'cc' => implode(',', $Tcc),
|
|
'cci' => implode(',', $Tcci),
|
|
'TFichierpdfs' => $TFichierPdf,
|
|
'Tpdfs_ok' => [],
|
|
'docs_spip' => $gamuMail['id_docs'] ?? '',
|
|
'Tid_fichiers' => [],
|
|
'options' => $options
|
|
);
|
|
|
|
// surcharges charger : d'abord les surcharges pour tous les slugs (tous_charge.php) puis les spécifiques par slug (nom_slug_charger.php)
|
|
if ($f = charger_fonction('tous_charger', 'gamumail', true)) {
|
|
$valeurs = $f($valeurs, $options, $slug, $destinataires, $Tclient, $Tpdf, $redirect);
|
|
}
|
|
if ($f = charger_fonction($slug . '_charger', 'gamumail', true)) {
|
|
$valeurs = $f($valeurs, $options, $slug, $destinataires, $Tclient, $Tpdf, $redirect);
|
|
}
|
|
|
|
return $valeurs;
|
|
}
|
|
|
|
function formulaires_gamumail_verifier_dist($slug, $destinataires = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []) :Array{
|
|
$erreurs = array();
|
|
//champs obligatoire
|
|
foreach (array ('pour', 'sujet', 'texte') as $obligatoire) {
|
|
if (!_request($obligatoire)) $erreurs[$obligatoire] = 'Ce champs est obligatoire';
|
|
}
|
|
|
|
// le slug est il OK ?
|
|
if (preg_match('/[^a-zA-Z0-9_\-]/', $slug)) {
|
|
$erreurs['message_erreur'] = _T("gamumail:erreur_format_slug");
|
|
}
|
|
/*
|
|
* Finalement on accepte d'utiliser gamumail sans slug
|
|
* Je commente les lignes ci dessous
|
|
*/
|
|
// $res = sql_fetsel('slug', 'spip_gamumails', 'slug = "'.$slug.'"');
|
|
// if (!$res) {
|
|
// $erreurs['message_erreur'] = _T("gamumail:pas_de_slug");
|
|
// }
|
|
|
|
// vérif des destinataires
|
|
$Tid_erreur = $Tmails_erreur = [];
|
|
$pour = explode(',', _request('pour'));
|
|
foreach ($pour as $dest) {
|
|
if (is_numeric($dest)) {
|
|
if (!$mail = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.$dest)) {
|
|
$Tid_erreur[] = $dest;
|
|
}
|
|
}
|
|
elseif (!email_valide($dest)) {
|
|
$Tmails_erreur[] = $dest;
|
|
}
|
|
}
|
|
if (count($Tid_erreur)) {
|
|
$erreurs['pour'] = _T("gamumail:id_destinataires_sans_mails", ['ids_erreur' => join(', ', $Tid_erreur)]).' ';
|
|
}
|
|
if (count($Tmails_erreur)) {
|
|
$erreurs['pour'] .= _T("gamumail:mails_destinataires_en_erreur", ['mails_erreur' => join(', ', $Tmails_erreur)]);
|
|
}
|
|
|
|
// les id_document attachés sont-ils OK ?
|
|
$docs_spip = [];
|
|
if (_request('docs_spip') != '') {
|
|
$docs_spip = explode(',', _request('docs_spip'));
|
|
}
|
|
if (is_array($docs_spip) and count($docs_spip)) {
|
|
$docs_spip_erreurs = [];
|
|
foreach($docs_spip as $id_doc) {
|
|
if (intval($id_doc) != $id_doc
|
|
OR !sql_getfetsel('id_document', 'spip_documents', 'id_document='.$id_doc)) {
|
|
$docs_spip_erreurs[] = $id_doc;
|
|
}
|
|
}
|
|
if (count($docs_spip_erreurs)) {
|
|
$erreurs['docs_spip'] = _T("gamumail:id_docs_en_erreur", ['id_docs_erreurs' => join(', ', $docs_spip_erreurs)]);
|
|
}
|
|
}
|
|
|
|
// les fichiers envoyés par un éventuel inclure gamumail/#SLUG_fichiers.html sont ils OK ?
|
|
$Tid_doc = [];
|
|
$Tid_doc = _request('Tid_doc');
|
|
if (is_array($Tid_doc) and count($Tid_doc)) {
|
|
$Tid_doc_erreurs = [];
|
|
foreach($Tid_doc as $id_doc) {
|
|
if (intval($id_doc) != $id_doc
|
|
OR !sql_getfetsel('id_document', 'spip_documents', 'id_document='.$id_doc)) {
|
|
$Tid_doc_erreurs[] = $id_doc;
|
|
}
|
|
}
|
|
if (count($Tid_doc_erreurs)) {
|
|
$erreurs['Tid_doc'] = _T("gamumail:id_docs_en_erreur", ['id_docs_erreurs' => join(', ', $Tid_doc_erreurs)]);
|
|
}
|
|
}
|
|
|
|
// surcharges verifier : d'abord les surcharges pour tous les slugs (tous_verifier.php) puis les spécifiques par slug (nom_slug_verifier.php)
|
|
if ($f = charger_fonction('tous_verifier', 'gamumail', true)) {
|
|
$erreurs = $f($erreurs, $options, $slug, $destinataires, $Tclient, $Tpdf, $redirect);
|
|
}
|
|
if ($f = charger_fonction($slug . '_verifier', 'gamumail', true)) {
|
|
$erreurs = $f($erreurs, $options, $slug, $destinataires, $Tclient, $Tpdf, $redirect);
|
|
}
|
|
|
|
return $erreurs;
|
|
}
|
|
|
|
function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []) :Array{
|
|
|
|
// blocage de l'envoi par appel du pseudo-slug no_gamumail
|
|
if ($slug === 'no_gamumail') {
|
|
$retour['message_ok'] = _T('gamumail:message_no_gamumail');
|
|
if ($redirect AND $redirect != '') {
|
|
$retour['redirect'] = $redirect;
|
|
}
|
|
spip_log("Pas d'envoi de mail pour cause de slug no_gamumail","gamumail");
|
|
return $retour;
|
|
}
|
|
|
|
include_spip('inc/texte');
|
|
include_spip('classes/facteur');
|
|
|
|
$retour = array();
|
|
|
|
$pour = _request('pour');
|
|
$cc = _request('cc');
|
|
$cci = _request('cci');
|
|
$sujet = _request('sujet');
|
|
$html = propre(_request('texte'));
|
|
$docs_spip = _request('docs_spip');
|
|
$Tpdfs_ok = _request('Tpdfs_ok');
|
|
$Tid_doc = _request('Tid_doc');
|
|
$texte = facteur_mail_html2text($html);
|
|
|
|
$pour = explode(',', $pour);
|
|
$cc = explode(',', $cc);
|
|
$cci = explode(',', $cci);
|
|
|
|
$destinataires = [];
|
|
foreach ($pour as $dest) {
|
|
if (is_numeric($dest)) {
|
|
if ($mail = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.$dest)) {
|
|
$destinataires[] = $mail;
|
|
}
|
|
}
|
|
elseif (email_valide($dest)) {
|
|
$destinataires[] = $dest;
|
|
}
|
|
}
|
|
|
|
$pieces_jointes = [];
|
|
if ($f = charger_fonction('traiter_av_pdf', 'gamumail', true)) {
|
|
$options = $f($options, $destinataires, $Tclient, $Tpdf);
|
|
}
|
|
if ($f = charger_fonction($slug . '_traiter_av_pdf', 'gamumail', true)) {
|
|
$options = $f($options, $destinataires, $Tclient, $Tpdf);
|
|
}
|
|
|
|
// les documents par id_document
|
|
$docs_spip = ($docs_spip != '' ? explode(',', $docs_spip) : []);
|
|
if (!empty($docs_spip)) {
|
|
foreach ($docs_spip 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']);
|
|
}
|
|
$type_mime = bigup_get_mime_type_extension($extension);
|
|
$pieces_jointes[] = [
|
|
'chemin' => $destination,
|
|
'nom' => $nom_fichier,
|
|
'encodage' => 'base64',
|
|
'mime' => $type_mime
|
|
];
|
|
}
|
|
}
|
|
|
|
// les documents par Tid_doc envoyés depuis inclure gamumail/#SLUG_fichiers.html
|
|
if (!empty($Tid_doc)) {
|
|
foreach ($Tid_doc as $id_doc) {
|
|
$Tdocs = sql_fetsel('titre,fichier,extension','spip_documents','id_document='.intval($id_doc));
|
|
$destination = _DIR_IMG.$Tdocs['fichier'];
|
|
$extension = $Tdocs['extension'];
|
|
if ($Tdocs['titre']) {
|
|
$nom_fichier = $Tdocs['titre'] .".".$extension;
|
|
} else {
|
|
$nom_fichier = basename($Tdocs['fichier']);
|
|
}
|
|
$type_mime = bigup_get_mime_type_extension($extension);
|
|
$pieces_jointes[] = [
|
|
'chemin' => $destination,
|
|
'nom' => $nom_fichier,
|
|
'encodage' => 'base64',
|
|
'mime' => $type_mime
|
|
];
|
|
}
|
|
}
|
|
// les pdfs générés en fonction du contexte
|
|
$Tpdf_del = [];
|
|
if (!empty($Tpdfs_ok) and is_array($Tpdfs_ok)) {
|
|
if (array_key_exists('fichier', $Tpdf)) {
|
|
$Tpdf = [$Tpdf];
|
|
}
|
|
|
|
$recup_pdf = charger_fonction('charger_pdf','inc');
|
|
foreach ($Tpdfs_ok as $pdf) {
|
|
foreach ($Tpdf as $cle => $p) {
|
|
if ($p['fichier'].'_'.$cle === $pdf) {
|
|
$fichier = $p['fichier'];
|
|
$c = isset($p['contexte']) ? $p['contexte'] : [];
|
|
$nom = isset($p['nom']) ? $p['nom'] : $fichier;
|
|
}
|
|
}
|
|
$pdf = $recup_pdf($fichier, $c);
|
|
$nom_fichier = $nom.'.pdf';
|
|
$destination = _DIR_TMP.basename($nom_fichier);
|
|
$Tpdf_del[] = $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 traitement du contenu des slugs spécifiques de chaque plugin
|
|
$args = $options;
|
|
$args['slug'] = $slug;
|
|
$args['destinataires'] = $destinataires;
|
|
$html = pipeline('remplacements_slug', array(
|
|
'args' => $args,
|
|
'data' => $html
|
|
));
|
|
|
|
// traitement des remplacements génériques fournis par Gamumail
|
|
$remplacement_generiques = charger_fonction('gamumail_remplacements', 'inc');
|
|
$html = $remplacement_generiques($args, $html);
|
|
|
|
$texte = facteur_mail_html2text($html);
|
|
$corps = [
|
|
'html' => $html,
|
|
'texte' => $texte,
|
|
'cc' => $cc,
|
|
'cci' => $cci,
|
|
'pieces_jointes' => $pieces_jointes
|
|
];
|
|
|
|
// surcharges de traiter : d'abord les surcharges pour tous les slugs (tous_traiter.php) puis les spécifiques par slug (nom_slug_traiter.php)
|
|
if ($f = charger_fonction('traiter', 'gamumail', true)) {
|
|
$corps = $f($corps, $options, $slug, $destinataires, $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, $destinataires);
|
|
}
|
|
|
|
// Gestion des variables dans le sujet du mail (spécifiques + génériques)
|
|
$sujet = pipeline('remplacements_slug',[
|
|
'args' => $args,
|
|
'data' => $sujet
|
|
]);
|
|
$sujet = $remplacement_generiques($args, $sujet);
|
|
|
|
//var_dump($corps);die;
|
|
|
|
// envoyer !
|
|
$envoyer_mail = charger_fonction('envoyer_mail', 'inc/');
|
|
$ok = $envoyer_mail($destinataires, $sujet, $corps);
|
|
if (!$ok) {
|
|
spip_log("Erreur d'envoi du mail : ","gamumail");
|
|
spip_log($corps,"gamumail");
|
|
$retour['message_erreur'] = _T("gamumail:erreur_envoi_mail");
|
|
}
|
|
else {
|
|
$retour['message_ok'] = _T('gamumail:mail_envoye');
|
|
|
|
// appel d'une éventuelle fonction de traitement si le mail est OK
|
|
$retour = pipeline('post_gamumail_ok', array(
|
|
'args' => $args,
|
|
'data' => $retour
|
|
));
|
|
|
|
// dans le retour message_ok ajouter que le gamumail est OK
|
|
$retour['message_ok'] .= '@@gamumail_ok';
|
|
}
|
|
|
|
// on supprime les pdfs temporaires
|
|
if (count($Tpdf_del)) {
|
|
foreach ($Tpdf_del as $pdf) {
|
|
unlink($pdf);
|
|
}
|
|
}
|
|
|
|
if ($redirect AND $redirect != '') {
|
|
$retour['redirect'] = $redirect;
|
|
}
|
|
|
|
return $retour;
|
|
}
|