Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, etc. pour PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 18/05/2011, 14h12   #1
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
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
Type de fichier : php Mail.class.php (13,7 Ko, 96 affichages)
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 14h33   #2
stealth35
Modérateur
 
Inscription : septembre 2010
Messages : 7 958
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 958
Points : 9 508
Points : 9 508
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é
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 15h15   #3
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
Citation:
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).

Citation:
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.
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 15h38   #4
stealth35
Modérateur
 
Inscription : septembre 2010
Messages : 7 958
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 958
Points : 9 508
Points : 9 508
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 10h54   #5
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
Citation:
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.
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 11h14   #6
stealth35
Modérateur
 
Inscription : septembre 2010
Messages : 7 958
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 958
Points : 9 508
Points : 9 508
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);
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/05/2011, 14h15   #7
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
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.
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 18h27   #8
stealth35
Modérateur
 
Inscription : septembre 2010
Messages : 7 958
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 958
Points : 9 508
Points : 9 508
t'as oublié le _validateEmail dans le __construct
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h55   #9
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
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.
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 16h08   #10
stealth35
Modérateur
 
Inscription : septembre 2010
Messages : 7 958
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 958
Points : 9 508
Points : 9 508
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 16h35   #11
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
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é.
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 18h01   #12
ABCIWEB
Expert Confirmé
 
Homme Alain
Inscription : septembre 2010
Messages : 1 917
Détails du profil
Informations personnelles :
Nom : Homme Alain
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : septembre 2010
Messages : 1 917
Points : 2 851
Points : 2 851
Avec un fichier joint non valide, j'obtiens
Citation:
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.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 10h04   #13
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
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.

Citation:
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 ?
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 19h28   #14
ABCIWEB
Expert Confirmé
 
Homme Alain
Inscription : septembre 2010
Messages : 1 917
Détails du profil
Informations personnelles :
Nom : Homme Alain
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : septembre 2010
Messages : 1 917
Points : 2 851
Points : 2 851
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.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h20.


 
 
 
 
Partenaires

Hébergement Web