begin process at 2013 06 19 14:26:27
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

E-Mail / Messagerie

 > CLASSE SIMPLE EMAIL

CLASSE SIMPLE EMAIL


 Information sur la source

Note :
Aucune note
Catégorie :E-Mail / Messagerie Classé sous :email, classe, php5, php, débutant Niveau :Débutant Date de création :08/05/2008 Date de mise à jour :12/05/2008 23:14:18 Vu :6 148

Auteur : Odradek

Ecrire un message privé
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 Description

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

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


 Historique

09 mai 2008 20:37:40 :
Première modifications légères car peu de temps...
09 mai 2008 21:57:04 :
corrections de quelques betises.
09 mai 2008 22:49:23 :
re-correction
12 mai 2008 23:14:18 :
::

 Sources de la même categorie

Source avec Zip MULTIMAILER par aladec2007
Source avec Zip Source avec une capture FORM TO MAIL AVEC PROTECTION PAR TOKEN ET CAPTCHA CONTRÔLES ... par cod57
Source avec Zip Source avec une capture FORMULAIRE VERS COURRIEL BASIQUE AVEC CONTRÔLE CAPTCHA ANTI ... par cod57
Source avec Zip CHAT EN PHP ET JQUERY par pitchoubrazil
Source avec Zip Source avec une capture FORMULAIRE DE CHOIX MULTI-CONTACT VALIDE XHTML 1.0 TRANSITIO... par aventurier19

 Sources en rapport avec celle ci

VÉRIFICATION D'UN EMAIL EN PHP (EXPRESSIONS RÉGULIÈRES/PCRE) par younesherlock
Source avec une capture CLASSE CONSTRUCTEUR DE TABLEAU HTML EN PHP (REVU ET CORRIGÉ) par demonstorm
Source avec Zip Source avec une capture GÉNÉRATION DE FORMULAIRES HTML PERSONNALISÉS. par beejeridou
Source avec Zip Source avec une capture CLASSE DE MESSAGERIE par janhsh
Source avec Zip FORMULAIRE PERMETTANT D'ENVOYER UN E-MAIL (AVEC PIÈCES JOINT... par triumphs

Commentaires et avis

Commentaire de depression le 08/05/2008 13:11:22

Allez, j'y go pour les critiques:

- Tu devrais faire preuve de constance sur le nom de tes méthodes. Des fois tu notes fooBar, et d'autres FooBar. Il faut que tu définisses et que tu suives une convention de nommage stricte.
- Pour la forme, tu devrais quand même écrire un constructeur, même s'il est vide.
- Ta regexp d'email est trop stricte. Beaucoup de mails valides pourraient ne pas passer. Puisque tu es en PHP5, tu pourrais utiliser l'extension Filter apparue depuis PHP5.2


Bien, voici ce que tu devrais coder pour la suite:
- Gestion d'envoi de mails en HTML
- Gestion d'envoi de pièces jointes
- Envoi de mail en passant par un serveur SMTP

Commentaire de Odradek le 08/05/2008 13:31:14

Merci pour tes précieuse remarques, je re-editerai prochainement le code,pour mettre en oeuvre tes conseils.

Commentaire de lmame le 09/05/2008 12:28:44

