Phpmailer dans une classe perso ?

Par shinji7800, il y a 6 ans


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éponses

SimonDlgs, il y a 6 ans

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

shinji7800, il y a 6 ans

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)
shinji7800, il y a 6 ans

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 ...

SimonDlgs, il y a 6 ans

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.

Lartak, il y a 6 ans

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.

shinji7800, il y a 6 ans

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

SimonDlgs, il y a 6 ans

Effectivement j'avais mal compris !

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

Lartak, il y a 6 ans

$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.

SimonDlgs, il y a 6 ans

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.

Lartak, il y a 6 ans

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.

Kareylo, il y a 6 ans

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.

shinji7800, il y a 6 ans

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