Connectez-vous

Tuto : Installer votre environnement de développement sous Debian - Nginx, PHP7.1, MySQL, PHPMyAdmin et PHPMailer

Catégorie > Os
Par le
Dernière modification le
Tuto : Installer votre environnement de développement sous Debian - Nginx, PHP7.1, MySQL, PHPMyAdmin et PHPMailer


Je vous explique pas à pas comment installer un environnement de développement "from scratch" avec les logiciels stables les plus récents sous Debian.



Ce tuto est la suite directe du précédent qui expliquait comment installer Debian sur VirtualBox. Vous pouvez ne pas avoir besoin d'aller le voir, par exemple si vous possédez un véritable serveur de développement. Les pré-requis sont simplement la dernière version de Debian : 8.7.1, des sources de dépots contenant Dotdeb et Sury pour avoir des paquets à jour, et bien sûr une machine joignable en SSH.

Pour rappel également, j'ai un utilisateur dev qui possède tout le dossier /var/www/ et des droits dessus en 0777. Je suis sous VirtualBox pour ce tuto et ce même dossier /var/www/ est partagé avec ma machine hôte sous Windows grâce à Samba, éditable par dev. Parfois (mais rarement) je créerai donc des dossiers sous Windows pour des raisons de confort, à vous de vous adapter si vous n'êtes pas dans la même situation. Enfin, on ne se préoccupera pas trop de la sécurité puisque le but est simplement d'avoir un environnement de développement relativement proche de celui de notre serveur de production.


Nginx


J'effectue toutes les opérations sous root. On installe le serveur web Nginx.

apt-get install nginx



Normalement on récupère la version 1.10.3, dernière stable en date pour Debian. Je vais me créer deux sites d'exemple site1 et site2. Je me crée les répertoires /var/www/site1 et /var/www/site2 sous Windows, ils appartiennent donc à mon compte dev.

Toujours sous windows grâce à mon disque réseau, je me crée deux petits fichiers d'exemple, /var/www/site1/index.html et /var/www/site2/index.html

Je vais me faire un truc très basique pour vérifier que ça fonctionne sur l'index de site1, et je fais pareil pour site2.


<!DOCTYPE html>
<html>
<head>
<title>Site1</title>
<style>
body {
width: 90%;
margin: 0 auto;
text-align: center;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Site 1</h1>
<p>Bienvenue sur le site1, it works!</p>

<p><a href="http://nginx.com/">nginx.com</a></p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>



Je me crée un nouveau Vhost Nginx...

nano /etc/nginx/sites-available/site1



Et j'y met des directives très basiques.


# site1 redirection vers www
server {
listen 80;
listen [::]:80;
server_name site1.dev;
return 301 http://www.site1.dev$request_uri;
}

# site1
server {
# listen on
listen 80 default_server;
listen [::]:80 default_server;

# root directory
root /var/www/site1;

# index file priority
index index.php index.html index.html;

# server name
server_name www.site1.dev;

# custom log files
access_log /var/log/nginx/site1.acc.log;
error_log /var/log/nginx/site1.err.log;

# deny access to .htaccess files
location ~ /\.ht {
deny all;
}

# deny access for extensions that we don't want to load
location ~ \.(ht|sql|bat|git|ini|sh|svn[^.]*|tpl)$ {
deny all;
}

# basic location
location / {
# try files or return 404
try_files $uri $uri/ =404;
}
}



On copie la config du site1 vers site2...

cp /etc/nginx/sites-available/site1 /etc/nginx/sites-available/site2



Et on édite site2 pour adapter le root et le server name. Au passage, enlevez le default_server, il ne peut y en avoir qu'un.

nano /etc/nginx/sites-available/site2



Le sous-répertoire sites-available stocke les vhosts mais pour qu'Nginx les prenne en considération, vous devez les activer en créant un lien symbolique dans /etc/nginx/sites-enabled qui pointe vers les sites que vous souhaitez activer parmi ceux de sites-available.

Par défaut, il en existe un qui lie sites-enabled/default à sites-available/default. On va garder le fichier ce Vhost de base mais supprimer ce lien pour ne pas qu'il entre en conflit avec nos deux sites.

unlink /etc/nginx/sites-enabled/default



On crée maintenant nos deux liens symboliques qui pointent de sites-enabled vers sites-available.


ln -s nom_du_fichier_pointé nom_du_lien_symbolique
ln -s /etc/nginx/sites-available/site1 /etc/nginx/sites-enabled/site1
ln -s /etc/nginx/sites-available/site2 /etc/nginx/sites-enabled/site2



On doit redémarrer Nginx pour prendre en compte les changements.

service nginx restart



Il reste à ajouter nos deux sites au fichier hosts de la machine hôte, pour faire pointer l'IP du serveur virtuel vers chacune de nos deux url. Sous Windows on va dans C:\Windows\System32\drivers\etc\hosts et on ajoute :


# devServer
192.168.56.2 site1.dev www.site1.dev
192.168.56.2 site2.dev www.site2.dev



Il n'y a plus qu'à vider le cache DNS Windows en rentrant dans une invite de commande :

ipconfig /flushdns



Allez visiter les deux url http://www.site1.dev et http://www.site2.dev avec votre navigateur préféré, et là, normalement, vos deux pages d'index html différentes s'affichent.

On va maintenant personnaliser la config d'Nginx, mais avant ça, on backup celle par défaut au cas où.


cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old
nano /etc/nginx/nginx.conf



Voici la config globale d'Nginx que j'ai choisi.


user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

sendfile on;
tcp_nodelay on;

# renvoie moins d'information sur le serveur
server_tokens off;

# taille des buffers et taille max des requêtes normales
client_body_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 1 1K;
ignore_invalid_headers on;

# définition des différents timeout
client_body_timeout 5;
client_header_timeout 5;
keepalive_timeout 65 5;
send_timeout 5;
server_name_in_redirect off;

# active la compression des pages sauf pour les navigateurs pourris
gzip on;
gzip_comp_level 6;
gzip_proxied any;
gzip_vary on;
gzip_types text/plain text/css application/x-javascript application/json application/xml;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";

# limitation du nombre de connexion par client
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=2r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;

# inclusion des autres fichiers de conf puis des sites activés
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}



