'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', '')) : []; $Trepondre_a = lire_config('gamumail/mail_repondre_a') !== '' ? explode(',', lire_config('gamumail/mail_repondre_a', '')) : []; 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[$id] = $pdf; } } $gamuMail = sql_fetsel('sujet, texte, id_docs', 'spip_gamumails', 'slug='.sql_quote($slug)); $valeurs = array( "slug" => $slug, 'sujet' => $gamuMail['sujet'] ?? '', 'texte' => $gamuMail['texte'] ?? '', 'pour' => implode(',', $Tmails), 'cc' => implode(',', $Tcc), 'cci' => implode(',', $Tcci), 'repondre_a' => implode(',', $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); } 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{ $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'); $pour = explode(',', $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; } } if (empty($envoi_separe)) { gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $redirect, $retour); } else { $ok = true; foreach ($destinataires as $d) { $r = gamuSend($slug, $options, [$d], $Tclient, $Tpdf, $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; } return $retour; } function gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $redirect, &$retour = []) { $cc = _request('cc'); $cci = _request('cci'); $repondre_a = _request('repondre_a'); $cc = explode(',', $cc); $cci = explode(',', $cci); $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); $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; } } $c = pipeline('tpdf_charger_contexte', [ 'args' => [ 'destinataires' => $destinataires, 'contexte' => $c, 'options' => $options ], 'data' => $c ]); $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' ]; } } 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 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 ]; 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); $args['corps'] = $corps; $args['sujet'] = $sujet; // 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); } } return $ok; }