Comment puis-je envoyer des e-mails via mes scripts PHP tout en conservant le pare-feu réseau activé ?

Bonjour,

Pour vous contextualiser :
Mon client possède un serveur VPS hébergé chez OVH sur lequel sont installés WHM et cPanel. Ce serveur exécute des scripts PHP via des tâches cron, réalisant plusieurs actions, dont l’envoi d’e-mails.
Début octobre, le service anti-hack d’OVH s’est déclenché. Après quelques recherches, nous avons conclu qu’il s’agissait d’une fausse alerte. Depuis, OVH a ajusté les seuils de l’anti-DDoS et m’a conseillé d’activer et de paramétrer le pare-feu réseau.

Depuis l’activation de ce pare-feu, les e-mails envoyés via les scripts PHP, et plus précisément via la fonction mail(), ne fonctionnent plus.
Les ports suivants ont pourtant été ouverts :

Priorité     Mode         Protocole     Adresse IP source     Port de destination     Statut
6              Autoriser     TCP              tous                            25                              Actif     
7              Autoriser     TCP              tous                            465                            Actif     
8              Autoriser     TCP              tous                            143                            Actif     
9              Autoriser     TCP              tous                            993                            Actif
10            Autoriser     TCP              tous                            110                            Actif     
11            Autoriser     TCP              tous                            995                            Actif
15            Autoriser     TCP              tous                            587                            Actif

J’ai également tenté d’envoyer les mails via PHPMailer, en utilisant le relais SMTP OVH, mais cela ne fonctionne pas non plus :

.....
// Paramètres SMTP
        $mail->isSMTP();
        $mail->Host       = [NOM_VPS]; 
        $mail->SMTPAuth   = true;
        $mail->Username   = [EMAIL_O2SWITCH]; // Je n'ai pas d'adresse mail OVH.
        $mail->Password   = [MDP_EMAIL_O2SWITCH];      
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
        $mail->Port       = 465;
    // Options SSL pour vérifier le certificat
    $mail->SMTPOptions = [
        'ssl' => [
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true,
        ],
    ];

    // Destinataire et expéditeur
    $mail->setFrom([EMAIL_O2SWITCH], 'Nom du site');
    $mail->addAddress([EMAIL_TEST]);

    // Contenu
    $mail->isHTML(true);
    $mail->Subject = 'Test mail';
    $mail->Body    = 'Ceci est un test depuis le VPS via le relais SMTP OVH.';

    // Debug (optionnel pour voir la négociation)
    $mail->SMTPDebug = 2;
    $mail->Debugoutput = 'html';

    $mail->send();
    echo 'Message envoyé avec succès !';

Avez-vous une idée de l’origine de ce problème et comment je pourrais le résoudre ?

Merci par avance pour votre aide.
Bien cordialement,
Loïc V.

Bonjour,

Vous dites: Depuis l’activation de ce pare-feu, les e-mails envoyés via les scripts PHP, et plus précisément via la fonction mail(), ne fonctionnent plus.

Puisque vous administrez un VPS, ça ne suffit pas de dire : ça ne fonctionne pas.

Soit votre applicatif se mange un code d'erreur lors de l'appel de mail(), soit la soumission du mail est acceptée et ce mail se trouve quelque part.

Voyez la commande: mailq

Voyez vos logs dans /var/log/mail.log

Je vous invite à revenir avec un diagnostic plus étoffé.

Bonjour,

Aussi il faudrait voir vos règles de firewall network au complet, car normalement en position 0 vous devriez avoir une règle "established".

Cordialement, janus57

Ceci m'interpelle aussi: $mail->Host = [NOM_VPS];

Ce n'est donc pas le SMTP OVH, et de plus vous mettez dans les commentaires que vous n'avez pas d'adresse mail OVH.

Bonjour @fritz2cat 🇧🇪 🇪🇺 et @janus57,

Tout d’abord, merci pour vos réponses.
Désolé pour le délai, je n’ai pas pu me connecter ce weekend. J’ai l’impression que depuis la mise en place du pare-feu réseaux, il m’arrive parfois de ne plus pouvoir accéder aux services du VPS (WHM, FTP, cPanel) pendant un laps de temps.

our te répondre @fritz2cat 🇧🇪 🇪🇺, j’ai testé la commande mailq, mais elle semble introuvable.
J’ai donc réalisé un test pour envoyer un mail :

$to = "[email_destinataire]";
	$subject = "Test mail() depuis VPS";
	$message = "Ceci est un test simple.";
	$headers = "From: [email_emetteur]\r\n";
if (mail($to, $subject, $message, $headers)) {
	echo "✅ Message accepté par mail()";
} else {
	echo "❌ Erreur : mail() a échoué";
}</code></pre>

J’ai eu le retour suivant ✅ : Message accepté par mail(), ce qui signifie que les mails sont bien envoyés mais semblent bloqués quelque part.
J’ai également testé la commande exim -bp, qui m’a affiché une liste d’e-mails en attente.
J’ai ensuite récupéré les logs et voici le résultat obtenu lors de mon test :

2025-11-03 14:13:15 cwd=/home/scriptxxxx 3 args: /usr/sbin/sendmail -t -i
2025-11-03 14:13:15 1vFuN1-0000000001F-2w1K <= scriptxxxxx@vps-xxxxx.vps.ovh.net U=scriptxxxx P=local S=480 T="Test mail() depuis VPS" for xxxxx@gmail.com
2025-11-03 14:13:15 cwd=/var/spool/exim 3 args: /usr/sbin/exim -Mc 1vFuN1-0000000001F-2w1K
2025-11-03 14:13:15 1vFuN1-0000000001F-2w1K Sender identification U=scriptxxxx D=xxxx.fr S=scriptxxxx
2025-11-03 14:13:15 1vFuN1-0000000001F-2w1K ** xxxxxx@gmail.com R=enforce_mail_permissions: Domain xxxx.fr has exceeded the max defers and failures per hour (5/5 (100%)) allowed. Message discarded.
2025-11-03 14:13:15 cwd=/var/spool/exim 7 args: /usr/sbin/exim -t -oem -oi -f <> -E1vFuN1-0000000001F-2w1K
2025-11-03 14:13:16 1vFuN1-0000000001K-45q7 <= <> R=1vFuN1-0000000001F-2w1K U=mailnull P=local S=1955 T="Mail delivery failed: returning message to sender" for scriptxxxxx@vps-xxxx.vps.ovh.net
2025-11-03 14:13:16 cwd=/var/spool/exim 3 args: /usr/sbin/exim -Mc 1vFuN1-0000000001K-45q7
2025-11-03 14:13:16 1vFuN1-0000000001F-2w1K Completed
2025-11-03 14:13:16 SMTP connection from [127.0.0.1]:37568 (TCP/IP connection count = 1)
2025-11-03 14:13:16 1vFuN1-0000000001K-45q7 [127.0.0.1] SSL verify error: certificate name mismatch: DN="/CN=vps-xxxxx.vps.ovh.net" H="127.0.0.1"
2025-11-03 14:13:16 SMTP connection identification H=localhost A=127.0.0.1 P=37568 U=mailnull ID=47 S=mailnull B=identify_local_connection
2025-11-03 14:13:16 1vFuN2-000000075un-0wTu <= <> H=localhost (vps-xxx.vps.ovh.net) [127.0.0.1]:37568 P=esmtps X=TLS1.3:TLS_AES_256_GCM_SHA384:256 CV=no S=2228 id=E1vFuN1-0000000001K-45q7@vps-xxxx.vps.ovh.net T="Mail delivery failed: returning message to sender" for scriptxxxx@vps-xxxx.vps.ovh.net
2025-11-03 14:13:16 cwd=/var/spool/exim 3 args: /usr/sbin/exim -Mc 1vFuN2-000000075un-0wTu
2025-11-03 14:13:16 SMTP connection from localhost (vps-xxxx.vps.ovh.net) [127.0.0.1]:37568 D=0s closed by QUIT
2025-11-03 14:13:16 1vFuN1-0000000001K-45q7 => scriptxxxx@vps-xxxxxx.vps.ovh.net R=deliver_local_outside_jail T=remote_smtp H=127.0.0.1 [127.0.0.1] X=TLS1.3:TLS_AES_256_GCM_SHA384:256 CV=no C="250 OK id=1vFuN2-000000075un-0wTu"
2025-11-03 14:13:16 1vFuN1-0000000001K-45q7 Completed
2025-11-03 14:13:16 1vFuN2-000000075un-0wTu => scriptxxxx<script> R=localuser T=dovecot_delivery C="250 2.0.0 <script> PQAFD2yqCGmizRkAMVBhDg Saved"
2025-11-03 14:13:16 1vFuN2-000000075un-0wTu Completed

Pour finir, @fritz2cat 🇧🇪 🇪🇺, concernant PHPMailer, j’ai testé avec vpsXXXX.ovh.net et ssl0.ovh.net, ainsi qu’avec les SMTP d’o2switch, mais aucun mail n’a été reçu.
Honnêtement, je préférerais que cela fonctionne via la fonction mail() de PHP, afin d’éviter de devoir tout modifier.


@janus57, voici la liste des règles actuellement appliquées :

0 	Autoriser 	TCP 	tous 		80 		Actif 	
1 	Autoriser 	TCP 	tous 		443 		Actif 	
2 	Autoriser 	TCP 	tous 		2087 		Actif 	
3 	Autoriser 	TCP 	tous 		2083 		Actif 	
4 	Autoriser 	TCP 	tous 		49152 		Actif 	
5 	Autoriser 	TCP 	212.194.142.225/32 		21 		Actif 	
6 	Autoriser 	TCP 	tous 		25 		Actif 	
7 	Autoriser 	TCP 	tous 		465 		Actif 	
8 	Autoriser 	TCP 	tous 		143 		Actif 	
9 	Autoriser 	TCP 	tous 		993 		Actif
10 	Autoriser 	TCP 	tous 		110 		Actif 	
11 	Autoriser 	TCP 	tous 		995 		Actif 	
12 	Autoriser 	TCP 	tous 		49153 		Actif 	
13 	Autoriser 	TCP 	tous 		49154 		Actif 	
14 	Autoriser 	TCP 	tous 		49155 		Actif 	
15 	Autoriser 	TCP 	tous 		587 		Actif 	
19 	Refuser 	IPv4 	tous 				Actif

Cela vous semble-t-il correct ?

Merci par avance pour votre aide.

Bonjour @fritz2cat 🇧🇪 🇪🇺 et @janus57,

Tout d’abord, merci pour vos réponses.
Désolé pour le délai, je n’ai pas pu me connecter ce weekend. J’ai l’impression que depuis la mise en place du pare-feu réseaux, il m’arrive parfois de ne plus pouvoir accéder aux services du VPS (WHM, FTP, cPanel) pendant un laps de temps.

our te répondre @fritz2cat 🇧🇪 🇪🇺, j’ai testé la commande mailq, mais elle semble introuvable.
J’ai donc réalisé un test pour envoyer un mail :

$to = "[email_destinataire]";
	$subject = "Test mail() depuis VPS";
	$message = "Ceci est un test simple.";
	$headers = "From: [email_emetteur]\r\n";
if (mail($to, $subject, $message, $headers)) {
	echo &#34;✅ Message accepté par mail()&#34;;
} else {
	echo &#34;❌ Erreur : mail() a échoué&#34;;
}</code></pre>

J’ai eu le retour suivant ✅ : Message accepté par mail(), ce qui signifie que les mails sont bien envoyés mais semblent bloqués quelque part.
J’ai également testé la commande exim -bp, qui m’a affiché une liste d’e-mails en attente.
J’ai ensuite récupéré les logs et voici le résultat obtenu lors de mon test :

2025-11-03 14:13:15 cwd=/home/scriptxxxx 3 args: /usr/sbin/sendmail -t -i
2025-11-03 14:13:15 1vFuN1-0000000001F-2w1K <= scriptxxxxx@vps-xxxxx.vps.ovh.net U=scriptxxxx P=local S=480 T="Test mail() depuis VPS" for xxxxx@gmail.com
2025-11-03 14:13:15 cwd=/var/spool/exim 3 args: /usr/sbin/exim -Mc 1vFuN1-0000000001F-2w1K
2025-11-03 14:13:15 1vFuN1-0000000001F-2w1K Sender identification U=scriptxxxx D=xxxx.fr S=scriptxxxx
2025-11-03 14:13:15 1vFuN1-0000000001F-2w1K ** xxxxxx@gmail.com R=enforce_mail_permissions: Domain xxxx.fr has exceeded the max defers and failures per hour (5/5 (100%)) allowed. Message discarded.
2025-11-03 14:13:15 cwd=/var/spool/exim 7 args: /usr/sbin/exim -t -oem -oi -f <> -E1vFuN1-0000000001F-2w1K
2025-11-03 14:13:16 1vFuN1-0000000001K-45q7 <= <> R=1vFuN1-0000000001F-2w1K U=mailnull P=local S=1955 T="Mail delivery failed: returning message to sender" for scriptxxxxx@vps-xxxx.vps.ovh.net
2025-11-03 14:13:16 cwd=/var/spool/exim 3 args: /usr/sbin/exim -Mc 1vFuN1-0000000001K-45q7
2025-11-03 14:13:16 1vFuN1-0000000001F-2w1K Completed
2025-11-03 14:13:16 SMTP connection from [127.0.0.1]:37568 (TCP/IP connection count = 1)
2025-11-03 14:13:16 1vFuN1-0000000001K-45q7 [127.0.0.1] SSL verify error: certificate name mismatch: DN="/CN=vps-xxxxx.vps.ovh.net" H="127.0.0.1"
2025-11-03 14:13:16 SMTP connection identification H=localhost A=127.0.0.1 P=37568 U=mailnull ID=47 S=mailnull B=identify_local_connection
2025-11-03 14:13:16 1vFuN2-000000075un-0wTu <= <> H=localhost (vps-xxx.vps.ovh.net) [127.0.0.1]:37568 P=esmtps X=TLS1.3:TLS_AES_256_GCM_SHA384:256 CV=no S=2228 id=E1vFuN1-0000000001K-45q7@vps-xxxx.vps.ovh.net T="Mail delivery failed: returning message to sender" for scriptxxxx@vps-xxxx.vps.ovh.net
2025-11-03 14:13:16 cwd=/var/spool/exim 3 args: /usr/sbin/exim -Mc 1vFuN2-000000075un-0wTu
2025-11-03 14:13:16 SMTP connection from localhost (vps-xxxx.vps.ovh.net) [127.0.0.1]:37568 D=0s closed by QUIT
2025-11-03 14:13:16 1vFuN1-0000000001K-45q7 => scriptxxxx@vps-xxxxxx.vps.ovh.net R=deliver_local_outside_jail T=remote_smtp H=127.0.0.1 [127.0.0.1] X=TLS1.3:TLS_AES_256_GCM_SHA384:256 CV=no C="250 OK id=1vFuN2-000000075un-0wTu"
2025-11-03 14:13:16 1vFuN1-0000000001K-45q7 Completed
2025-11-03 14:13:16 1vFuN2-000000075un-0wTu => scriptxxxx<script> R=localuser T=dovecot_delivery C="250 2.0.0 <script> PQAFD2yqCGmizRkAMVBhDg Saved"
2025-11-03 14:13:16 1vFuN2-000000075un-0wTu Completed

Pour finir, @fritz2cat 🇧🇪 🇪🇺, concernant PHPMailer, j’ai testé avec vpsXXXX.ovh.net et ssl0.ovh.net, ainsi qu’avec les SMTP d’o2switch, mais aucun mail n’a été reçu.
Honnêtement, je préférerais que cela fonctionne via la fonction mail() de PHP, afin d’éviter de devoir tout modifier.

@janus57, voici la liste des règles actuellement appliquées :

0 	Autoriser 	TCP 	tous 		80 		Actif 	
1 	Autoriser 	TCP 	tous 		443 		Actif 	
2 	Autoriser 	TCP 	tous 		2087 		Actif 	
3 	Autoriser 	TCP 	tous 		2083 		Actif 	
4 	Autoriser 	TCP 	tous 		49152 		Actif 	
5 	Autoriser 	TCP 	212.194.142.225/32 		21 		Actif 	
6 	Autoriser 	TCP 	tous 		25 		Actif 	
7 	Autoriser 	TCP 	tous 		465 		Actif 	
8 	Autoriser 	TCP 	tous 		143 		Actif 	
9 	Autoriser 	TCP 	tous 		993 		Actif
10 	Autoriser 	TCP 	tous 		110 		Actif 	
11 	Autoriser 	TCP 	tous 		995 		Actif 	
12 	Autoriser 	TCP 	tous 		49153 		Actif 	
13 	Autoriser 	TCP 	tous 		49154 		Actif 	
14 	Autoriser 	TCP 	tous 		49155 		Actif 	
15 	Autoriser 	TCP 	tous 		587 		Actif 	
19 	Refuser 	IPv4 	tous 				Actif

Cela vous semble-t-il correct ? Avez-vous une idée pour résoudre le problème rencontrer ?

Merci par avance pour votre aide.

Désolé, je n'ai jamais utilisé Exim pour les mails, et vous ne trouverez pas grand monde ici qui l'utilise et puisse vous aider.

On a une nette préférence pour Postfix.

Merci pour votre retour @fritz2cat 🇧🇪 🇪🇺 .

Je comprends votre préférence pour Postfix.
Sur mon VPS, Exim est installé par défaut avec cPanel, et je ne voudrais pas prendre le risque de tout casser en changeant de système.
Je souhaite simplement que mes scripts PHP puissent envoyer des mails correctement, comme c’était le cas avant l’activation du pare-feu réseaux.

D’après les informations transmises précédemment, auriez‑vous une piste pour m’aider dans ce contexte ?

Merci par avance pour votre aide.

Voyez avec le support cPanel ou des forums dédiés à ce panel.

Le fait que votre serveur soit chez OVH n'a en fait aucune importance.

Bonjour @fritz2cat 🇧🇪 🇪🇺,

Merci pour votre réponse et pour votre conseil.
J’espère que cela me permettra d’avancer vers une solution à ce problème.

Si quelqu’un a d’autres pistes ou suggestions, n’hésitez pas à les partager !

Je reprends votre message avec les messages Exim.

Il y a "scriptxxxx<script> R=localuser T=dovecot_delivery C="250 2.0.0 <script> PQAFD2yqCGmizRkAMVBhDg Saved" "

J'ai l'impression que ce mail n'est jamais sorti de votre serveur, en effet, mais qu'il a été livré à un utilisateur local de la machine.

C'est peut-être le message d'erreur qui vous donnerait l'explication de la non-transmission à l'extérieur.

Merci pour votre retour.

Pour information, j’ai retrouvé ce message et voici ce que j’y ai trouvé :

This message was created automatically by mail delivery software.

A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:

[MAIL_DESTINATAIRE]
Domain [DOMAIN_CLIENT] has exceeded the max defers and failures per hour (5/5 (100%)) allowed. Message discarded.

Auriez-vous une idée d’explication ? J’avoue que cela me paraît un peu flou de mon côté.

Merci par avance !

Erreur de configuration Exim,

ou bien de firewall. (le port 25 doit être ouvert en sortie)
Au-delà de vos règles en entrée (que vous avez montrées plus haut), j'ignore si vous avez aussi mis des règles en sortie.

Merci @fritz2cat 🇧🇪 🇪🇺 pour votre retour !

J’ai donc exécuté la commande suivante :

nc -zv gmail-smtp-in.l.google.com 25

Voici le retour obtenu :

nc: connect to gmail-smtp-in.l.google.com (108.177.96.26) port 25 (tcp) failed: Connection timed out
nc: connect to gmail-smtp-in.l.google.com (2a00:1450:4013:c06::1a) port 25 (tcp) failed: Network is unreachable

Puis, je me suis permis d’exécuter cette commande :

iptables -L OUTPUT -n | grep 25

Voici le résultat obtenu :

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 25,465,587 owner GID match 988
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 25,465,587 owner GID match 12
ACCEPT     tcp  --  0.0.0.0/0            127.0.0.1            multiport dports 25,465,587 owner UID match 990
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 25,465,587 owner UID match 0

Si je comprends bien, selon mes connaissances limitées dans le domaine, le port 25 semble bloqué en sortie par OVH sur mon VPS. Est-ce correct ?

Que me conseillez-vous de faire pour résoudre ce problème ?

Merci par avance pour votre aide.

Bonjour,

Pour mois vos règles devrait plutôt être quelque chose comme ça :

Note : je comprend pas pourquoi vous avez ouvert de 49152 à 49155

Règle 0 (la plus importante) : autorise les connexion ouverte par le serveur à revenir vers le serveur.

Règle 5 : pour autoriser votre serveur à faire des requêtes DNS trop lourde et qui basculerais en UDP

Règles 13&14 : pour du FTP en mode actif (beaucoup mieux que du passif ou il y a plus de ports à ouvrir que de règles possible (et surtout vous avez pas envie d'ouvrir les ports de 49152 à 65534, Cf : https://docs.cpanel.net/knowledge-base/ftp/how-to-enable-ftp-passive-mode/)

Cordialement, janus57

A tout hasard, OVH n'aurait pas bloqué le port 25 suite à un incident de spam ?

Voir https://help.ovhcloud.com/csm/fr-dedicated-servers-antispam-best-practices?id=kb_article_view&sysparm_article=KB0043258

Bonjour @janus57

Merci pour votre réponse et vos explications.

Pour répondre à votre remarque : j’ai ouvert les ports 49152 à 49155 pour le FTP en mode passif et, par la même occasion, j’ai restreint le FTP passif uniquement à ces ports, et non à la plage 49152-65534.
Je prends note de votre conseil d’utiliser de préférence le FTP en mode actif.

Merci également pour les autres règles et je verrai pour mettre cela en place.

Depuis ce matin, je ne peux plus accéder à WHM et cPanel, apparemment à cause de la licence cPanel qui serait expirée, alors que son expiration est prévue en décembre 2025.
Je vais donc d’abord résoudre ce problème d’accès à WHM et cPanel afin de pouvoir tester l’envoi des mails en direct, puis je reviendrai sur ce sujet et je vous informerai dès que cela sera opérationnel.

Bien cordialement.

Bonjour @fritz2cat 🇧🇪 🇪🇺 ,

J’ai vérifié, mais aucune alerte n’est recensée sur les adresses IP, donc je ne sais pas si le port 25 a été bloqué.
Toutefois, d’après mon message précédent (au-dessus du votre), il semble que le port 25 soit bloqué en sortie par OVH.
Pensez-vous que je dois les contacter pour clarifier ce point avec eux ?

Bonjour,

si le problème ne se produit que pendant que le firewall network est activé votre port 215 n'est pas bloqué, par contre le firewall est mal configuré.

Cordialement, janus57

Bonjour tout le monde,

Désolé pour le délai de réponse, je voulais m’assurer que tout fonctionnait correctement avant de revenir vers vous.

La semaine dernière, je n’avais plus accès à WHM et à cPanel à cause d’un prétendu problème de licence expirée. J’ai donc dû passer le serveur en mode Rescue pour résoudre la situation.
Il s’avère que la cause venait d’une mauvaise configuration du pare-feu réseau. Depuis que je l’ai reconfiguré comme me l’avait conseillé @janus57, j’ai retrouvé l’accès à WHM et cPanel, et l’envoi des mails fonctionne à nouveau.

Merci à tous pour votre aide !