Newer
Older
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}

maieul@maieul.net
a validé
include_spip('inc/formidable_fichiers');
function traiter_email_dist($args, $retours) {

maieul@maieul.net
a validé
// Vérifier si on doit envoyer en cas de modification de réponses
if (isset($retours['modification_reponse'])
and $retours['modification_reponse'] == true
and isset($args['options']['modification_reponse'])
and $args['options']['modification_reponse'] == 'on'
) {

maieul@maieul.net
a validé
$retours['traitements']['email'] = true;
return $retours;
}
if (!isset($retours['fichiers'])) {
$retours['fichiers'] = array();
} else {
}

maieul@maieul.net
a validé
$timestamp = time();

nicod@lerebooteux.fr
a validé
$erreur_envoi = false;
$retours['timestamp'] = $timestamp;
$id_formulaire = $args['id_formulaire'];
$formulaire = $args['formulaire'];
$options = $args['options'];
$saisies = unserialize($formulaire['saisies']);
$saisies_fond_notification = $saisies;
$traitements = unserialize($formulaire['traitements']);
$champs = saisies_lister_champs($saisies);

marcimat@rezo.net
a validé
$destinataires = array();
$taille_fichiers = 0; //taille des fichiers en email
$fichiers_facteur = array(); // tableau qui stockera les fichiers à envoyer avec facteur
if (isset($options['exclure_champs_email']) && $options['exclure_champs_email']) {
$champs_a_exclure = explode(",", $options['exclure_champs_email']);
$champs = array_diff($champs, $champs_a_exclure);
foreach ($champs_a_exclure as $champ_a_exclure) {
$champ_a_exclure = trim($champ_a_exclure);
$champ_a_exclure = str_replace('@','',$champ_a_exclure);
$saisies_fond_notification = saisies_supprimer($saisies_fond_notification,$champ_a_exclure);

nicod@lerebooteux.fr
a validé
$nom_site_spip = supprimer_tags(typo(lire_meta('nom_site')));
$email_webmaster = supprimer_tags(typo(lire_meta('email_webmaster')));

maieul@maieul.net
a validé
$destinataires = formidable_traiter_email_champ_destinataires($options['champ_destinataires']);

marcimat@rezo.net
a validé
// Conservé pour raison historique, mais mauvaise pratique.

prigent.yohann@gmail.com
a validé
if ($options['champ_courriel_destinataire_form']) {
$courriel_champ_form = _request($options['champ_courriel_destinataire_form']);
$destinataires[] = $courriel_champ_form;
}

prigent.yohann@gmail.com
a validé
if ($options['destinataires_plus']) {
$destinataires_plus = explode(',', $options['destinataires_plus']);
$destinataires_plus = array_map('trim', $destinataires_plus);
$destinataires = array_merge($destinataires, $destinataires_plus);
}

maieul@maieul.net
a validé

marcimat@rezo.net
a validé
// On ajoute les destinataires en fonction des choix de saisie dans le formulaire
// @selection_1@/choix1 : mail@domain.tld
// @selection_1@/choix2 : autre@domain.tld, lapin@domain.tld
if (!empty($options['destinataires_selon_champ'])) {
if ($destinataires_selon_champ = formidable_traiter_email_destinataire_selon_champ($options['destinataires_selon_champ'])) {
$destinataires = array_merge($destinataires, $destinataires_selon_champ);
}
}
$destinataires = pipeline('formidable_traiter_email_destinataires', array(
'args' => array_merge(
$args,
array(
'id_formulaires_reponse' => isset($retours['id_formulaires_reponse']) ? $retours['id_formulaires_reponse'] : '',
'id_formulaire' => $args['formulaire']['id_formulaire']//Un peu redondant, mais ca aide
)
),
'data' => $destinataires)
);
// S'assurer que les destinataires ne soient pas en doublons
$destinataires = array_filter($destinataires, 'trim');
$destinataires = array_unique($destinataires);
// On récupère le courriel de l'envoyeur s'il existe
$courriel_envoyeur = _request($options['champ_courriel']);
}
// Récuperer les valeurs saisies
list($valeurs,$valeurs_libellees) = formidable_tableau_valeurs_saisies($saisies);
if (isset($options['masquer_champs_vides']) and $options['masquer_champs_vides'] == 'on') {
$valeurs = array_filter($valeurs);
$valeurs_libellees = array_filter($valeurs_libellees);
}
// Traitement à part pour les saisies de types fichiers :
// 1. Calculer la taille totale des fichiers
// 2. Ajouter au facteur
$saisies_fichiers = saisies_lister_avec_type($saisies, 'fichiers');
foreach ($champs as $champ) {
if (array_key_exists($champ, $saisies_fichiers)) {
$valeurs[$champ] = traiter_email_fichiers($saisies_fichiers[$champ], $champ, $formulaire['id_formulaire'], $retours, $timestamp);
if ($ajouter_fichier) {
$retours['fichiers'][$champ] = $valeurs[$champ];
}
$taille_fichiers += formidable_calculer_taille_fichiers_saisie($valeurs[$champ]);
$fichiers_facteur = array_merge(
$fichiers_facteur,
vue_fichier_to_tableau_facteur($valeurs[$champ])
);
}
}
// Si on a bien des destinataires, on peut continuer
if ($destinataires or ($courriel_envoyeur and $options['activer_accuse'])) {
include_spip('inc/filtres');
include_spip('inc/texte');
$nom_envoyeur = formidable_raccourcis_arobases_2_valeurs_champs(
$options['champ_nom'],
$saisies,
false,
''
);
if (!isset($nom_envoyeur) or !$nom_envoyeur) {
$nom_envoyeur = $nom_site_spip;
}
// On récupère le sujet s'il existe sinon on le construit
$sujet = formidable_raccourcis_arobases_2_valeurs_champs(
$options['champ_sujet'],
$saisies,
$options['champ_sujet_valeurs_brutes'],
''
);
$sujet = _T('formidable:traiter_email_sujet', array('nom'=>$nom_envoyeur));
}
if (isset($options['champ_sujet_modif_reponse']) and $options['champ_sujet_modif_reponse'] and $retours['modification_reponse']) {
$sujet = $sujet.' '._T('formidable:traitement_email_sujet_courriel_modif_reponse');
}
if (find_in_path('notifications/formulaire_'.$formulaire['identifiant'].'_email.html')) {
$notification = 'notifications/formulaire_'.$formulaire['identifiant'].'_email';
$notification = 'notifications/formulaire_email';
// Est-ce qu'on est assez léger pour joindre les pj
$joindre_pj = false;
if ($taille_fichiers < 1024 * 1024 * _FORMIDABLE_TAILLE_MAX_FICHIERS_EMAIL
and
$traitements['email']['pj'] == 'on'
) {
$joindre_pj = true;
foreach (array_keys($saisies_fichiers) as $nom) {
$saisies = saisies_supprimer($saisies,$nom);
// On génère le mail avec le fond
$html = recuperer_fond(
$notification,
array(

camille.sauvage@espci.fr
a validé
'id_formulaire' => $args['id_formulaire'],
'id_formulaires_reponse' => isset($retours['id_formulaires_reponse']) ? $retours['id_formulaires_reponse'] : '',
'titre' => _T_ou_typo($formulaire['titre']),
'traitements' => $traitements,
'saisies' => $saisies_fond_notification,

real3t@gmail.com
a validé
'valeurs' => $valeurs,

maieul@maieul.net
a validé
'masquer_liens' => $options['masquer_liens'],

maieul@maieul.net
a validé
'ip' => $options['activer_ip']?$GLOBALS['ip']:'',
'envoi_precedent' => isset($retours['envoi_precedent']) ? $retours['envoi_precedent'] : '' ,
'courriel_envoyeur' => $courriel_envoyeur,

maieul@maieul.net
a validé
'nom_envoyeur' => filtrer_entites($nom_envoyeur)

pierrekuhn82@gmail.com
a validé
include_spip('facteur_fonctions');
$texte = facteur_mail_html2text($html);
$corps = array(
'html' => $html,
'texte' => $texte,

rastapopoulos@spip.org
a validé
'nom_envoyeur' => filtrer_entites($nom_envoyeur),
// Joindre les pj si léger
if ($joindre_pj) {
$corps['pieces_jointes'] = $fichiers_facteur;
}
// Si l'utilisateur n'a pas indiqué autrement, on met le courriel de l'envoyeur dans
// Reply-To et on laisse le from par defaut de Facteur car sinon ca bloque sur les
// SMTP un peu restrictifs.
$courriel_from = '';
if ($courriel_envoyeur && $options['activer_vrai_envoyeur']) {
$courriel_from = $courriel_envoyeur;

cedric@yterium.com
a validé
$corps['repondre_a'] = $courriel_envoyeur;
}
$envoyer_mail = charger_fonction('envoyer_mail', 'inc');

nicod@lerebooteux.fr
a validé
if (!$envoyer_mail($destinataires, $sujet, $corps, $courriel_from, 'X-Originating-IP: '.$GLOBALS['ip'])){
$erreur_envoi = true;
}

nicod@lerebooteux.fr
a validé
// Si besoin, on envoie l'accusé de réception
if ($courriel_envoyeur and $options['activer_accuse']) {
// On récupère le sujet s'il existe sinon on le construit
$sujet_accuse = formidable_raccourcis_arobases_2_valeurs_champs(
$options['sujet_accuse'],
$saisies,
false,
''
);
$sujet_accuse = _T('formidable:traiter_email_sujet_accuse');
}
$sujet_accuse = filtrer_entites($sujet_accuse);
if (find_in_path('notifications/formulaire_'.$formulaire['identifiant'].'_accuse.html')) {
$accuse = 'notifications/formulaire_'.$formulaire['identifiant'].'_accuse';
$accuse = 'notifications/formulaire_accuse';
if (_FORMIDABLE_LIENS_FICHIERS_ACCUSE_RECEPTION == false) {
$valeurs = vues_saisies_supprimer_action_recuperer_fichier_par_email($saisies, $valeurs);
$parametres_accuse = array(
'id_formulaire' => $formulaire['id_formulaire'],
'id_formulaires_reponse' => isset($retours['id_formulaires_reponse']) ? $retours['id_formulaires_reponse'] : '',
'titre' => _T_ou_typo($formulaire['titre']),
'message_retour' => formidable_raccourcis_arobases_2_valeurs_champs(

nicod@lerebooteux.fr
a validé
$options['texte_accuse'] ? $options['texte_accuse'] : $formulaire['message_retour'],
$saisies,
false,
'',
'request',
0,
$id_formulaire),
'traitements' => $traitements,
'saisies' => $options['masquer_valeurs_accuse'] ? '' : $saisies_fond_notification,

nicod@lerebooteux.fr
a validé
'valeurs' => $options['masquer_valeurs_accuse'] ? '' : $valeurs
);
$parametres_accuse = pipeline('formidable_parametres_accuse',
'args' => array('id_formulaire' => $parametres_accuse['id_formulaire'], 'id_formulaires_reponse' => $parametres_accuse['id_formulaires_reponse']),
'data' => $parametres_accuse
$html_accuse = recuperer_fond(
$accuse,
$parametres_accuse
);

pierrekuhn82@gmail.com
a validé
$texte = facteur_mail_html2text($html_accuse);

nicolas.dorigny@gmail.com
a validé
// Si un nom d'expéditeur est précisé pour l'AR, on l'utilise,
// sinon on utilise le nomde l'envoyeur du courriel principal
$nom_envoyeur_accuse = trim($options['nom_envoyeur_accuse']);
if (!$nom_envoyeur_accuse) {

nicod@lerebooteux.fr
a validé
$nom_envoyeur_accuse = $nom_site_spip;

nicolas.dorigny@gmail.com
a validé
}
$corps = array(
'html' => $html_accuse,
'texte' => $texte,
'nom_envoyeur' => filtrer_entites($nom_envoyeur_accuse),

nicolas.dorigny@gmail.com
a validé
//A fortiori, si un courriel d'expéditeur est précisé pour l'AR, on l'utilise
if ($options['courriel_envoyeur_accuse']) {
$courriel_envoyeur_accuse = $options['courriel_envoyeur_accuse'];
} else {

nicod@lerebooteux.fr
a validé
$courriel_envoyeur_accuse = $email_webmaster;

nicolas.dorigny@gmail.com
a validé
}

cedric@yterium.com
a validé

nicolas.dorigny@gmail.com
a validé
//Et on teste si on doit mettre cela en from ou en reply-to
if ($options['activer_vrai_envoyeur'] and $courriel_envoyeur_accuse) {
$courriel_from_accuse = $courriel_envoyeur_accuse;
} elseif ($courriel_envoyeur_accuse) {
$corps['repondre_a'] = $courriel_envoyeur_accuse;
$courriel_from_accuse = '';
}
// Joindre les pj si léger et nécessaire
if ($joindre_pj and _FORMIDABLE_LIENS_FICHIERS_ACCUSE_RECEPTION == false) {
$corps['pieces_jointes'] = $fichiers_facteur;
}

nicod@lerebooteux.fr
a validé
if(!$envoyer_mail($courriel_envoyeur, $sujet_accuse, $corps, $courriel_from_accuse, 'X-Originating-IP: '.$GLOBALS['ip'])){
$erreur_envoi = true;
}

nicod@lerebooteux.fr
a validé
if (!$erreur_envoi) {
if (!$args['message_retour_general']) {// Si jamais message de retour general, ne pas mettre le message de retour spécifique. Cf https://git.spip.net/spip-contrib-extensions/formidable/issues/58
$retours['message_ok'] = _T('formidable:traiter_email_message_ok');
}
$retours['message_erreur'] .= "\n"._T('formidable:traiter_email_message_erreur');
} else {
$retours['message_erreur'] = _T('formidable:traiter_email_message_erreur');
}
// noter qu'on a deja fait le boulot, pour ne pas risquer double appel
$retours['traitements']['email'] = true;

marcimat@rezo.net
a validé

maieul@maieul.net
a validé
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
/**
* Retourne la liste des destinataires mentionnés dans un ou plusieurs champs destinataires (auteur·e·s enregistré·e·s)
* @param array|str l'option champ_destinataire
* @return array la liste des mails destinataires.
**/
function formidable_traiter_email_champ_destinataires($champ) {
if (!is_array($champ)) {
$champ = array($champ);
}
//Trouver tout les id destinataires
$destinataires = array();
foreach ($champ as $c) {
$destinataires_c = _request($c);
if (!is_array($destinataires_c)) {
if (intval($destinataires_c)) {
$destinataires_c = array($destinataires_c);
} else {
$destinataires_c = array();
}
}
$destinataires = array_merge($destinataires, $destinataires_c);
}
if (count($destinataires)) {
// On récupère les mails des destinataires
$destinataires = array_map('intval', $destinataires);
$destinataires = sql_allfetsel(
'email',
'spip_auteurs',
sql_in('id_auteur', $destinataires)
);
$destinataires = array_map('reset', $destinataires);
}
return $destinataires;
}

marcimat@rezo.net
a validé
/**
* Retourne la liste des destinataires sélectionnés en fonction
* de l'option 'destinataires_selon_champ' du traitement email.

marcimat@rezo.net
a validé
* @param string $description
* Description saisie dans l'option du traitement du formulaire,
* qui respecte le schéma prévu, c'est à dire : 1 description par ligne,
* tel que `@champ@/valeur : mail@domain.tld, mail@domain.tld, ...`
* {@example : `@selection_2@/choix_1 : toto@domain.tld`}

marcimat@rezo.net
a validé
* Liste des destinataires, s'il y en a.

maieul@maieul.net
a validé
**/

marcimat@rezo.net
a validé
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
function formidable_traiter_email_destinataire_selon_champ($description) {
$destinataires = array();
// 1 test à rechercher par ligne
$descriptions = explode("\n", trim($description));
$descriptions = array_map('trim', $descriptions);
$descriptions = array_filter($descriptions);
// pour chaque test, s'il est valide, ajouter les courriels indiqués
foreach ($descriptions as $test) {
// Un # est un commentaire
if ($test[0] == '#') {
continue;
}
// Le premier caractère est toujours un @
if ($test[0] != '@') {
continue;
}
list($champ, $reste) = explode('/', $test, 2);
$champ = substr(trim($champ), 1, -1); // enlever les @
if ($reste) {
list($valeur, $mails) = explode(':', $reste, 2);
$valeur = trim($valeur);
$mails = explode(',', $mails);
$mails = array_map('trim', $mails);
$mails = array_filter($mails);
if ($mails) {
// obtenir la valeur du champ saisi dans le formulaire.
// cela peut être un tableau.
$champ = _request($champ);
if (!is_null($champ)) {
$ok = is_array($champ) ? in_array($valeur, $champ) : ($champ == $valeur);
if ($ok) {
$destinataires = array_merge($destinataires, $mails);
}
}
}
}
}
return $destinataires;
}

maieul@maieul.net
a validé
/**
* Gère une saisie de type fichiers dans le traitement par email.
* C'est à dire:
* - S'il y a eu un enregistement avant, ne déplace pas le fichier
* - S'il n'y a pas eu d'enregistrement avant, déplace le fichier
* dans un dossier nommé en fonction du timestamp du traitement
* - Renvoie un tableau décrivant les fichiers, avec une url d'action sécurisée valable seulement
* _FORMIDABLE_EXPIRATION_FICHIERS_EMAIL (sauf si cette constantes est définie à 0)

maieul@maieul.net
a validé
* @param array $saisie la description de la saisie
* @param string $nom le nom de la saisie

maieul@maieul.net
a validé
* @param int|string $id_formulaire le formulaire concerné
* @param array $retours ce qu'a envoyé le précédent traitement
* @param int $timestamp un timestamp correspondant au début du processus de création du courriel
* @return array un tableau décrivant la saisie
**/
function traiter_email_fichiers($saisie, $nom, $id_formulaire, $retours, $timestamp) {

maieul@maieul.net
a validé
//Initialisation
$id_formulaire = strval($id_formulaire);//précaution
$vue = array();

maieul@maieul.net
a validé
if (isset($retours['id_formulaires_reponse']) and $id_formulaires_reponse = $retours['id_formulaires_reponse']) { // cas simple: les réponses ont été enregistrées
if (isset($retours['fichiers'][$nom])) { // petite précaution
$options = array(

maieul@maieul.net
a validé
'id_formulaires_reponse' => $retours['id_formulaires_reponse']
);
$vue = ajouter_action_recuperer_fichier_par_email($retours['fichiers'][$nom], $nom, $options);

maieul@maieul.net
a validé
}

maieul@maieul.net
a validé
} else { // si les réponses n'ont pas été enregistrées
$vue = formidable_deplacer_fichiers_produire_vue_saisie($saisie, array('id_formulaire' => $id_formulaire, 'timestamp' => $timestamp));

maieul@maieul.net
a validé
$options = array(
'id_formulaire' => $id_formulaire,
'timestamp' => $timestamp

maieul@maieul.net
a validé
);
$vue = ajouter_action_recuperer_fichier_par_email($vue, $nom, $options);

maieul@maieul.net
a validé
}

maieul@maieul.net
a validé

maieul@maieul.net
a validé
return $vue;
}
/**
* Pour une saisie de type 'fichiers'
* insère dans la description du résultat de cette saisie
* l'url de l'action pour récuperer la saisie par email
* Ajoute également une vignette correspondant à l'extension

maieul@maieul.net
a validé
* @param array $saisie_a_modifier
* @param string $nom_saisie

maieul@maieul.net
a validé
* @param array $options options qui décrit l'endroit où est stocké le fichier
* @return array $saisie_a_modifier

maieul@maieul.net
a validé
**/

maieul@maieul.net
a validé
function ajouter_action_recuperer_fichier_par_email($saisie_a_modifier, $nom_saisie, $options) {

maieul@maieul.net
a validé
$vignette_par_defaut = charger_fonction('vignette', 'inc/');

maieul@maieul.net
a validé
if (_FORMIDABLE_EXPIRATION_FICHIERS_EMAIL > 0) {
$delai = secondes_en_jour(_FORMIDABLE_EXPIRATION_FICHIERS_EMAIL);
}
$url = formidable_generer_url_action_recuperer_fichier_email($nom_saisie, $valeur['nom'], $options);

maieul@maieul.net
a validé
$saisie_a_modifier[$i]['url'] = $url;

maieul@maieul.net
a validé
if (_FORMIDABLE_EXPIRATION_FICHIERS_EMAIL > 0) {
$saisie_a_modifier[$i]['fichier'] = $valeur['nom'];
$saisie_a_modifier[$i]['nom'] = '['._T('formidable:lien_expire', array('delai' => $delai)).'] '.$valeur['nom'];

maieul@maieul.net
a validé
} else {
$saisie_a_modifier[$i]['fichier'] = $valeur['nom'];

maieul@maieul.net
a validé
$saisie_a_modifier[$i]['nom'] = $valeur['nom'];
}
$saisie_a_modifier[$i]['vignette'] = $vignette_par_defaut($valeur['extension'], false);

maieul@maieul.net
a validé
}
return $saisie_a_modifier;
}
/**
* Supprime dans une vue de saisie 'fichiers'
* l'url de récupération par email
* et l'information sur le délai d'expiration
**/
function supprimer_action_recuperer_fichier_par_email($vue) {
if (isset($desc['url'])) {
unset($desc['url']);
}
$desc['nom'] = $desc['fichier'];
}
return $vue;
}
/**
* Dans l'ensemble de vues des saisies
* recherche les saisies 'fichiers'
* et supprime pour chacune d'entre elle les actions de récupération de fichier
* @param array $saisies
* @param array $vues
* @return array $vues
**/
function vues_saisies_supprimer_action_recuperer_fichier_par_email($saisies, $vues) {
foreach ($saisies as $saisie => $description) {
if ($description['saisie'] == 'fichiers') { // si de type fichiers
$vues[$nom_saisie] = supprimer_action_recuperer_fichier_par_email($vues[$nom_saisie]);
}
}
return $vues;
}
* d'après une saisie de type fichiers
* @param array $saisie
* @return int $taille (en octets)
**/
function formidable_calculer_taille_fichiers_saisie($saisie) {
$taille = 0;
foreach ($saisie as $k => $info) {
$taille += $info['taille'];
/**
* Converti une description d'une vue fichiers en description passable à facteur
* @param array $vue
* @return array $tableau_facteur
**/
function vue_fichier_to_tableau_facteur($vue) {
$tableau_facteur = array();
foreach ($vue as $fichier) {
$arg = base64_decode(parametre_url($fichier['url'],'arg'));
$arg = json_decode($arg, true);
$tableau_facteur[] = array(
'chemin' => formidable_generer_chemin_fichier($arg),
'nom' => $fichier['fichier'],
'encodage' => 'base64',
'mime' => $fichier['mime']);
}
return $tableau_facteur;
}

maieul@maieul.net
a validé
/**
* Retourne des secondes sous une jolie forme, du type xx jours, yy heures, zz minutes, aa secondes
* @param int $seconde
* @return str
**/
function secondes_en_jour($secondes) {
//On ne peut pas utiliser date_create, car en PHP 5.2, et SPIP 3.0 est à partir de PHP 5.1…
$jours = floor($secondes/(24*3600));
$heures = floor(($secondes-$jours*24*3600)/3600);
$minutes = floor(($secondes-$jours*24*3600-$heures*3600)/60);
$secondes = $secondes-$jours*24*3600-$heures*3600-$minutes*60;
$param = array(
'j' => $jours,

maieul@maieul.net
a validé
'm' => $minutes,
's' => $secondes
);
if ($jours > 0) {
return _T('formidable:jours_heures_minutes_secondes', $param);

maieul@maieul.net
a validé
} elseif ($heures > 0) {

maieul@maieul.net
a validé
} elseif ($minutes > 0) {

maieul@maieul.net
a validé
} else {