IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez / Téléchargez Sources et Outils PHP Discussion :

Une classe de Mail


Sujet :

Contribuez / Téléchargez Sources et Outils PHP

  1. #1
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut Une classe de Mail
    Bonjour à tous.

    Introduction


    Je vous propose une classe pour l'envoi d'Emails.

    Fonctionnalités


    Cette classe supporte
    - La définition du sender (from)
    - Les mails multipart
    - Les pièces-jointes
    - Le HTML
    - L'envoi multiple (to)
    - La définition arbitraire de headers

    Son code vous est disponible en pièce jointe de ce post.

    Comment l'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    require_once "Mail.class.php";
     
    // Créer un nouvel email
    $mail = new Mail('postmaster@bdelespierre.fr', 'benjamin.delespierre@gmail.com', "test");
     
    // Ajouter une partie textuelle
    // qui ne sera affichée que si
    // le client mail du destinataire
    // ne supporte pas le mime
    $mail->addMessagePart('Une chaine de caractères classique');
     
    // Ajouter une partie en HTML
    $mail->addMessagePart('<strong>Du HTML</strong> bien brutal', 'text/html');
     
    // Ajouter une pièce-jointe
    $mail->addAttachment('file.jpg', 'image/jpeg');
     
    // Définir une deuxième destination
    $mail->addDestination('foobar@yopmail.com');
     
    // Visualiser le contenu de l'email
    header('Content-Type: text/plain; encoding=utf-8');
    echo $mail;
    echo "\n\n--\n\n";
     
    // Envoyer l'email et afficher le résultat
    var_dump($mail->send());
    Vos remarques et commentaires sont les bienvenus.

    Note: il est bien sûr entendu que vous devez disposer d'un serveur d'envoi de mail sur votre plateforme pour faire fonctionner cette classe correctement.

    Note: le fait que la méthode Mail::send renvoie true ne signifie pas que le mail à été correctement délivré mais bien qu'il à été accepté pour livraison.
    Voir: http://php.net/manual/fr/function.mail.php
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Hello,
    Tu devrais faire un méthode pour vérifier le mail (puisque tu fais plusieur fois le filter_var) tu peux aussi rajouter un checkdsnrr pour le domaine
    Sinon y'a les entetes X-Unsubscribe-Web X-Unsubscribe-Email, qui sont pratiques pour les mailings.

    EDIT 1 : pour le HEADER_DATE je ferait plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    case self::HEADER_DATE:
        if ($time = strtotime($value))
            $value = date('r', $time);
        else
            throw new InvalidArgumentException("Invalid date format for $header");
        break;
    EDIT 2 : pour le SplFileObject il faut l'ouvrir en 'rb' (sinon il risque d'y avoir des pertes de données)
    pourquoi faire ligne par ligne ? ton fichier pour faire 1Go sur une seul ligne prend direct tout le contenu,
    pour le MIME tu peux utilise mime_content_type ou fileinfo si y'a possibilité

  3. #3
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    pour le MIME tu peux utilise mime_content_type ou fileinfo si y'a possibilité
    Non car on doit pouvoir être compatible 5.2 et dans cette version fileinfo n'est disponible qu'en PECL. Quand à mime_content_type, elle semble avoir disparu de PHP 5 (je n'ai pas testé sous linux pour l'instant).

    Sinon y'a les entetes X-Unsubscribe-Web X-Unsubscribe-Email, qui sont pratiques pour les mailings.
    Je ne connais pas ces headers, j'ai pris ma doc ici: http://a-pellegrini.developpez.com/tutoriels/php/mail/
    A quoi servent-ils ?

    Pour l'usage de SplFileObject, je vais remplacer ça par un bon vieux file_get_contents.
    Quand à la validation, je vais essayer quelque chose

    Merci pour ton retour.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Non car on doit pouvoir être compatible 5.2 et dans cette version fileinfo n'est disponible qu'en PECL. Quand à mime_content_type, elle semble avoir disparu de PHP 5 (je n'ai pas testé sous linux pour l'instant).
    pas grave tu peux tester si l'extension est la ou pas, si oui il check sinon tenpis le MIME est obligatoire, a savoir quand 5.2 le package était souvant fournis par défaut (et toujours la dans dans la bundle windows)

    Citation Envoyé par Benjamin Delespierre Voir le message
    Je ne connais pas ces headers, j'ai pris ma doc ici: http://a-pellegrini.developpez.com/tutoriels/php/mail/
    A quoi servent-ils ?
    Alors c'est une info pour les clients de messageries, par exemple sur hotmail, il te créer un bandeau avec le lien pour se désinscrire

  5. #5
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    pas grave tu peux tester si l'extension est la ou pas, si oui il check sinon tenpis le MIME est obligatoire, a savoir quand 5.2 le package était souvant fournis par défaut (et toujours la dans dans la bundle windows)
    Visiblement, l'obtention du Mime nécéssite PHP 5.3 d'après la doc. Dommage.

    Pour ce qui est du check dsn pour le domaine, je garde ça dans un coin de ma tête pour plus tard car la fonction n'est pas disponible sous Windows en PHP 5.2 (et les bidouillages pour l'implémenter malgré tout utilisent exec, ce que j'aimerais éviter...)

    J'ai mis à jour le post original avec tes recommandations.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    non fileinfo est dispo depuis PHP 5.0, c'est juste qui a été intégré au trunk a partir pour la 5.3, rien ne t’émèche de faire un check pour voir si il est la ou pas, idem pour le checkdsnrr, tu ne prives personne dans ce cas là

    EDIT : exemple de validation email

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private function _validateEmail($email) {
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            return false;
        }
     
        if (function_exists('checkdnsrr')) {
            $host = substr($email, strpos($email, '@') + 1);
            return checkdnsrr($host, 'MX');
        }
     
        return true;
    }
    EDIT 2 : pour ton addAttachement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (function_exists('finfo_open') {
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        if($finfo) {
            $content_type = finfo_file($finfo, $path);
            finfo_close($finfo);
        }	
    } else if(function_exists('mime_content_type')) {
        $content_type = mime_content_type($path);
    }
    pas bien ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $filename = @array_pop(explode('/', $path));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $filename = basename($path);

  7. #7
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Damn, j'avais oublié basename. J'irai me flageller avec des orties

    Tu as raison pour la validation mail et le content type, on aurait tord de s'en priver s'ils sont disponibles.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    t'as oublié le _validateEmail dans le __construct

  9. #9
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Ouais mais c'est parce que quand j'ai bu, je code vraiment mal

    Ceci étant corrigé, on arrive à quelque chose de pas trop mal je trouve.
    Qu'est ce que tu en pense ? Mis à part le fait d'avoir créé une n-ième classe de mail... J'ai voulu créer la mienne pour découvrir comment faire des mails multipart et aussi parce que je n'aime pas créer un projet qui se résume à un patchwork de librairies existantes et hétérogènes.

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    ca m'a l'air pas mal, c'est tout simple donc c'est bien
    sinon j'ai regarder un peux ton projet, et je vois pas pour dans ton autoload tu fait un include_once, vue que t'as pas de namespace, l'autoload classqie suffit, au pire fait spl_autoload

  11. #11
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    J'y ai pensé mais je veux pouvoir arrêter l'autoloader, ou le paramétrer différemment dans le futur.

    On reparlera des nombreux problèmes dans Axiom dans le thread qui lui sera dédié.

  12. #12
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Avec un fichier joint non valide, j'obtiens
    Fatal error: Class 'MissingFileException' not found
    Avec un fichier image valide, le fichier est joint mais contient 0 octet et hormis le sujet je n'ai pas de message, c'est comme si $mail->addMessagePart était vide...

  13. #13
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Ah oui c'est une autre classe de mon composant. Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    <?php
    /**
     * PHP AXIOM
     *
     * @license LGPL
     * @author Benjamin DELESPIERRE <benjamin.delespierre@gmail.com>
     * @category libAxiom
     * @package library
     * $Date: 2011-05-18 17:00:36 +0200 (mer., 18 mai 2011) $
     * $Id: MissingFileException.class.php 22988 2011-05-18 15:00:36Z delespierre $
     */
     
    /**
     * Missing File Exception
     *
     * @author Delespierre
     * @version $Rev: 22988 $
     * @subpackage MissingFileException
     */
    class MissingFileException extends RuntimeException {
     
        /**
         * Default constructor
         * @param string $filename
         * @param integer $code = 0
         * @param Exception $previous = null
         */
        public function __construct ($filename, $code = 0, Exception $previous = null) {
            parent::__construct("File $filename not found", $code, $previous);
        }
    }
    Sinon tu peux juste remplacer la MissingFileException par une bonne vieille RuntimeException.

    Avec un fichier image valide, le fichier est joint mais contient 0 octet et hormis le sujet je n'ai pas de message, c'est comme si $mail->addMessagePart était vide...
    Quel content-type as tu mis ?

  14. #14
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    C'est pas clair. Tu donne un fichier et un exemple d'utilisation. L'un plus l'autre devraient fonctionner sans que l'on ait à se poser d'autres questions. Il faudrait donc que ton fichier Mail.php soit autonome.

    Sinon pour l'image et bien comme je viens de le dire j'ai simplement utilisé ton code Mail.php avec ton exemple d'utilisation. Donc j'ai gardé le code de l'exemple
    $mail->addAttachment('file.jpg', 'image/jpeg'); en remplaçant "file.jpg" par un chemin de fichier image .jpg valide.

Discussions similaires

  1. [1.x] Envoyer un mail depuis une classe modèle
    Par Legenyes dans le forum Symfony
    Réponses: 5
    Dernier message: 14/10/2011, 11h16
  2. Réponses: 14
    Dernier message: 15/01/2004, 02h15
  3. Conception d'une classe parente
    Par VincentB dans le forum Langage
    Réponses: 9
    Dernier message: 24/06/2003, 18h28
  4. Variable d'une Classe Ancêtre
    Par Génie dans le forum Langage
    Réponses: 3
    Dernier message: 18/09/2002, 20h24
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 18h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo