Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

Discussion: Une classe de Mail

  1. #1
    Expert Confirmé Sénior
    Avatar de Benjamin Delespierre
    Profil pro Benjamin Delespierre
    Développeur Web
    Inscrit en
    février 2010
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Nom : Benjamin Delespierre
    Âge : 26
    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 932
    Points : 8 705
    Points
    8 705

    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 :
    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
    Modérateur

    Inscrit en
    septembre 2010
    Messages
    7 957
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 7 957
    Points : 9 507
    Points
    9 507

    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 :
    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 Confirmé Sénior
    Avatar de Benjamin Delespierre
    Profil pro Benjamin Delespierre
    Développeur Web
    Inscrit en
    février 2010
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Nom : Benjamin Delespierre
    Âge : 26
    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 932
    Points : 8 705
    Points
    8 705

    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
    Modérateur

    Inscrit en
    septembre 2010
    Messages
    7 957
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 7 957
    Points : 9 507
    Points
    9 507

    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 Confirmé Sénior
    Avatar de Benjamin Delespierre
    Profil pro Benjamin Delespierre
    Développeur Web
    Inscrit en
    février 2010
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Nom : Benjamin Delespierre
    Âge : 26
    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 932
    Points : 8 705
    Points
    8 705

    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
    Modérateur

    Inscrit en
    septembre 2010
    Messages
    7 957
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 7 957
    Points : 9 507
    Points
    9 507

    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 :
    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 :
    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 :
    $filename = @array_pop(explode('/', $path));
    Code :
    $filename = basename($path);

  7. #7
    Expert Confirmé Sénior
    Avatar de Benjamin Delespierre
    Profil pro Benjamin Delespierre
    Développeur Web
    Inscrit en
    février 2010
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Nom : Benjamin Delespierre
    Âge : 26
    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 932
    Points : 8 705
    Points
    8 705

    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
    Modérateur

    Inscrit en
    septembre 2010
    Messages
    7 957
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 7 957
    Points : 9 507
    Points
    9 507

    Par défaut

    t'as oublié le _validateEmail dans le __construct

  9. #9
    Expert Confirmé Sénior
    Avatar de Benjamin Delespierre
    Profil pro Benjamin Delespierre
    Développeur Web
    Inscrit en
    février 2010
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Nom : Benjamin Delespierre
    Âge : 26
    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 932
    Points : 8 705
    Points
    8 705

    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
    Modérateur

    Inscrit en
    septembre 2010
    Messages
    7 957
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 7 957
    Points : 9 507
    Points
    9 507

    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 Confirmé Sénior
    Avatar de Benjamin Delespierre
    Profil pro Benjamin Delespierre
    Développeur Web
    Inscrit en
    février 2010
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Nom : Benjamin Delespierre
    Âge : 26
    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 932
    Points : 8 705
    Points
    8 705

    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 Confirmé Sénior

    Homme Profil pro Alain Bontemps
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    2 402
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain Bontemps
    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 : 2 402
    Points : 4 153
    Points
    4 153

    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...
    - Réalisations
    - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.

  13. #13
    Expert Confirmé Sénior
    Avatar de Benjamin Delespierre
    Profil pro Benjamin Delespierre
    Développeur Web
    Inscrit en
    février 2010
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Nom : Benjamin Delespierre
    Âge : 26
    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 932
    Points : 8 705
    Points
    8 705

    Par défaut

    Ah oui c'est une autre classe de mon composant. Voici le code:
    Code :
    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 Confirmé Sénior

    Homme Profil pro Alain Bontemps
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    2 402
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain Bontemps
    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 : 2 402
    Points : 4 153
    Points
    4 153

    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.
    - Réalisations
    - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •