Phpmailer dans une classe perso ?

Default
,

bonjour à tous,

je suis nouveau en php j'avoue ne pas etre encore à l'aise avec les fonctions et le classes.

encore moins avec les librairies.

ceoendant j'ai besoin d'apprendre a utiliser phpmailer. mon site site viens de migrer sur ionos. et afin d'utiliser mon mail pour communiquer avec mes utilisateurs il semblerait que je dois utiliser le smtp.

du coup j'ai choisi phpmailer.

imaginez le choc entre la fonction mail() native PHP et La librairie phpmailer. c'est un grand bon en avant pour moi.

je trouve qu'il y a beaucoup de concepts utilisés...

ma question est la suivante

comment aleger mon code ?

jusqu'a present en suivant les cours grafikart il y avait toujours cette préoccupation de clarifier et bien organiser le code.

L’utilisation de toutes les méthodes de phpmailer afin de paramétrer l’envoi de mail sont longues et fastidieuses je trouve sachant que d’un mail à l’autre

Peut de chose change hormis le destinataire, le corps du mail ...

Qu’elle est la meilleure façon de procéder selon vous ?

Par avance merci pour vos pistes de réflexions

12 Réponse

205817
,

Que veux-tu précisémment ? Alléger ton code ?

Default
,

Bonjour,

désolé de ne répondre que maintenant l'alerte était dans mes mails indésirables :/

oui alleger le code et tre plus ordonné je pensais à quelque chose comme ça :

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require './src/Exception.php';
require './src/PHPMailer.php';
require './src/SMTP.php';
class Mail {
    static $mail = new PHPMailer;
    public function sendMail($at, $subject, $message) {
        try {
            //Server settings
            self::$mail->SMTPDebug = SMTP::DEBUG_SERVER;                      // Enable verbose debug output
            self::$mail->isSMTP();                                            // Send using SMTP
            self::$mail->Host       = 'smtp1.example.com';                    // Set the SMTP server to send through
            self::$mail->SMTPAuth   = true;                                   // Enable SMTP authentication
            self::$mail->Username   = 'user@example.com';                     // SMTP username
            self::$mail->Password   = 'secret';                               // SMTP password
            self::$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` also accepted
            self::$mail->Port       = 587;                                    // TCP port to connect to

            //Recipients
            self::$mail->setFrom('user@example.com', 'Example Contact');
            self::$mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
            //self::$mail->addAddress('ellen@example.com');               // Name is optional
            //self::$mail->addReplyTo('info@example.com', 'Information');
            //self::$mail->addCC('cc@example.com');
            //self::$mail->addBCC('bcc@example.com');

            // Attachments
            //self::$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
            //self::$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name

            // Content
            self::$mail->isHTML(true);                                  // Set email format to HTML
            self::$mail->Subject = $subject;
            self::$mail->Body    = $message;
            self::$mail->AltBody = $subject;

            self::$mail->send();
            echo 'Message has been sent';
            return self::$mail;
        } catch (Exception $e) {
            echo "Message could not be sent. Mailer Error: " . self::$mail->ErrorInfo;
        }
    }
}

et dans mon autoloader :

<?php
/**
 * 
 */
spl_autoload_register('appAutoLoad');

function appAutoLoad($class){
    require "class/$class.php";   
}

et dans mon code n'appeler que

$prepareMail = new Mail;
$mail = $prepareMail->sendMail('shinji7800@grafikart.fr', 'objet du mail', $messageBody)
Default
,

Je crois avoir trouver une façon de faire ...

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require './src/Exception.php';
require './src/PHPMailer.php';
require './src/SMTP.php';
class Mail {
    private $mail;

    public function __construct()
    {
        $this->mail = new PHPMailer;
    }

    public function sendMail($at, $subject, $message) {
        try {
            //Server settings
            //$this->mail->SMTPDebug = SMTP::DEBUG_SERVER;                      // Enable verbose debug output
            $this->mail->isSMTP();                                            // Send using SMTP
            $this->mail->Host       = 'smtp1.example.com';                    // Set the SMTP server to send through
            $this->mail->SMTPAuth   = true;                                   // Enable SMTP authentication
            $this->mail->Username   = 'user@example.com';                     // SMTP username
            $this->mail->Password   = 'secret';                               // SMTP password
            $this->mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` also accepted
            $this->mail->Port       = 587;                                    // TCP port to connect to

            //Recipients
            $this->mail->setFrom('contact@exemple.com', 'Contact');
            $this->mail->addAddress($at);     // Add a recipient
            //$this->mail->addAddress('ellen@example.com');               // Name is optional
            //$this->mail->addReplyTo('info@example.com', 'Information');
            //$this->mail->addCC('cc@example.com');
            //$this->mail->addBCC('bcc@example.com');

            // Attachments
            //$this->mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
            //$this->mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name

            // Content
            $this->mail->isHTML(true);                                  // Set email format to HTML
            $this->mail->Subject = $subject;
            $this->mail->Body    = $message;
            $this->mail->AltBody = $message;

            $this->mail->send();
            echo 'Message has been sent';
            return $this->mail;
        } catch (Exception $e) {
            echo "Message could not be sent. Mailer Error: " . $this->mail->ErrorInfo;
        }
    }
}

j'ai du commenter cette ligne //$this->mail->SMTPDebug = SMTP::DEBUG_SERVER; j'ai une erreur si je l'utilise ...

205817
,

Très honnêtement je n'ai jamais bidouiller PHPMailer, et à vrais dire je préfère éviter de toucher au travaille des autres car la moindre erreur peu tout faire foirer. ^^

J'avais essayé avec RoundCube, mais c'était une mauvaise idée.. Haha.

17162
,

Bonsoir.
@SimonDlgs Tu n'as pas compris ce qu'il voulais faire, il ne cherches pas à modifier une classe de la librairie, mais de faire une classe dans son projet, afin de se simplifier l'utilisation de la librairie, soit qu'elle puisse par exemple initialiser la librairie avec une configuration qui lui est propre, afin de ne pas la définir à chaque fois qu'il l'utilise dans son projet.
Il ne s'agit donc pas de modifier la classe de la librairie comme tu le laisse l'entendre.

Default
,

effectivement Lartak !

j'ai surement pas été suffisament clair

je posterai ma solution finale prochainement j´ai effectué quelques modifications!

je passe par une etape intermédiaire pour l’instanciation je crois que l´on appelle ça la "factory"

Au final je crois que j’ai un peu paniqué car je neu savais pas trop par quel bout prendre mon « problème »

En tous les cas ça fonctionne comme je l’espérais

Je suis quand même preneur de vos remarques afin de perfectionner ma pratique

205817
,

Effectivement j'avais mal compris !

$this->mail->send(); est un Boolean donc pas possible d'y affecter de paramètres.

17162
,

$this->mail->send(); est un Boolean donc pas possible d'y affecter de paramètres.

Pourquoi dis-tu ceci ?
Il ne passe aucun argument à la méthode send de la classe PHPMailer.

205817
,

Ayant relue sa demande, j'ai compris qu'il cherchait à faire quelque chose de ce genre :

$mail = $prepareMail->sendMail('shinji7800@grafikart.fr', 'objet du mail', $messageBody)

Donc affecter des paramètres à sendMail.

17162
,

sendMail est une méthode de sa classe et non de PHPMailer, il voulait simplement dire qu'au lieu de devoir instancier la classe PHPMailer en définissant tous les paramêtre nécessaires à chaque fois, qu'il voualit créer sa classe qui aurait une méthode qui lui permettrait d'utiliser la classe PHPMailer en définissant à sa méthode, les paramêtres qui pourraient changer selon le cas sans devoir redéfinir tout à chaque fois.

27818
,

Hello,

Personnellement, concernant la partie constructeur, je mettrais la config SMTP pour tes mails, ce qui permet d'éviter de refaire la config à chaque fois que tu envoies un mail.

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require './src/Exception.php';
require './src/PHPMailer.php';
require './src/SMTP.php';
class Mail {
    private $mail;

    public function __construct()
    {
        $this->mail = new PHPMailer;
        //Server settings
        $this->mail->isSMTP();                                            // Send using SMTP
        $this->mail->Host       = 'smtp1.example.com';                    // Set the SMTP server to send through
        $this->mail->SMTPAuth   = true;                                   // Enable SMTP authentication
        $this->mail->Username   = 'user@example.com';                     // SMTP username
        $this->mail->Password   = 'secret';                               // SMTP password
        $this->mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` also accepted
        $this->mail->Port       = 587;                                    // TCP port to connect
        //Recipients (Il ne devrait pas changer)
        $this->mail->setFrom('contact@exemple.com', 'Contact');
    }

Concernant ta méthode sendMail, suivant l'utilité que tu veux faire de ta classe, je passerais plutôt à quelque chose comme ceci, ce qui te permettrait d'envoyer plusieurs fois le même mail.

public function sendMail($at, $subject, $message) {
        try {
            // Si $at est un tableau
            if (is_array($at)) {
                // S'il y a plusieurs personnes qui doivent recevoir le mail, on l'envoie en BCC (pour pas qu'ils se voient entre eux)
                if (count($at) > 1) {
                    foreach ($at as $receiver) {
                        $this->mail->addBCC($reveiver);
                    }
                } else {
                    $this->mail->addAddress($at[0]);
                }
            } else {
                $this->mail->addAddress($at);     // Add a recipient
            }

            // Content
            $this->mail->isHTML(true); // Set email format to HTML
            $this->mail->Subject = $subject;
            $this->mail->Body    = $message;
            $this->mail->AltBody = $message;
            $this->mail->send();
            echo 'Message has been sent';
            return $this->mail;
        } catch (Exception $e) {
            echo "Message could not be sent. Mailer Error: " . $this->mail->ErrorInfo;
        }
    }

Ca te permettrait d'utiliser ta classe comme suit :

$mail = new Mail();
// Envoie le mail à une personne
$mail->sendMail('email1@example.com', 'objet du mail', $content);

$mail = new Mail();
// Envoie le mail à plusieurs personnes
$mail->sendMail(['email1@example.com', 'email2@example.com'], 'objet du mail', $content);

Après, ça reste à changer selon tes et ce que tu préfère faire.
De plus, n'ayant pas vraiment tester, je ne suis pas sûr que ça fonctionne.

Et petit tips de fin, je ferais aussi en sorte de créer une "factory" qui me retournerait tout le temps un nouvel objet mail qui est propre et prêt à l'emploi.

Default
,

super idée j´ai pas anticipé l´envoi de mail a la chaine ! merci