Pensez à redémarrer Nginx pour vérifier que tout va bien et prendre en compte les changements :

service nginx restart



Sachez que si Nginx refuse de redémarrer, c'est que vous avez fait une erreur dans les fichiers de configuration. Pour connaître la source du problème dans ces cas là, c'est à dire le fichier et la ligne incriminés, une commande est bien utile.

nginx -t



De la même manière, si vous voulez savoir ce qui se passe sur Nginx, il suffit de consulter les dernières lignes des fichiers de log avec la commande tail.


/var/log/nginx/access.log
/var/log/nginx/error.log



Ou pour un site spécifique, il faudra regarder les fichiers qu'on a définis pour chaque Vhost.


/var/log/nginx/site1.acc.log;
/var/log/nginx/site1.err.log;




PHP 7.1 et Nginx, toujours


Tout ça est bien joli, mais jusque-là, on ne peut qu'afficher du html. On va maintenant installer PHP et plein d'extensions bien utiles. Je précise que cette fois j'utilise aptitude au lieu de apt-get. En effet, avec apt-get, impossible de confirmer l'action, il me l'annule que je tape o, O ou même directement Entrée. Avec aptitude Y fonctionne et l'installation se lance. Je suppose qu'il y a trop de directives en même temps pour apt-get.

aptitude install php7.1 php7.1-fpm php7.1-gd php7.1-mysql php7.1-cli php7.1-common php7.1-curl
php7.1-opcache php7.1-json php7.1-gd php7.1-mcrypt php7.1-mbstring php7.1-xml php7.1-intl php7.1-zip



Tant qu'on y est, on va paramétrer quelques trucs concernant PHP. On édite le fichier de conf.

nano /etc/php/7.1/fpm/php.ini



Le fichier est long, donc faites Ctrl+W pour rechercher les lignes qui nous intéressent. D'abord on veut que PHP nous affiche les erreurs, même les avertissements. Rappelez-vous, on est en développement, il faut pouvoir débuguer. Je vous déconseille évidemment de faire ça en production. Cherchez la ligne display_errors, mais pas celle qui est commentée, la deuxième, celle qui est non commentée et sur Off. Changez les lignes comme suit :


display_errors = On
display_startup_errors = On



Ensuite, et ça perso je le fais en production aussi, on va monter la taille des fichiers uploadés par défaut. Cherchez la ligne upload_max_filesize et passez la taille max de 2 à 5Mo ou plus selon vos besoins :

upload_max_filesize = 5M



Il faut maintenant indiquer à Nginx ou se trouve PHP et lui donner les paramètres de FastCGI. Pour factoriser un peu la config, on va se créer un fichier unique qu'on inclura à chaque fois qu'on utilise PHP. On le crée directement dans le dossier d'Nginx.

nano /etc/nginx/php.conf



Et on y colle les paramètres qui vont bien, en prenant soin de lui donner le bon chemin vers PHP.


# Paramètres fastcgi pour PHP7.1
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.1-fpm.sock;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
}



On peut inclure notre fichier de config PHP pour nos deux sites. Je ne vous montre que site1 à chaque fois, mais c'est le même principe pour site2.

nano /etc/nginx/sites-available/site1



Dans la partie server, juste après le nom du serveur, on lui inclut les paramètres de PHP.


# server name
server_name www.site1.dev;

# php params, will include snippets if php is required
include php.conf;



Tant qu'on y est, maintenant qu'on les a définies dans la config d'Nginx, on peut aussi mettre les limitations à la fin de la directive location. Voyons à quoi ressemble notre vhost final.


# site1 redirection vers www
server {
listen 80;
listen [::]:80;
server_name site1.dev;
return 301 http://www.site1.dev$request_uri;
}

# site1
server {
# listen on
listen 80 default_server;
listen [::]:80 default_server;

# root directory
root /var/www/site1;

# index file priority
index index.php index.html index.html;

# server name
server_name www.site1.dev;

# php params, will include snippets if php is required
include php.conf;

# custom log files
access_log /var/log/nginx/site1.acc.log;
error_log /var/log/nginx/site1.err.log;

# deny access to .htaccess files
location ~ /\.ht {
deny all;
}

# deny access for extensions that we don't want to load
location ~ \.(ht|sql|bat|git|ini|sh|svn[^.]*|tpl)$ {
deny all;
}

# basic location
location / {
# try files or return 404
try_files $uri $uri/ =404;

# limit max connections per client
limit_req zone=req_limit_per_ip burst=5 nodelay;
limit_conn conn_limit_per_ip 30;
}
}



Il reste à renommer les fichiers index.html en index.php. En effet, pour nos deux sites, on a défini un fichier index.php par défaut. Seulement s'il ne le trouve pas, Nginx cherche un index.html.

Donc on renomme notre fichier /var/www/site1/index.html en /var/www/site1/index.php. Ensuite on édite notre index.php et pour vérifier que PHP fonctionne, on va lui coller un phpinfo() en bas de page, avant la fin du body html. Ca donne :


<div>
<?php
phpinfo();
?>
</div>
</body>
</html>



On redémarre Nginx pour que tout soit pris en compte

restart service nginx



Rafraichissez vos index de site http://www.site1.dev et http://www.site2.dev dans le navigateur, et voilà, PHP vous vomit toutes les informations sur sa config, ça marche :



MySQL et PHPMyAdmin


On installe le client et le serveur MySQL.

apt-get install mysql-server mysql-client



Moi je choisis root comme mot de passe root.


Lancez la procédure de sécurisation.

/usr/bin/mysql_secure_installation


- Entrez votre pass root, choisissez non pour ne pas le changer.
- Puis oui pour supprimer les utilisateurs anonymes.
- Oui pour désactiver la connexion root distante.
- Oui pour supprimer la base de tests.
- Oui pour recharger les privilèges des tables.
C'est good.

Maintenant, il faut mettre à jour MySQL qui n'est qu'en version 5.5 par défaut sous Debian. Ca peut être problématique par exemple pour faire du full-text avec le moteur innoDB. Dotdeb ne gère pas les paquets MySQL récents pour Debian 8.7, on va donc utiliser l'outil mis à disposition par Oracle pour mettre à jour MySQL proprement. L'outil est disponible ici, à vous d'adapter les commandes si une version plus à jour est sortie depuis.

On récupère l'outil puis on lance le gestionnaire de paquets.


cd /home/dev
wget http://dev.mysql.com/get/mysql-apt-config_0.8.3-1_all.deb
dpkg -i mysql-apt-config_0.8.3-1_all.deb



On choisit la dernière version stable, 5.7, et on valide pour mettre à jour les dépots.




Il reste à faire un petit update et à redemander l'installation en apt-get.


apt-get update
apt-get install mysql-server mysql-client



Si vous êtes curieux, vous pouvez constater que l'outil d'Oracle a ajouté un fichier mysql.list dans /etc/apt/sources.list.d pour gérer les dépots spécifiques à MySQL. Vous êtes passés au moins en version 5.7.17. Vous pouvez effacer l'outil d'Oracle.


mysql --version
rm mysql-apt-config_0.8.3-1_all.deb



Pour gérer graphiquement les bases de données et les utilisateurs, PHPMyAdmin est la solution la plus commune et la plus simple. On a d'abord besoin de pouvoir le dézipper, donc on installe unzip.

apt-get install unzip



On se place là où on veut l'installer.

cd /usr/share



On le download, le dézippe, le renomme, lui fout les bons droits et on supprime l'archive.


wget https://files.phpmyadmin.net/phpMyAdmin/4.6.6/phpMyAdmin-4.6.6-all-languages.zip
unzip phpMyAdmin-4.6.6-all-languages.zip
mv phpMyAdmin-4.6.6-all-languages phpmyadmin
chmod -R 755 phpmyadmin
rm phpMyAdmin-4.6.6-all-languages.zip



On va maintenant se faire un troisième Vhost pour gérer toutes les BDD de tous nos sites sur PHPMyAdmin.

nano /etc/nginx/sites-available/phpmyadmin



Et on y met la conf qui va bien. Ici j'interdis les crawler, à faire en production pour éviter que PHPMyAdmin soit indexé par les moteurs de recherche.


# phpmyadmin redirection vers www
server {
listen 80;
listen [::]:80;
server_name phpmyadmin.dev;
return 301 http://www.phpmyadmin.dev$request_uri;
}

# phpmyadmin
server {
listen 80;
listen [::]:80;

root /usr/share/phpmyadmin;

index index.php index.html index.htm;

server_name www.phpmyadmin.dev;

include php.conf;

error_log /var/log/nginx/phpmyadmin.err.log;
access_log /var/log/nginx/phpmyadmin.acc.log;

# pas de crawlers
location /robots.txt {
return 200 "User-agent: *\nDisallow: /\n";
}

# racine
location / {
# try files or return 404
try_files $uri $uri/ =404;

# limit max connections per client
limit_req zone=req_limit_per_ip burst=5 nodelay;
limit_conn conn_limit_per_ip 30;
}
}



On crée le lien symbolique vers sites-enabled.

ln -s /etc/nginx/sites-available/phpmyadmin /etc/nginx/sites-enabled/phpmyadmin



Reste à ajouter une ligne de plus à notre fichier hosts de machine hôte:


# devServer
192.168.56.2 phpmyadmin.dev www.phpmyadmin.dev



On flush encore une fois les DNS en invite de commande Windows.

ipconfig /flushdns



Maintenant, on va configurer PHPMyAdmin. Un fichier d'exemple est déjà dispo dans /usr/share/phpmyadmin/, c'est config.sample.inc.php.

On va le copier pour lui donner son vrai nom de config opérante puis l'éditer.


cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php
nano /usr/share/phpmyadmin/config.inc.php



D'abord, choisissez une passphrase de 32 caractères pour le pas avoir d'alerte à chaque connexion :

$cfg['blowfish_secret'] = '00000000000000000000000000000000';



Puis activez la compression.

$cfg['Servers'][$i]['compress'] = true;



Redémarrez Nginx.

service nginx restart



Vous pouvez vérifier que grâce à notre fichier de config, la procédure d'installation est désactivée pour http://www.phpmyadmin.dev/setup/.


L'interface est joignable ici : http://www.phpmyadmin.dev. Rentrez vos id root MySQL, root / root pour moi.

Une fois connecté, en bas de page, il se peut que vous ayez un message d'alerte.


Dans ce cas, cliquez sur Voir l'analyse du problème puis sur Créer pour créer une base de données de configuration de PHPMyAdmin.


Votre PHPMyAdmin est à présent configuré et prêt à l'emploi.


Reste à créer les bases de données respectives pour chacun de vos sites 1 et 2. L'idée est de pouvoir tout gérer en root à partir de PhpMyAdmin, mais aussi de créer un utilisateur distinct par base de données/par site. De cette manière, si plus tard en production vous avez besoin de donner un accès à MySQL ou à PHPMyAdmin à l'administrateur de site1, celui-ci ne verra que la base de données de son site et pas celle des autres, et ne pourra pas faire n'importe quoi sur votre configuration de MySQL. Ca vous permettra aussi de ne pas faire tomber le 2ème site si jamais le 1er s'est fait pirater par exemple.

Allez dans Comptes utilisateur et cliquez sur Ajouter un compte d'utilisateur.


Donnez-lui le nom de votre premier site. Il ne pourra se connecter qu'en local, c'est à dire soit via son site hébergé sur votre machine, soit via votre PHPMyAdmin, hébergé... lui aussi sur votre serveur. Perso je lui mets site1 comme nom et site1 comme mot de passe. Cochez la case Créer une base portant son nom et donner à cet utilisateur tous les privilèges sur cette base.


Laissez tout le reste par défaut et cliquez sur Exécuter tout en bas. PHPMyAdmin vous montre la commande qu'il a généré.

Faites exactement la même chose pour site2. Notez que vous pouvez bien sûr le faire directement dans le shell, tels de vrais bonhommes, fiers de leur e-penis, ou bien entendu telles de véritables championnes 2.0 aux e-boobs XXL. La syntaxe serait la suivante :

mysql -u base_user -pbase_user_pass -e "create database new_db; GRANT ALL PRIVILEGES ON new_db.* TO new_db_user@localhost IDENTIFIED BY 'new_db_user_pass'"



Ce qui donne dans notre situation pour site2:

mysql -u root -proot -e "create database site2; GRANT ALL PRIVILEGES ON site2.* TO site2@localhost IDENTIFIED BY 'site2'"



Vous pouvez vous déconnecter. Reconnectez-vous à PHPMyAdmin avec le compte site1. Normalement, vous ne voyez plus que la base site1, et c'est pareil pour le compte site2.


On peut à présent vérifier qu'une connexion à vos bases de données via PHP est parfaitement possible.
Editez votre fichier /var/www/site1/index.php (là encore moi je fais ça directement sous Windows), et remplacez votre phpinfo() avec ça :


<div>
<?php
try
{
// host / database /connexion en utf8 / user / pass
$db = new \PDO('mysql:host=localhost;dbname=site1;charset=UTF8', 'site1', 'site1' );

// levage des erreurs (dev mode)
$db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e)
{
echo "Erreur !: " . $e->getMessage() . "<br/>";
die;
}
?>
</div>



La page d'index ne devrait pas lever d'erreur, vous êtes bien connecté à votre base de données MySQL.
Vous pouvez bien entendu importer une base de données existante ou en créer une via PHPMyAdmin, ce qui est quand même plus pratique qu'en console.


PHPMailer


Il y a pas mal de façons d'envoyer des email en PHP. La base est d'utiliser sa fonction native mail(). Le problème avec cette méthode, c'est d'abord que c'est assez laborieux de paramétrer l'envoi pour que vos email soient conformes aux normes et arrivent correctement partout. Mais aussi et surtout, c'est que cette fonction utilise le MTA (Mail Transfert Agent) par défaut de la machine, qui n'est pas forcément le même chez tout le monde, pas forcément paramétré pareil, et pas non plus forcément le même en développement et en production. Bref, c'est un peu chiant et inutilement chronophage.

Sachez quand même que par défaut, c'est le serveur de messagerie exim4 qui est installé sous Debian. La ligne sendmail_path de la configuration php.ini de PHP (qu'on a déjà modifié plus haut) permet de définir le chemin du MTA que PHP utilise pour envoyer des email. Par défaut cette ligne est vide, et PHP cherchera à pointer vers /usr/sbin/sendmail. Et, là encore par défaut sous Debian, /usr/sbin/sendmail pointe vers /usr/sbin/exim4 grâce à un lien symbolique.

En production, en plus du paramétrage pour l'envoi du mail, si vous voulez faire un minimum sérieux, il vous faut des adresses email avec votre nom de domaine, du type blabla@site1.dev. Là encore il y a beaucoup de solutions. La plupart des hébergements mutualisés proposent un certain nombre d'adresses incluses dans leur pack et vous proposent de les gérer sur leur propre interface. Certains hébergements dédiés le font aussi sans doute. Vous pouvez également payer un service comme Gmail pour disposer d'adresses avec votre nom de domaine. La dernière solution, plus compliquée, consiste à gérer vous-même un serveur mail sur votre machine avec par exemple Postfix, et à faire pointer les emails sur ce serveur chez votre Registrar.

Nous, en développement, déjà on n'a pas de nom de domaine, et ensuite, on s'en contrefout de ne pas avoir d'adresse mail qui fasse pro. Donc on va tout simplement faire le truc le plus bateau qui soit : créer une adresse Gmail de test et pointer dessus en SMTP, sans rien toucher à la config d'exim4, grâce à la librairie PHP PHPMailer, qui permet de se passer de MTA.

Rendez-vous donc sur Gmail, je vous laisse créer un compte exprès pour vos tests.
Moi j'ai choisi, disons, devserver666@gmail.com, avec pour mot de passe devserver000.

Maintenant que votre adresse est créée, on va installer PHPMailer. Il s'agit d'une librairie PHP pour envoyer des email. Clonez et téléchargez le zip directement sur GitHub via votre navigateur.

Décompressez l'archive dans /var/www/site1 et renommez le dossier en PHPMailer.

Editez votre index de site1, on va voir tout de suite si ça fontionne. Bien entenu, renseignez le destinataire dans addAddress avec une véritable adresse à vous, et adaptez Username et Password pour le Gmail que vous venez de créer.


<?php
require './PHPMailer/PHPMailerAutoload.php';

// Create a new PHPMailer instance
$mail = new PHPMailer;

// Tell PHPMailer to use SMTP
$mail->isSMTP();

//Enable SMTP debugging
// 0 = off (for production use)
// 1 = client messages
// 2 = client and server messages
$mail->SMTPDebug = 2;

// Ask for HTML-friendly debug output
$mail->Debugoutput = 'html';

// Set the hostname of the mail server
$mail->Host = 'smtp.gmail.com';

// use
// $mail->Host = gethostbyname('smtp.gmail.com');
// if your network does not support SMTP over IPv6
// Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
$mail->Port = 587;

// Set the encryption system to use - ssl (deprecated) or tls
$mail->SMTPSecure = 'tls';

// Whether to use SMTP authentication
$mail->SMTPAuth = true;

// Username to use for SMTP authentication - use full email address for gmail
$mail->Username = "devserver666@gmail.com";

// Password to use for SMTP authentication
$mail->Password = "devserver666dev";

// Set who the message is to be sent from
$mail->setFrom('dev@devserver.dev', 'First Last');

// Set an alternative reply-to address
$mail->addReplyTo('dev@devserver.dev', 'First Last');

// Set who the message is to be sent to
$mail->addAddress('unmailperso@gmail.com', 'John Doe');

// Set the subject line
$mail->Subject = 'PHPMailer GMail SMTP test';

// Read an HTML message body from an external file, convert referenced images to embedded,
// convert HTML into a basic plain-text alternative body
$mail->msgHTML(file_get_contents('./PHPMailer/examples/contents.html'), dirname(__FILE__));

// Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';

// Attach an image file
// $mail->addAttachment('./PHPMailer/examples/images/phpmailer_mini.png');

// Send the message, check for errors
if(!$mail->send())
{
echo "Mailer Error: " . $mail->ErrorInfo;
} else
{
echo "Message sent!";
}
?>



Une fois la page de site1 rechargée, magie, vous voyez une bouillie de débogage ainsi que le Message sent! final. Vous pouvez vérifiez à l'adresse destinataire que le mail est bien reçu.

Si vous vous demandez comment ça peut marcher alors qu'exim4 n'est même pas configuré, eh bien c'est parce que PHPMailer ne l'utilise pas. Normalement pour faire ça, on configure PHP pour pointer vers un MTA configurable comme un relai SMTP comme par exemple sSMTP. Mais cette librairie utilise directement PHP pour se connecter en SMTP au serveur email désiré. Oui, je vous ai un peu menti, PHP peut en fait envoyer des email sans passer par un MTA.

En gros en choisissant $mail->isSMTP(), class.phpmailer.php nous fait passer dans getSMTPInstance() qui nous fait un new SMTP, ce qui instancie class.smtp.php. Puis la classe phpmailer appelle la méthode connect() de la classe smtp. Elle finira par se connecter au serveur google à l'aide de stream_context_create(), stream_socket_client() et fsockopen() pour à la fin utiliser la fonction mail().

Toute cette procédure est une telle galère à mettre en place soi-même et est tellement bien gérée par PHPMailer qu'il devient parfaitement inutile de ne pas l'utiliser, ou de ne pas utiliser une librairie de ce type de nos jours. Précisons que là j'ai intégré la librairie de manière dégueu pour le test avec des chemins absolus tous cracra, à vous de l'intégrer correctement à vos sites. Notez également que si vous utilisez un Framework, la plupart d'entre-eux utilisent une librairie de ce type pour l'envoi des email. Symfony utilise par exemple Swift Mailer, dont le fonctionnement est sensiblement le même.

Notez que le SMTPDebug est bien évidemment à passer à 0 en production, et qu'il est tout à fait possible de remplacer Gmail par votre propre serveur mail. Je l'utilise par exemple avec Postfix sur ma prod. Comme j'utilise Let's Encrypt pour signer mes certificats, je dois juste rajouter un paramètre qui autorise cette authentification :


// Set the encryption system to use - ssl (deprecated) or tls
$mail->SMTPSecure = 'tls';

// Whether to use SMTP authentication
$mail->SMTPAuth = true;

// Important !!
// Pour fonctionner avec letsencrypt
$mail->SMTPOptions = [
'ssl' => ['allow_self_signed' => true]
];



Tout l'intérêt de ce genre de librairie est la souplesse et le gain de temps en développement. Vous n'avez plus à vous préoccuper de la configuration du serveur pour envoyer vos mails, et ça fonctionne de la même manière en prod comme en dev.

Vous avez à présent un serveur de développement fonctionnel. Vous pouvez gérer différents sites et sous-domaines (même principe puisque ça reste des Vhost), vous connecter à leurs bases de données respectives, les gérer via PHPMyAdmin et envoyer des email via PHP. Vous n'avez plus qu'à développer! ;)



Auteur

SuperJohnson
Admin
"Diantre !" avatar

Commentaires

SuperJohnson
"Diantre !" user_avatar

Le

Edition de l'article pour décrire la mise à jour de MySQL en v5.7. Je pensais jusque-là que Dotdeb permettait de récupérer une version récente mais non! ^^'

obus98
user_avatar

Le

Bonjour,
Est-ce qu'il est possible de se servir du smtp de gmail pour des envois avec phpmailer de 6000 abonnés à une newsletter (gmail accepte ou pas ?) ?
Autre question, avez-vous un exemple de config de phpmailer avec postfix ?
Merci

Dernière modification le 07/11/2017 à 09h01
SuperJohnson
"Diantre !" user_avatar

Le

Salut @obus98 et désolé pour cette réponse très tardive.

De ce que je sais, Gmail n'accepte que 3000 envois d'email par jour. Voir https://support.google.com/a/answer/166852?hl=fr

Sinon j'utilise aussi Postfix, mais pas avec PHPMailer. J'envoie les mail en PHP "pur" via mon framework. J'utilise ssmtp pour faire relai vers Postfix. C'est assez complexe, il faut, en gros éditer la conf de /etc/ssmtp/ssmtp.conf.

Pour la liaison entre PHPMailer et Postfix, je ne trouve rien de concret non plus. A creuser, sans doute faudra-t-il, comme je le fais déjà, utiliser un relai smtp (ssmtp).

Et enfin, n'oublie pas que pour de l'emailing massif, la fonction mail() de PHP n''est pas performante : http://php.net/manual/fr/function.mail.php
"Pour envoyer de gros volumes de mails, reportez-vous aux paquets » PEAR::Mail et » PEAR::Mail_Queue."

Bon courage ;)

Dernière modification le 11/06/2018 à 11h49

Vous devez être connecté pour poster un commentaire.


Connectez-vous
Connectez-vous