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

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

maieul@maieul.net
a validé
$timestamp = time();
$formulaire = $args['formulaire'];
$options = $args['options'];
$saisies = unserialize($formulaire['saisies']);
$traitements = unserialize($formulaire['traitements']);
$champs = saisies_lister_champs($saisies);

marcimat@rezo.net
a validé
$destinataires = array();

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

marcimat@rezo.net
a validé
if (!is_array($destinataires)) {
if (intval($destinataires)) {
$destinataires = array($destinataires);
} else {
$destinataires = array();
}

marcimat@rezo.net
a validé
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);
}
}

marcimat@rezo.net
a validé

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);
$destinataires = array_unique($destinataires);
}

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 = array_unique($destinataires);
}
}
// On récupère le courriel de l'envoyeur s'il existe
$courriel_envoyeur = _request($options['champ_courriel']);
}
// 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_site_spip = supprimer_tags(typo($GLOBALS['meta']['nom_site']));
// On parcourt les champs pour générer le tableau des valeurs
$valeurs = array();

maieul@maieul.net
a validé
$saisies_fichiers = saisies_lister_avec_type($saisies,'fichiers');// On utilise pas formulaires_formidable_fichiers, car celui-ci retourne les saisies fichiers du formulaire dans la base… or, on sait-jamais, il peut y avoir eu une modification entre le moment où l'utilisateur a vu le formulaire et maintenant

maieul@maieul.net
a validé
if (array_key_exists($champ, $saisies_fichiers)) {// si on a affaire à une saisie de type fichiers, on traite à part
$valeurs[$champ] = traiter_email_fichiers($saisies_fichiers[$champ], $champ, $formulaire['id_formulaire'], $retours, $timestamp);

maieul@maieul.net
a validé
} else {
$valeurs[$champ] = _request($champ);
}
if (preg_match_all('/@[\w]+@/', $options['champ_nom'], $a_remplacer)) {
foreach ($a_remplacer as $cle => $val) {
$a_remplacer[$cle] = trim($val, '@');
}
$a_remplacer = array_flip($a_remplacer);
$a_remplacer = array_intersect_key($valeurs, $a_remplacer);
$a_remplacer = array_merge($a_remplacer, array('nom_site_spip' => $nom_site_spip));
}
$nom_envoyeur = trim(_L($options['champ_nom'], $a_remplacer));
}
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
if (preg_match_all('/@[\w]+@/', $options['champ_sujet'], $a_remplacer)) {
foreach ($a_remplacer as $cle => $val) {
$a_remplacer[$cle] = trim($val, '@');
}
$a_remplacer = array_flip($a_remplacer);
$a_remplacer = array_intersect_key($valeurs, $a_remplacer);
$a_remplacer = array_merge($a_remplacer, array('nom_site_spip' => $nom_site_spip));
}
$sujet = trim(_L($options['champ_sujet'], $a_remplacer));
}
$sujet = _T('formidable:traiter_email_sujet', array('nom'=>$nom_envoyeur));
}
if (find_in_path('notifications/formulaire_'.$formulaire['identifiant'].'_email.html')) {
$notification = 'notifications/formulaire_'.$formulaire['identifiant'].'_email';
$notification = 'notifications/formulaire_email';
// 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,

real3t@gmail.com
a validé
'valeurs' => $valeurs,
'ip' => $options['activer_ip']?$GLOBALS['ip']:''

pierrekuhn82@gmail.com
a validé
include_spip('facteur_fonctions');
$texte = facteur_mail_html2text($html);
// On utilise la forme avancé de Facteur
$corps = array(
'html' => $html,
'texte' => $texte,

rastapopoulos@spip.org
a validé
'nom_envoyeur' => filtrer_entites($nom_envoyeur),
// 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;
} else if ($courriel_envoyeur) {

cedric@yterium.com
a validé
$corps['repondre_a'] = $courriel_envoyeur;
}
$envoyer_mail = charger_fonction('envoyer_mail', 'inc');
if ($destinataires) {
$ok = $envoyer_mail($destinataires, $sujet, $corps, $courriel_from, 'X-Originating-IP: '.$GLOBALS['ip']);
}
// Si c'est bon, on envoie l'accusé de réception
if ($ok and $courriel_envoyeur and $options['activer_accuse']) {
// On récupère le sujet s'il existe sinon on le construit
if (preg_match_all('/@[\w]+@/', $options['sujet_accuse'], $a_remplacer)) {
foreach ($a_remplacer as $cle => $val) {
$a_remplacer[$cle] = trim($val, '@');
}
$a_remplacer = array_flip($a_remplacer);
$a_remplacer = array_intersect_key($valeurs, $a_remplacer);
$a_remplacer = array_merge($a_remplacer, array('nom_site_spip' => $nom_site_spip));
}
$sujet_accuse = trim(_L($options['sujet_accuse'], $a_remplacer));
}
if (!$sujet_accuse) {
$sujet_accuse = _T('formidable:traiter_email_sujet_accuse');
}
$sujet_accuse = filtrer_entites($sujet_accuse);
// 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']);
$nom_envoyeur_accuse = $nom_envoyeur;
}
//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'];
$courriel_envoyeur_accuse = $courriel_envoyeur;
}
//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 = '';
}
if (find_in_path('notifications/formulaire_'.$formulaire['identifiant'].'_accuse.html')) {
$accuse = 'notifications/formulaire_'.$formulaire['identifiant'].'_accuse';
$accuse = 'notifications/formulaire_accuse';
// On génère l'accusé de réception
$html_accuse = recuperer_fond(
$accuse,
array(
'id_formulaire' => $formulaire['id_formulaire'],
'titre' => _T_ou_typo($formulaire['titre']),
'message_retour' => $formulaire['message_retour'],
'traitements' => $traitements,
'saisies' => $saisies,
'valeurs' => $valeurs
)
);

pierrekuhn82@gmail.com
a validé
$texte = facteur_mail_html2text($html_accuse);
$corps = array(
'html' => $html_accuse,
'texte' => $texte,
'nom_envoyeur' => filtrer_entites($nom_envoyeur_accuse),

cedric@yterium.com
a validé
$ok = $envoyer_mail($courriel_envoyeur, $sujet_accuse, $corps, $courriel_from_accuse, 'X-Originating-IP: '.$GLOBALS['ip']);
if (isset($retours['message_ok'])) {
$retours['message_ok'] .= "\n"._T('formidable:traiter_email_message_ok');
} else {
$retours['message_ok'] = _T('formidable:traiter_email_message_ok');
}
if (isset ($retours['message_erreur'])) {
$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é
/**
* Retourne la liste des destinataires sélectionnés en fonction
* de l'option 'destinataires_selon_champ' du traitement email.
*
* @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`}
* @return array
* Liste des destinataires, s'il y en a.

maieul@maieul.net
a validé
**/

marcimat@rezo.net
a validé
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
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);
$destinataires = array_unique($destinataires);
}
}
}
}
}
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

