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

maieul@maieul.net
a validé
include_spip('inc/formidable_fichiers');
function traiter_email_dist($args, $retours) {
if (!isset($retours['fichiers'])) {
$retours['fichiers'] = array();
} else {
}

maieul@maieul.net
a validé
$timestamp = time();
$retours['timestamp'] = $timestamp;
$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();
$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 = saisies_supprimer($saisies,$champ_a_exclure);
}
}
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();

nicolas.dorigny@gmail.com
a validé
$valeurs_libellees = array();
$saisies_fichiers = saisies_lister_avec_type($saisies, 'fichiers');

nicolas.dorigny@gmail.com
a validé
$saisies_par_nom = saisies_lister_par_nom($saisies);
// 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);
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])
);

maieul@maieul.net
a validé
} else {

rastapopoulos@spip.org
a validé
// On récupère la valeur postée

maieul@maieul.net
a validé
$valeurs[$champ] = _request($champ);
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// Le champ est un tableau objet ? on le parse
if (is_array($valeurs[$champ])) {
// si on ne demande pas la valeur brute
if (
isset($saisies_par_nom[$champ]['options']['datas'])
and $labels_data = saisies_aplatir_tableau(saisies_chaine2tableau($saisies_par_nom[$champ]['options']['datas']))
and !$options['champ_sujet_valeurs_brutes']
) {
$valeurs_libellees[$champ] = array();
foreach ($valeurs[$champ] as $valeur) {
$valeurs_libellees[$champ][] = $labels_data[$valeur];
}
$valeurs_libellees[$champ] = implode($valeurs_libellees[$champ], ",");
}
// Sinon on utilise directement la valeur postée
else {
$valeurs_libellees[$champ] = implode($valeurs[$champ],",");
}
// Si la saisie a une valeur unique
} else {
// Si la saisie est une liste de choix avec des clés et labels humains, on cherche le label humain, sauf si la case champ_sujet_valeurs_brutes est cochée dans la config du traitement
if (
isset($saisies_par_nom[$champ]['options']['datas'])
and $labels_data = saisies_aplatir_tableau(saisies_chaine2tableau($saisies_par_nom[$champ]['options']['datas']))
and isset($labels_data[$valeurs[$champ]])
and !$options['champ_sujet_valeurs_brutes']
) {
$valeurs_libellees[$champ] = $labels_data[$valeurs[$champ]];
}
// Sinon on utilise directement la valeur postée
else {
$valeurs_libellees[$champ] = $valeurs[$champ];
}

nicolas.dorigny@gmail.com
a validé
}

maieul@maieul.net
a validé
}
}
// On récupère le nom de l'envoyeur
if (preg_match_all('/@[\w]+@/', $options['champ_nom'], $a_remplacer)) {
foreach ($a_remplacer as $cle => $val) {
$a_remplacer[$cle] = trim($val, '@');
}

nicolas.dorigny@gmail.com
a validé
$a_remplacer = array_intersect_key($valeurs_libellees, $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, '@');
}

nicolas.dorigny@gmail.com
a validé
$a_remplacer = array_intersect_key($valeurs_libellees, $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';
// 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,

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

maieul@maieul.net
a validé
'masquer_liens' => $options['masquer_liens'],
'ip' => $options['activer_ip']?$GLOBALS['ip']:''

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');
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, '@');
}

nicolas.dorigny@gmail.com
a validé
$a_remplacer = array_intersect_key($valeurs_libellees, $a_remplacer);
$a_remplacer = array_merge($a_remplacer, array('nom_site_spip' => $nom_site_spip));
}
$sujet_accuse = trim(_L($options['sujet_accuse'], $a_remplacer));
}
$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);
$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);

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) {
$nom_envoyeur_accuse = $nom_envoyeur;
}
$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 {
$courriel_envoyeur_accuse = $courriel_envoyeur;
}

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;
}
$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');
}
$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.

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é
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
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
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
* - 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 = unserialize(parametre_url($fichier['url'],'arg'));
$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 {