Classe simple email

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 822 fois - Téléchargée 17 fois

Contenu du snippet

Bonjour, ceci est ma toute première classe en php5, je conçois
qu'elle ne peut pas faire beaucoup de chose, mais elle a l'interet
de proceder à quelques petites verifications.Toutes critiques concernant
le code est bienvenue, j'aimerai bien progresser dans l'OO en php...
J'ajoute que je suis au courant qu'il est inutile de reinventer la roue,
et qu'il existe une multitude de bibliotheques trés bien faites,mais
j'ai écris ce code pour ceux qui le liront et pour moi-même dans un but
pédagogique.

Source / Exemple :


<?php

 class MyMail{
    private $exp;
    private $dest;
    private $cont;
    private $subject;
    private $confirmation ="Nothing sent yet";
    
    
    public function __construct(){}
    
    
    public function setExp($exp){
        if($this->verifAdMail($exp)){
            $this->exp=$exp;
        }
    }
    public function setDest($dest){
        if($this->verifAdMail($dest)){
            $this->dest=$dest;
        }
    }
    public function setCont($cont){
        if($this->verifCont($cont)){
            $this->cont=$cont;
        }
    }
    public function setSubject($subject){
        if($this->verifSubject($subject)){
            $this->subject=$subject;
        }
    }
    public function sendMyMail(){
        
        if(($this->verifAdMail($this->exp)&&$this->verifAdMail($this->dest)
            &&$this->verifCont($this->cont)&&$this->verifSubject($this->subject))){
            
               $this->cont .= '\n Send by : '. $this->exp;
               
               if(mail($this->dest,$this->subject,$this->cont)){
                      $this->confirmation=  "Your email have been sent";
               }else{
                      throw new Exception("An error occured during sending process ");
               }     
        } //Pas de else les messages d'erreurs concernés sont déjà géré par les 
           //exceptions des méthodes appellées dans le if.
    }
    public function getConfirmation(){
        return $this->confirmation;
    }

//---------------------------------------------------------------------------------------
// Les fonctions private maintenant : 
//---------------------------------------------------------------------------------------

    private function verifAdMail($exp){
         if($this->is_email($exp)&&$this->mail_exist($exp)){
             return TRUE;
         }
    }
    private function is_email($exp){
        if(!empty($exp)){
            if(filter_var($exp,FILTER_VALIDATE_EMAIL)==FALSE){
                
                throw new Exception('Invalid mail address');
            }else{
                return TRUE;
            }
         
        }else{
            throw new Exception('Expeditor is empty');
        }
    }
    private function mail_exist($exp){
        list($compte,$domaine)=split("@",$exp,2);
        if(!checkdnsrr($domaine,"MX")&&!checkdnsrr($domaine,"A")){
           throw new Exception('Invalid email'); //Ne fonctionne pas sous windows.
        }
        return TRUE;
    }
//-----------------------------------------------------------------------------------------
    private function verifSubject($subject){
        if(!empty($subject)){
        //On pourra plus tard créer un parametre tableau 
        //listant les sujets "interdits" etc....
        $subject = htmlspecialchars($subject);
        return TRUE;
        }else{
            throw new Exception('subject is empty');
        }
    }
    
//------------------------------------------------------------------------------------------    
    private function verifCont($cont){
        if(!empty($cont)){
        $cont = htmlspecialchars($cont);
        return TRUE;
        }else{
            throw new Exception('text area is empty');
        }
       
    }
}

?>

Conclusion :


Et voilà...Je pense à étoffer d'avantage les méthodes vérifiants le sujet et le contenu, en
ajoutant par exemple la possibilité de filtrer certains mots ou expressions etc...
J'attends vos avis.

A voir également

Ajouter un commentaire

Commentaires

cs_Odradek
Messages postés
4
Date d'inscription
mercredi 7 mai 2008
Statut
Membre
Dernière intervention
9 mai 2008

Ok je vois beaucoup mieux ce que tu veux dire maintenant !
Quand je disais "aussi fatigant", ça voulait dire que je trouvais cela équivalent (d'où le "aussi") en terme de quantité de code et pensant que tu parlais des return pour économiser du code je contre-argumentais la dessus, d'autant plus que les return sont plus évidents pour moi donc ce n'est vraiment pas une question de paresse... Maintenant effectivement je comprend mieux ton point de vue sur les exceptions.
lmame
Messages postés
12
Date d'inscription
mercredi 15 janvier 2003
Statut
Membre
Dernière intervention
9 mai 2008

Pour ce qui est de mon avis (soulant), j'ai repris ce que tu disais " cependant il me semble que mettre des return est aussi fatigant que de lancer des exceptions".
Dans mon sens saoulant = fatigant.

Sinon, y'a une erreur là:
if($exp = filter_var($exp,FILTER_VALIDATE_EMAIL))
dans le meilleur des cas, c'est ==, mais il vaut mieux tester si tu reçois false:
if(filter_var($exp,FILTER_VALIDATE_EMAIL)===false)

Pour ce qui est des exceptions, c'est simple. Une exception doit rester... une exception et non pas une règle, et puis un utilisateur ne pensera peut être pas au fait que tu ais utilisé des exceptions et soit obligé de faire un try / catch sous peine de voir planter son programme.
Imagine qu'il y ait:
prise de commande
validation de la commande
envoi d'un mail
autre traitement
s'il ne pense pas à faire un try / catch et que par malheur ta classe sorte une exception non traitée, la partie qui suit l'envoi du mail ne sera pas faite.

Maintenant, si tu as envie de bosser de cette manière, dans cette philosophie après tout pourquoi pas :) le tout c'est de choisir et de t'y tenir.
cs_Odradek
Messages postés
4
Date d'inscription
mercredi 7 mai 2008
Statut
Membre
Dernière intervention
9 mai 2008

