Version : 0.2 du 10 décembre 2004
Version de
WikiNi Supporté : 0.4.3
Voici une action pour permettre à un visiteur (connecté ou anonyme) d'envoyer un courriel vers un utilisateur enregistré sans afficher l'adresse email de ce dernier. L'adresse de l'utilisateur ne sera pas connue de l'émetteur sauf en cas de réponse du destinataire.
L'action est décomposée en 2 parties :
- Une action {{MailToUser user="UnUtilisateurWiki"}} a inclure dans une page.
- Une methode (handler) sendmailtouser pour l'envoi du mail avec la fonction mail() de php.
Pour utiliser cette action il faut ajouter 2 fichiers :
- action/mailtouser.php
- handlers/page/sendmailtouser.php
Fichier action/mailtouser.php
<?PHP
// Action pour permettre d'envoyer des mails à un utilisateur
// Licence GPL
// Version 0.1 : 8 dec 2004 Olivier Boyaval
// Version 0.2 : 10 dec 2004 Olivier Boyaval (mailtouser.php : modif pour code xhtml valide + test de l'existance de l'utilisateur).
// Contrôle pour être sûr que l'action est bien appelée par WikiNi
if (!defined("WIKINI_VERSION"))
{
die ("accès direct interdit");
}
// Récupération des paramètres
$usertomail = $this->GetParameter("user");
//$url = $this ->href('sendmailtouser', $this -> GetPageTag());
// Traitements
// Si le paramètre page est vide ou non spécifié on affiche "Le paramètre "user" est manquant."
if (!$this->GetParameter("user"))
{
echo $this->Format("//Le paramêtre \"user\" est manquant.//");
}
//on teste l'existance de l'utilisateur
elseif (!$this->LoadSingle("select name from ".$this->config["table_prefix"]."users where name ='".$usertomail."'"))
{
echo $this->Format("//L'utilisateur ".$usertomail." n'existe pas. L'ActionMailToUser ne peut pas fonctionner//");
}
// Sinon on affiche le formulaire d'envoi du mail
else
{
echo $this->FormOpen("sendmailtouser");
?>
<input type="hidden" name="user" value="<?PHP echo $usertomail; ?>"/>
<h3>Envoi d'un courriel à <?PHP echo $usertomail; ?></h3>
Adresse E-mail de l'expéditeur
<br />
<input type="text" name="email" size="50" maxlength="70" />
<br />
Titre du message
<br />
<input type="text" name="titre" size="50" maxlength="70" />
<br />
Message
<br />
<textarea name="message" cols="55" rows="8">
</textarea>
<br />
<br />
<input type="submit" name="bouton" value="Envoyer" />
<?PHP
echo $this->FormClose();
//</form>
}
?>
Fichier handlers/page/sendmailtouser.php
<?php
// Handler pour envoyer des mails à un utilisateur par la fonction mail() de php
// Licence GPL
// Version 0.1 : 8 dec 2004 Olivier Boyaval
// Version 0.2 : 10 dec 2004 Olivier Boyaval (mailtouser.php : modif pour code xhtml valide + test de l'existance de l'utilisateur).
//test du format de l'email
//cette fonction n'est pas de moi mais trouvé je ne sais plus où :o(
function mailOk($email) {
$ASCII="[[:graph:]]";
$CHAINE="^$ASCII{5,40}$";
$CARACTERE='[^]()<>@,;:\.["]';
$ATOME="$CARACTERE+";
$NOM="$ATOME(\\.$ATOME)*";
$DOMAINE="$ATOME(\\.$ATOME)*";
$ADRESSE="^$NOM@$DOMAINE$";
if (empty($email))
return FALSE;
else
return ereg($CHAINE,$email) && ereg($ADRESSE,$email);
}
// On teste si le script n'est pas appelé en direct
if (!defined("WIKINI_VERSION"))
{
die ("accès direct interdit");
}
// Affiche l'en-tête
echo $this->Header();
//Utilisation de la classe CSS de mise en forme des pages
echo "<div class=\"page\">";
// On teste si l'utilisateur peut lire la page
if (!$this->HasAccess("read"))
{
echo $this->Format("//Vous n'avez pas accès à cette page !//");
}
else
{
// On teste si l'adresse mail de l'expéditeur a un format correct
if (!mailOk($_POST["email"]))
echo $this->Format("//Votre adresse mail est incorrecte//");
elseif (empty($_POST["titre"]))
echo $this->Format("//il manque le titre du message//");
elseif (empty($_POST["message"]))
echo $this->Format("//il manque le corps du message//");
else
{
$user = $this->LoadSingle("select email from ".$this->config["table_prefix"]."users where name ='".$_POST["user"]."'");
if (!mailOk($user["email"]))
echo $this->Format("//L'adresse mail de votre destinataire n'est pas valide//");
else
{
$headers="From: ".$_POST["email"];
$erreur=mail($user["email"], $_POST["titre"], $_POST["message"], $headers);
if ($erreur)
echo $this->Format("//courriel envoyé à ".$_POST["user"]."//");
else
echo $this->Format("//**PB** courriel non envoyé à ".$_POST["user"]."---Code erreur ".$erreur."//");
}
}
}
//affiche le pied de page complet
echo "</div>";
echo $this->Footer();
?>
Bogues
Pas de bug connus pour l'instant
testé avec la version 0.4.3 de
WikiNi et fonctionne chez Free (limite 1000 mail par semaine).
- le code HTML n'est pas valide : <input type="text" name="titre" size=50 maxlength=70 /> : en XHTML, tous les attributs doivent être entre guillemets. -- CharlesNepote
- Tu as raison je vais corriger cela à la prochaine version -- OlivierB
- Fait dans la v 0.2 : résultat du test : This Page Is Valid XHTML 1.0 Transitional! ;o) -- OlivierB
Discussion
Je voulais déjà faire une action comme cela, je pense que c'est possible de le faire avec un seul fichier dans l'action (sans handler) cependant est-ce réellement utile de tester l'adresse mail, ne serait-il pas plus judicieux de voir s'il est possible de modifier le module d'enregistrement des utilisateurs pour cela (histoire de réaliser le contrôle à la source).
Si tu veux on peut s'y mettre ensemble sinon je développe dans mon coin et on compare après...
NOTA: j'avais détourné un CGI de LaPoste.net pour réaliser ça sur mon ancien site ça marchait pas mal.
--
Nicephore17
L'
ActionUserSettings est un bon exemple pour faire toute l'opération au niveau de l'action. Je n'ai pas choisi cette solution là c'est tout ;o) maintenant tout peut être améliorer en effet.
Pour la vérification du mail :
- celui de l'expéditeur est obligatoire mais il peut toujours mentir. Dans ce cas il n'aura pas de réponse possible.
- celui du destinataire moins. Pour l'instant l''ActionUserSettings ne permet pas de vérifier que l'adresse est vraiment réelle (seul un mail de confirmation le pourrait). Il faudrait modifier en profonfeur le fonctionnement de cette action, c'est un chantier important car il faut proposer plusieurs modes de fonctionnement (celui actuel sans confirmation mail, confirmation mail avec activation, ...) paramétrable par l'administrateur.
--
OlivierB
J'ai toujours pensé que ça servait à rien de vérifier la "validité (syntaxique)" d'une adresse mail, tu as raison, seul l'envoi d'une confirmation par mais est vraiment valable. Quelques point que je voulais évoquer...
- Si on me demande mon email et que je ne veux pas le donner, en général je met zsfsqd@fdqsfqs.com et ça marche...
- Si l'utilisateur ne veut pas qu'on le contacte il n'y a rien a faire.
- Tout dépend du but de l'action, mais ça me plairait pour que mes visiteurs me mail moi et non pas eu entre eux...
- Dans cette optique, pourquoi par faire une action qui prendrait pour destinataire le mail du propriétaire de la page...?
- Je crois que je vais prendre cette direction... :D
- -- Nicephore17
Là que j'y pense j'hésite en fait on peut faire pas mal de trucs... comme:
- Une action avec en paramètre le nom de l'utilisateur à contacter comme {{sendmail to="nicephore17"}}
- Dans ce cas il faut vérifier l'existence de l'utilisateur nicephore17 puis trouver son mail
- Une action avec en paramètre... rien du tout et là je vois 2 solutions (en ne vérifiant pas - par choix - l'adresse entrée à la création d'un compte):
- Proposer une liste déroulante avec tous les noms des utilisateurs (ça peut être long) puis les traduire en adresse e-mail
- Considéré que le destinataire est le propriétaire de la page (pas très sécurisé: on peut créer une page puis la "donner" à kk'un d'autre)
Finalement je sais pas trop quoi faire bien que la dernière solution me plaise beaucoup: il suffirait alors de rajouter une action formatée comme
{{MailezMoi}} sur sa "page perso".
Ca me semblerait logique: je veux contacter quelqu'un, je click sur sa page et hoooo... il propose qu'on le mail avec un boooooo formulaire.
Il est tard, je veux pas lancer ce soir, je vais aller me coucher et penser à tout ça, si vous avez des suggestions je suis preneur... Depuis que j'ai déménagé de LaPoste.net, c'est une fonctionnalité qui me manque beaucoup.
Tiens au fait tu as raison, j'ai oublié un test sur l'existance de l'utilisateur :(
je le rajouterai dans l'action dès que j'aurai un moment.
fait dans la v 0.2 -- OlivierB
Les objectifs de cette action sont très simples :
- Permettre d'envoyer des courriels aux utilisateurs sans qu'ils soient obligés de mettre leurs adresses en clair.
- Ne jamais afficher l'adresse de l'utilisateur : Si un utilisateur reçoit un courriel qui ne l'intéresse pas il le met à la poubelle et l'expéditeur ne connaîtra pas l'adresse. Si l'adresse de l'expéditeur est fausse il ne pourra pas avoir de réponse.
- N'apporter aucune modification à WikiNi pour être simple à installer.
- Etre la plus simple possible pour ne pas charger inutilement le serveur.
- Etre totalement optionnel, si on veut cette action on l'installe sinon on ne l'installe pas ;o)
Améliorations envisageables :
- Ajouter une information dans la table users qui pour, chaque utilisateur, autorise ou non les anonymes et les connectés de lui envoyer des courriels. Ce paramétrage ce ferait par l'ActionUserSettings.
- Vérifier dans l'action si l'utilisateur veux recevoir ou non des courriels.
Cela demanderai une refonte de l'
ActionUserSettings donc à voir.
--
OlivierB
Bon mon avis du matin....
- Pour faire simple il me semble que tout centraliser dans un seul fichier actions serait judicieux.
- Je reste sur l'idée que le destinataire soit le owner de la page (Notion de je veux qu'on me mail donc je rajoute l'action sur ma page)
- Modifier le ActionUserSettings je suis contre (pour le moment car j'envisage de developper une mailing list conditionnée par l'acceptation des utilisateurs qui cocheront une case dans ActionUserSettings s'ils sont OK)
Je propose de développer mon action dans la semaine (j'ai vraiment pas beaucoup de temps, je suis nul en programmation et je suis aussi sur
ActionNewTextSearch) Elle s'appellera MailMe ou EcrivezMoi. On confrontera après OK?
--
Nicephore17
Sans problème. Mon choix de faire une action + un handler est motivé par la raison suivante : je ne voulais pas que le message d'envoi ou d'erreur soit noyé dans le reste de la page. Si tu écris une action pour envoyer un mail au propriétaire de la page, elle doit être indépendante de l'
ActionMailToUser - Le but n'est pas le même ;o)
--
OlivierB
Nicephore17 vous informe qu'il a écrit
DiscussionsActionEcrivezMoi