maieul@maieul.net
a validé
* - 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
**/

maieul@maieul.net
a validé
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(
'id_formulaire' => $id_formulaire,
'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));
$options = array(
'id_formulaire' => $id_formulaire,
'timestamp' => $timestamp
);
$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

maieul@maieul.net
a validé
* return array $saisie_a_modifier
**/

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/');
$pass = secret_du_site();
$action = "formidable_recuperer_fichier_par_email";

maieul@maieul.net
a validé
if (_FORMIDABLE_EXPIRATION_FICHIERS_EMAIL > 0) {
$delai = secondes_en_jour(_FORMIDABLE_EXPIRATION_FICHIERS_EMAIL);
}

maieul@maieul.net
a validé
foreach ($saisie_a_modifier as $i => $valeur){

maieul@maieul.net
a validé
if (isset($options['id_formulaires_reponse'])) {//si reponses enregistrées
$arg = serialize(array(
'formulaire' => strval($options['id_formulaire']),
'reponse' => strval($options['id_formulaires_reponse']),
'fichier' => $valeur['nom'],
'saisie' => $nom_saisie
));
} elseif (isset($options['timestamp'])) {//si par timestamp
$arg = serialize(array(
'formulaire' => strval($options['id_formulaire']),
'timestamp' => strval($options['timestamp']),
'fichier' => $valeur['nom'],
'saisie' => $nom_saisie
));
} else { //si ni timestamp, ni réponse enregistrée -> on passe notre chemin

maieul@maieul.net
a validé
continue;
}

maieul@maieul.net
a validé
$hash = _action_auteur("$action-$arg", '', $pass, 'alea_ephemere');
$url = generer_url_action($action, "arg=$arg&hash=$hash", true, true);
$saisie_a_modifier[$i]['url'] = $url;

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

maieul@maieul.net
a validé
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
443
444
445
446
447
$saisie_a_modifier[$i]['vignette'] = $vignette_par_defaut($valeur['extension'],false);
}
return $saisie_a_modifier;
}
/**
* 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,
'h' => $heures,
'm' => $minutes,
's' => $secondes
);
if ($jours > 0) {
return _T('formidable:jours_heures_minutes_secondes',$param);
} elseif ($heures > 0) {
return _T('formidable:heures_minutes_secondes',$param);
} elseif ($minutes > 0) {
return _T('formidable:minutes_secondes',$param);
} else {
return _T('formidable:secondes',$param);
}
}