Oups désolé, bon j'ai refait l'affectation de la confirmation, et modifié
la méthodes is_email.
(Euh sinon je ne sais pas ce qui te laisse croire que faire une classe me "saoule", c'est
une analyse tout à fait hors contexte à laquelle tu te livres en me prétant ce sentiment.)

D'autre part (je reprecise encore que la POO est trés neuve pour moi) je ne comprends
pas pourquoi faire des return serait plus pratique que faire des exceptions, quand doit
on décider d'utiliser des exceptions et pour quelles raisons ? Quel type de contraintes
apporte un try/catch à l'utilisateur?
Je tiens à préciser que ce sont des vrais et candides questions...
lmame
Messages postés
12
Date d'inscription
mercredi 15 janvier 2003
Statut
Membre
Dernière intervention
9 mai 2008

Bah si c'est juste pour faire un exemple, ok.
Ceci dit, pour les exceptions, je trouvais juste lourdingue d'obliger l'utilisateur de ta classe à utiliser un try / catch dans le code principal, c'est tout :)

Ceci dit, tu utilises $confirmation dans ta classe, mais il n'est jamais initialisé, il sert à quoi?
A moins que ce soit le résultat du mail?
return "Your email have been sent";
dans ce cas il faudrait plutôt faire: $this->confirmation="Your email have been sent";

-> Bon, sinon ça sert pas à grand chose de faire le ==TRUE:
if(($this->verifAdMail($this->exp)&&$this->verifAdMail($this->dest)
&&$this->verifCont($this->cont)&&$this->verifSubject($this->subject))==TRUE
soit tu ne mets rien (pas de ==TRUE), soit tu mets ===TRUE pour vérifier qu'en plus c'est un booléen, mais bon, très honnêtement vu que c'est ton code, tu peux t'en dispenser.
D'autre part, comme tu mets des throw exception partout au cas où la vérification échoue on se demande même si ça sert à quelque chose de mettre ça dans un if? Autant faire appel aux méthodes directement vu que ta classe va "planter" en cas de problème.
$this->verifAdMail($this->exp);
$this->verifAdMail($this->dest);
$this->verifCont($this->cont);
$this->verifSubject($this->subject);

-> Ensuite, pour ta vérification d'email:
private function is_email($exp){
if(!empty($exp)){
$exp = filter_var($exp,FILTER_VALIDATE_EMAIL);
Ca peut ne pas être correct. En effet filter_var renverra bien un email dans le cas où $exp est un mail correct, mais il peut également renvoyer un booléen false si le check a échoué! Dans ce cas $exp ne sera pas empty mais $exp sera failse mais ta fonction renverra true...
D'autre part, tu changes la valeur de $exp, ce qui pourrait poser soucis par la suite...

Pour les fonctions non compatibles Windows, tu peux déjà voir si elles sont accessibles par des tests sur l'existence des fonctions.

Comme disait mon prof d'informatique: "un bon programmeur est un fainéant, il fait aussi peu de code possible." mais ça n'est pas à prendre non plus au pied de la lettre. Si déjà faire une classe te saoule (return) imagine plus tard dans un vrai soft... Tu ne vas pas pouvoir caser des exceptions de partout sinon imagine la tronche de ton code.
cs_Odradek
Messages postés
4
Date d'inscription
mercredi 7 mai 2008
Statut
Membre
Dernière intervention
9 mai 2008

J'ai pas eu le temps de tout modifier, j'ai tenu cependant compte de vos deux commentaires.
Concernant la fonction mail, et la fonction checkdnsrr j'étais au courant et c'est un choix par facilité, cette classe n'étant destinée qu'à m'apprendre à correctement créé des classes, de plus l'existence de classes trés complètes comme celle de phpguru me fait penser qu'il n'est pas nécessaire de s'investir plus que de mesure dans celle-ci.

LMAME :Que penses-tu de mes nouvelles vérifications dans la méthode sendMail()?
Concernant les exceptions, il s'est agit pour moi d'apprendre à m'en servir,
cependant il me semble que mettre des return est aussi fatigant que de lancer
des exceptions.De plus les exceptions étant placé maintenant dans les méthodes
de vérifications cela me fait économiser un peu de code (ou pas ?).

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.