spip_nursit/plugins-dist/dist/nursit/facteur/formulaires/tester_facteur.php

183 lines
5.4 KiB
PHP
Raw Normal View History

2023-06-01 15:30:12 +00:00
<?php
/**
* Plugin Facteur 4
* (c) 2009-2019 Collectif SPIP
* Distribue sous licence GPL
*
* @package SPIP\Facteur\Formulaires\Tester_facteur
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function formulaires_tester_facteur_charger_dist() {
include_spip('inc/config');
$valeurs = array(
'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));
}
else {
$valeurs['_message_warning'] = _T('facteur:info_envois_bloques_constante');
}
}
if (isset($GLOBALS['_message_html_test'])) {
$valeurs['_message_html_test'] = $GLOBALS['_message_html_test'];
}
return $valeurs;
}
function formulaires_tester_facteur_verifier_dist() {
$erreurs = array();
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)) {
$erreurs['email_test_from'] = _T('form_email_non_valide');
}
return $erreurs;
}
function formulaires_tester_facteur_traiter_dist() {
// envoyer un message de test ?
$res = array();
$destinataire = _request('email_test');
$message_html = '';
$options = array();
if ($from = _request('email_test_from')) {
$options['from'] = $from;
}
if (_request('email_test_piece_jointe')) {
$options['piece_jointe'] = true;
}
if (_request('email_test_important')) {
$options['important'] = true;
}
$err = facteur_envoyer_mail_test($destinataire, _T('facteur:corps_email_de_test'), $message_html, $options);
if ($err) {
$res['message_erreur'] = nl2br($err);
} else {
$res['message_ok'] = _T('facteur:email_test_envoye');
$GLOBALS['_message_html_test'] = $message_html;
}
return $res;
}
/**
* Inliner du contenu base64 pour presenter le html du mail de test envoye
* @param string $texte
* @param string $type
* @return string
*/
function facteur_inline_base64src($texte, $type="text/html"){
return "data:$type;charset=".$GLOBALS['meta']['charset'].";base64,".base64_encode($texte);
}
/**
* Fonction pour tester un envoi de mail ver sun destinataire
* renvoie une erreur eventuelle ou rien si tout est OK
* @param string $destinataire
* @param string $titre
* @param string $message_html
* @param array $options
* @return string
* message erreur ou vide si tout est OK
*/
function facteur_envoyer_mail_test($destinataire, $titre, &$message_html, $options = array()) {
include_spip('classes/facteur');
$piece_jointe = array();
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 <20>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');
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(
'chemin' => $file,
'nom' => $doc['titre'] ? $doc['titre'] : basename($doc['fichier']),
'mime' => $mime,
);
break 2;
}
}
}
unset($options['piece_jointe']);
}
// 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){
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');
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(
'html' => $message_html,
'texte' => $message_texte,
'exceptions' => true,
);
if ($piece_jointe) {
$corps['pieces_jointes'] = array($piece_jointe);
}
if ($options) {
$corps = array_merge($options, $corps);
}
// 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;
// passer par envoyer_mail pour bien passer par les pipeline et avoir tous les logs
$envoyer_mail = charger_fonction('envoyer_mail', 'inc');
try {
$retour = $envoyer_mail($destinataire, $titre, $corps);
} catch (Exception $e) {
return $e->getMessage();
}
// si echec mais pas d'exception, on signale de regarder dans les logs
if (!$retour) {
return _T('facteur:erreur').' '._T('facteur:erreur_dans_log');
}
// tout est OK, pas d'erreur
return '';
}