'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, 'lang' => 'en']] ou ['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3, 'lang' => 'en']] * NB: si besoin que le PDF généré soit dans une langue précise, il faut passer la passer en paramètre "lang" dans le contexte * @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 = []; if (defined('_FORCER_ENVOI_SEPARE')) { $options['envoi_separe'] = 'oui'; } $Tcc = !empty(lire_config('gamumail/mail_cc')) ? explode(',', lire_config('gamumail/mail_cc', '')) : []; $Tcc = count($Tcc) ? array_map('arrayMails', $Tcc) : []; $Tcci = !empty(lire_config('gamumail/mail_cci')) ? explode(',', lire_config('gamumail/mail_cci', '')) : []; $Tcci = count($Tcci) ? array_map('arrayMails', $Tcci) : []; $Trepondre_a = !empty(lire_config('gamumail/mail_repondre_a')) ? explode(',', lire_config('gamumail/mail_repondre_a', '')) : []; $Trepondre_a = count($Trepondre_a) ? array_map('arrayMails', $Trepondre_a) : []; if (!empty($destinataires) and !is_array($destinataires)) { $destinataires = explode(',', $destinataires); } else { $destinataires = []; } foreach ($destinataires as $dest) { if (is_numeric($dest)) { $dest = (int) $dest; if ($tM = sql_fetsel('*', 'spip_auteurs', 'id_auteur='.$dest)) { $Tmails[] = [ 'id_auteur' => $dest, 'email' => $tM['email'], 'texte' => $tM['nom'] . ' ' . ($tM['prenom'] ?? '') . ' ' . '<' . $tM['email'] . '>', ]; } } elseif (email_valide($dest)) { $Tmails[] = ['email' => $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[] = ['email' => $mail]; } else { $copie == 'cc' ? $Tcc[] = ['email' => $mail] : $Tcci[] = ['email' => $mail]; } } } } $TFichierPdf = []; if (is_array($Tpdf) and count($Tpdf)) { if (array_key_exists('fichier', $Tpdf)) { $Tpdf = [$Tpdf]; } foreach ($Tpdf as $id => $pdf) { $TFichierPdf[$id] = $pdf; } } $TFichierPdf = pipeline('gamumail_filtrer_tPDF', [ 'args' => [ 'TFichierPdf' => $TFichierPdf ], 'data' => $TFichierPdf ] ); $gamuMail = []; if (!empty($slug)) { $gamuMail = sql_fetsel('sujet, texte, id_docs', 'spip_gamumails', 'slug='.sql_quote($slug)); } $texte = $gamuMail['texte'] ?? ''; $sujet = $gamuMail['sujet'] ?? ''; // faire les remplacement 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' => $Tmails, 'cc' => $Tcc, 'cci' => $Tcci, 'repondre_a' => $Trepondre_a, 'TFichierpdfs' => $TFichierPdf, 'Tpdfs_ok' => [], 'docs_spip' => $gamuMail['id_docs'] ?? '', 'Tid_fichiers' => [], 'options' => $options, 'envoi_separe' => $options['envoi_separe'] ?? '' ); // 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); } $rep = session_get('id_auteur') . '_' . session_get('login'); supprimer_repertoire(_DIR_TMP . 'bigupload/final/'.$rep); $valeurs['_bigup_rechercher_fichiers'] = true; return $valeurs; } function formulaires_gamumail_verifier_dist($slug, $destinataires = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []) :Array{ $erreurs = array(); //champs obligatoire $pour = _request("pour") ?? []; if (!count($pour)) { $erreurs['pour'] = 'Ce champs est obligatoire'; } foreach (array('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 = []; 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'] = $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); } /* * Verification des fichiers téléversés */ defined('_IMG_MAX_WIDTH') || define('_IMG_MAX_WIDTH', 2048); $options = [ 'mime' => 'tout_mime', 'dimension_max' => [ 'largeur' => 10000, 'hauteur' => 10000, ] ]; $bigform = charger_fonction('bigform_verifier','inc'); $bigform($options,$erreurs); return $erreurs; } function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []) :Array{ $retour = []; // 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'); $envoi_separe = _request('envoi_separe') ?? ''; $options['envoi_separe'] = $envoi_separe; $pour = _request('pour') ?? []; $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; } } /* * on recupère d'éventuels fichiers téléversés */ include_spip('inc/joindre_document'); set_request('joindre_upload','ok'); $Tfiles = joindre_trouver_fichier_envoye(); if (!is_array($Tfiles)) { $Tfiles = []; } if (defined('_FORCER_ENVOI_SEPARE')) { $envoi_separe = 'oui'; } if (empty($envoi_separe)) { gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $Tfiles, $redirect, $retour); } else { $ok = true; foreach ($destinataires as $d) { $r = gamuSend($slug, $options, [$d], $Tclient, $Tpdf, $Tfiles, $redirect); if (!$r) { $ok = false; } } if (!$ok) { $retour['message_erreur'] = _T("gamumail:erreur_envoi_mail"); } else { $retour['message_ok'] = _T('gamumail:mail_envoye'); // dans le retour message_ok ajouter que le gamumail est OK $retour['message_ok'] .= '@@gamumail_ok'; } } if ($redirect AND $redirect != '') { $retour['redirect'] = $redirect; } // debug // $retour['redirect'] = ""; // fin debug return $retour; } function gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $Tfiles, $redirect, &$retour = []) { static $iteration; if ($iteration === null) { $iteration = 1; } else { $iteration++; } $cc = _request('cc') ?? []; $cci = _request('cci') ?? []; $repondre_a = _request('repondre_a') ?? []; // $cc = explode(',', $cc); // $cci = explode(',', $cci); $Tcci_gamuza = $GLOBALS['gamuza_mail_cci'] ?? []; $cci = array_merge($cci, $Tcci_gamuza); // $repondre_a = explode(',', $repondre_a); $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); $args = $options; $args['slug'] = $slug; $args['destinataires'] = $destinataires; $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, 'quoi' => 'docs_spip', 'qui' => $id_document ]; } } // 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, 'quoi' => 'docs_spip', 'qui' => $id_doc ]; } } // les documents par tFiles (téléversés) $tFilename = []; if (!empty($Tfiles)) { include_spip('inc/documents'); $rep = sous_repertoire(_DIR_CACHE . 'bigform'); foreach ($Tfiles as $fichier) { $filename = $rep . $fichier['name']; $tFilename[] = $filename; deplacer_fichier_upload($fichier['tmp_name'], $filename); $pieces_jointes[] = [ 'chemin' => $filename, 'nom' => $fichier['name'], 'encodage' => 'base64', 'mime' => $fichier['type'], 'quoi' => 'televerser', 'qui' => $fichier['name'] ]; } } // 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) { $nom = "mon_fichier"; 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; } } $nom = pipeline('remplacements_slug', array( 'args' => $args, 'data' => $nom )); $c = pipeline('tpdf_charger_contexte', [ 'args' => [ 'destinataires' => $destinataires, 'contexte' => $c, 'options' => $options ], 'data' => $c ]); $pdf = $recup_pdf($fichier, $c, $args); if (!empty($pdf)) { $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', 'quoi' => 'pdf_genere', 'qui' => $fichier ]; } } } if ($f = charger_fonction('traiter_pieces_jointes', 'gamumail', true)) { $pc = $f($slug, $options, $destinataires, $Tclient, $Tpdf); if (!empty($pc)) { $pieces_jointes[] = $pc; } } if ($f = charger_fonction($slug . '_traiter_pieces_jointes', 'gamumail', true)) { $pc = $f($options, $destinataires, $Tclient, $Tpdf); if (!empty($pc)) { $pieces_jointes[] = $pc; } } $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 traitements du contenu des slugs spécifiques de chaque plugin $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, 'bcc' => $cci, 'pieces_jointes' => $pieces_jointes ]; if ($repondre_a) { $corps['repondre_a'] = $repondre_a; } // 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); // extraire les multi une fois les remplacements faits $lang = $options['lang'] ?? lire_config('langue_site'); $sujet = extraire_multi($sujet, $lang); $corps['html'] = extraire_multi($corps['html'], $lang); $corps['texte'] = extraire_multi($corps['texte'], $lang); $args['corps'] = $corps; $args['sujet'] = $sujet; [$destinataires, $sujet, $corps] = array_values(pipeline('gamumail_pre_envoi', [ 'args' => [ 'slug' => $slug, 'options' => $options, 'iteration' => $iteration ], 'data' => [ 'destinataires' => $destinataires, 'sujet' => $sujet, 'corps' => $corps, ] ])); // envoyer ! $envoyer_mail = charger_fonction('envoyer_mail', 'inc/'); $ok = $envoyer_mail($destinataires, $sujet, $corps); /* * on vide les fichiers temp televerses par bigup */ if (count($tFilename)) { foreach ($tFilename as $file) { if (file_exists($file)) { unlink($file); } } } 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); } } return $ok; } function arrayMails(string $t):array { return ['email' => trim($t)]; }