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
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)
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 ...
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.
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.
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
Effectivement j'avais mal compris !
$this->mail->send(); est un Boolean donc pas possible d'y affecter de paramètres.
$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.
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.
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.
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.