Quelques remarques aussi de mon côté ^_^
-> Tu utilises des fonctions checkdnsrr qui ne fonctionnent pas sous Windows (cf help PHP),
-> l'utilisation de "mail" est parfois bridée chez les hébergeurs et peut virer au cauchemar dans le cadre d'un serveur perso, donc je rejoins depression, prévois un cas où tu peux utiliser un serveur SMTP avec login / mot de passe,
-> tu encapsules ton code dans un if pour l'envoi du mail:
        if(!empty($this->exp)
        &&!empty($this->dest)
        &&!empty($this->cont)
        &&!empty($this->subject)){
  autant faire un return si une des variables est empty (à la première), le code sera plus lisible, ça fait une indentation pour rien là, d'autant plus qu'au final tu testes les variables deux fois avec le else ensuite.

-> je pense qu'il manque aussi la gestion des erreurs dans tes "set":
    public function setDest($dest){
        if($this->verifAdMail($dest)){
            $this->dest=$dest;
        }
    }
Si le $dest est incorrect, le $this->dest sera donc à "" et dans le meilleur des cas ton utilisateur aura un message "Le champ du destinataire est vide". Or il était pas vide, il était incorrect.
Bref peut être que tes setxxx devraient revoyer true ou false (ou un message d'erreur) selon que la verif a marché ou non. Comme ça tu pourrais dire à l'utilisateur "adresse mail incorrecte" ou un truc dans le genre.

Dans ton code "principal":
-> tu fais un try / catch dans ton code. C'est sympa, mais un peu inutile à mon sens. Si le mail n'a pas été envoyé, renvoie un booléen ou un message texte plutôt par un return classique.
D'autre part, sauf erreur je vois qu'en cas de mail envoyé avec succès tu utilises $this->message... Or cette variable n'est jamais utilisée (dans le code principal ou la classe), ni même définie dans la classe?

Bref un return "mail envoyé avec succès" ou return "erreur lors de l'envoi du mail" me semble suffisant. Lever une exception pour ce style de code me paraît too much, surtout si quelqu'un utilise ta classe ensuite.

Commentaire de depression le 09/05/2008 16:15:53

LMAME: tes remarques sont pertinentes, mais faire un return quand un attribut est vide n'est pas la meilleure solution à mon goût. Je pense qu'il vaudrait mieux déclencher une exception.

Commentaire de lmame le 09/05/2008 18:01:43

Bah s'il aime tant que ça les exceptions et que c'est une "règle" dans son code, ok.
C'est juste que je sais que je n'utiliserai pas une classe en l'état qui ne fonctionnerait qu'avec ça, ça revient à écraser une fourmi avec un caterpillar.
Il y a évidemment d'autres solutions comme le "message" qu'il appliquait avant qui pourrait contenir le message d'erreur (ou de validation) et les méthodes renvoyer dans ce cas un booléen en cas de succès / échec. Mais bon, après c'est une religion personnelle je suppose ^_^

Commentaire de Odradek le 09/05/2008 20:52:20

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 ?).

Commentaire de lmame le 09/05/2008 21:20:30

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.

Commentaire de Odradek le 09/05/2008 22:06:13

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...

Commentaire de lmame le 09/05/2008 22:24:33

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.

Commentaire de Odradek le 09/05/2008 22:43:43

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.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

VOUS VOULEZ DE L'AIDE? J'AI DES RÉPONSES [ par SmallToad ] Bonjour,Depuis quelque temps, je n'ai pas beaucoup d'email de fan qui me demande des questions sur le MySQL ou sur le PHP. C'est pourquoi que j'ai mis Tableau en php(débutant) [ par iomega ] Bonjour à tous je suis débutant en php et je voudrai manipuler un tableau voici mon problèmele tableau $tab100 contient des valeurs 0.125,0.25 etc...j Débutant que je suis et gros problème en perspective !!! [ par rodolf ] G un gros problème, je débute en php, mais le problème c que (par ex) je mets ds le bloc note:&lt;? print"salut";etc ...Et si je l' ouvre avec l' e formulaire pour e-mail invisible [ par pyranhaz ] Bonjour,Je cherche à élaborer un formulaire php afin que les clients de mes petites annonces puissent envoyer leur réponse sans connaître le e-mail du probleme de classe en php [ par Elkaire ] Donc voila mon probleme!!dans une premiere page je rensegne les insances de mon objet. Une fois renseigné je peux réutiliser les instances cet objet d email + php [ par lpikachu58 ] Comment on fait pour envoyer un mail avec php?be linux differnec entre php 4 et php5 [ par hardelgylls ] Bonjourpetite question :j'ai passer un oral et l'examinateur m'a demandé quel était la différence entre php4 et php5. et la gros blanc, est ce que qqu Doc PHP5 sniff sniff [ par slhuilli ] Bonjour, Bonsoir,Je suis a la recherche d'un PDF qui recenserait les mots-clefs + explications (bref un bouquin complet) sur PHP 5 qui parait-il est Question de débutant... [ par ReMi34 ] Alors voilà, il y a quelques jours, j'ai décidé de me mettre au PHP, mais problème, je ne sais pas trop ce qu'il faut faire pour avoir sa base de donn débutant en php comprend pas la fct mail... [ par Emoutheos ] moutheo Voili voilà. Je suis débutant en PHP (et même carrément nul) mais pour l'école (je fais des etudes d'informatique), je dois developper un site


Nos sponsors


Sondage...

CalendriCode

Juin 2013
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,652 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales