Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/05/2011, 14h12   #1
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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, 31 affichages)
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 14h33   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
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
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 15h38   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
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
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 11h14   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
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
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 18h27   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
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
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 16h08   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
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
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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é.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 18h01   #12
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
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
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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 ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 19h28   #14
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
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 Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h40.


 
 
 
 
Partenaires

Hébergement Web