La fonction mail() ne parvient pas à fonctionner

Eléphant du PHP | 161 Messages

17 juin 2017, 02:39

Bonjour à toutes et à tous,

J'essai à l'inscription d'un membre, de vérifier pour le moment si un lien d'activation s'envoit bien à une adresse indiquée, mais j'ai l'erreur suivante :
Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\wamp64\www\projet\views\register.php on line 34
Et je ne parviens à réparer mon erreur bien que cette erreur soit courante...

Voici mon code:


Le fichier php.ini

; For Win32 only.
; http://php.net/smtp
SMTP = smtp.gmail.com
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = "[email protected]"

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
sendmail_path = "\"C:\wamp64\sendmail\sendmail.exe" -t"

Mon fichier sendmail.ini

smtp_server=smtp.gmail.com

; smtp port (normally 25)

smtp_port=25

; SMTPS (SSL) support
;   auto = use SSL for port 465, otherwise try to use TLS
;   ssl  = alway use SSL
;   tls  = always use TLS
;   none = never try to use SSL

smtp_ssl=auto

; the default domain for this server will be read from the registry
; this will be appended to email addresses when one isn't provided
; if you want to override the value in the registry, uncomment and modify

;default_domain=mydomain.com

; log smtp errors to error.log (defaults to same directory as sendmail.exe)
; uncomment to enable logging

error_logfile=error.log

; create debug log as debug.log (defaults to same directory as sendmail.exe)
; uncomment to enable debugging

;debug_logfile=debug.log

; if your smtp server requires authentication, modify the following two lines

[email protected]
auth_password=mon mot de passe

Mon bout de code permettant l'envoi de l'email :
[...]
if(count($errors)== 0){
	$to = $email;
	$subject = WEBSITENAME. " - ACTIVATION DE COMPTE";
	$token = sha1($nom.$email.$mdp);
	ob_start();
	require('templates/emails/active.tmpl.php');
	$content = ob_get_clean();
	$headers = 'MIME-VERSION : 1.0'.'\r\n';
	$headers .= 'Content-type: text/html; charset=iso-8859-1'.'\r\n';
	mail($to,$subject,$content,$headers);
	echo "Un mail d'activation vous a été envoyé.";
}
[...]


Quelqu'un pour m'aider s'il vous plaît ? :(

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

17 juin 2017, 09:04

Bonjour,

Si tu veux utiliser la config SMTP via le php.ini, il faut que tu indiques un SMTP qui ne nécessite pas d'identification, en gros celui de ton FAI mais pas celui de Gmail.

Si tu veux utiliser le SMTP de Gmail alors il faut que tu passes par une librairie PHP qui va gérer l'authentification comme phpmailer, mais ma recommandation est véritablement d'utiliser le SMTP de ton fournisseur d'accès :
- Free : smtp.free.fr
- Orange : smtp.orange.fr
- Bouygues : smtp.bbox.fr
- SFR : smtp.sfr.fr
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 161 Messages

17 juin 2017, 09:20

Bonjour,
Donc cela veut dire que dans le fichier php.ini je dois modifier tout simplement le SMTP ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

17 juin 2017, 10:03

oui :)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 161 Messages

17 juin 2017, 14:09

Bon...

J'ai mis cela mais ça ne fonctionne toujours pas, j'ai toujours la même erreur :

; For Win32 only.
; http://php.net/smtp
SMTP = smtp.sfr.fr
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = "[email protected]"

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
sendmail_path = "\"C:\wamp64\sendmail\sendmail.exe" -t"

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail().
;mail.force_extra_parameters =

; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
mail.add_x_header = On

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

18 juin 2017, 01:55

Tu as renseigné sendmail_path alors que c'est une ligne _pour Unix only_ ;)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 161 Messages

18 juin 2017, 19:00

Ben j'ai suivi un tuto qui m'expliquait de procéder ainsi :/
Au final je dois faire quoi ?

Mon fichier php.ini
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25
Mon fichier register :

ini_set("SMTP","mail.gmail.com");
ini_set("smtp_port","25");
ini_set('sendmail_from', '[email protected]');
$to = $email;
$subject = WEBSITENAME. " - ACTIVATION DE COMPTE";
$token = sha1($nom.$email.$mdp);
ob_start();
require('templates/emails/active.tmpl.php');
$content = ob_get_clean();
$headers = 'MIME-VERSION : 1.0'.'\r\n';
$headers .= 'Content-type: text/html; charset=iso-8859-1'.'\r\n';
mail($to,$subject,$content,$headers);
echo "Un mail d'activation vous a été envoyé.";
Toujours la même erreur...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

18 juin 2017, 22:20

Redonne le message d'erreur. Comment le traduis-tu ?
Qu'est-ce que tu en déduis ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 161 Messages

18 juin 2017, 23:16

Message d'erreur : Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\wamp64\www\projet\views\register.php on line 34

Il y'a un problème de connexion au serveur d'envoi d'email : vérifier le port dans votre fichier php.ini ou utiliser ini_set() ligne 34 dans le fichier register.php

J'en déduis que mon ordinateur est stupide car peu importe ce que je fais il me balance la même erreur à chaque fois et que je ne sais pas ce qui est bon ou faux, et du coup, je tourne en rond.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

18 juin 2017, 23:21

Dommage, tu as zappé la partie importante ! ;)

Code : Tout sélectionner

Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set()
Voilà ce que ça donne :

Code : Tout sélectionner

Échec de la connexion au serveur de mail "localhost" sur le port 25, vérifiez la configuration de "SMTP" et de "smtp_port" dans le php.ini, ou utilisez ini_set()

:arrow: Donc ton problème est toujours que tu essayes d'utiliser un serveur d'envoi de mail sur "localhost" et non pas celui de ton FAI.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 161 Messages

18 juin 2017, 23:41

J'ai essayé avec mon FAI, ça ne fonctionne pas, avec le STMP de Gmail, non plus, avec localhost ça ne fonctionne toujours pas, j'ai essayé de modifier le port pour chacun rien ne fonctionne...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

18 juin 2017, 23:52

Si tu mets celui de ton FAI, tu ne peux pas avoir ce message d'erreur à l'identique, c'est impossible ou alors c'est que tu fais mal ta modif.

N'oublie pas que quand on modifie le fichier php.ini il faut redémarrer apache pour que ce soit pris en compte (pour Wampserver, clic sur l'icone W à côté de l'heure > redémarrer les services)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 161 Messages

27 juin 2017, 23:23

Bonsoir,

Bon. J'ai du effectué des démarches auprès de ma box SFR pour qu'elle accepte d'envoyer des mail pour un autre STMP que elle.
Et en fait, il s'avère qu'avec la configuration que je présenterai ci-après, j'ai le message de confirmation sans messages d'erreurs, comme quoi le mail de confirmation est bien envoyé à l'adresse renseignée (donc je fais exprès de mettre mon adresse gmail pour voir si ça marche), mais lorsque je vais dans ma boîte de réception, et bien je n'ai rien... Même dans les spams....

Voici ma configuration :

php.ini

; For Win32 only.
; http://php.net/smtp
;SMTP = 
; http://php.net/smtp-port
;smtp_port =

; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = 

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
sendmail_path = "C:\wamp64\sendmail\sendmail.exe"

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail().
;mail.force_extra_parameters =

; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
mail.add_x_header = On

; The path to a log file that will log all mail() calls. Log entries include
; the full path of the script, line number, To address and headers.
;mail.log =
; Log mail to syslog (Event Log on Windows).
;mail.log = syslog

sendmail.ini

; you must change mail.mydomain.com to your smtp server,
; or to IIS's "pickup" directory.  (generally C:\Inetpub\mailroot\Pickup)
; emails delivered via IIS's pickup directory cause sendmail to
; run quicker, but you won't get error messages back to the calling
; application.

smtp_server=smtp.gmail.com

; smtp port (normally 25)

smtp_port=465 

; SMTPS (SSL) support
;   auto = use SSL for port 465, otherwise try to use TLS
;   ssl  = alway use SSL
;   tls  = always use TLS
;   none = never try to use SSL

smtp_ssl=ssl

; the default domain for this server will be read from the registry
; this will be appended to email addresses when one isn't provided
; if you want to override the value in the registry, uncomment and modify

default_domain=gmail.com 

; log smtp errors to error.log (defaults to same directory as sendmail.exe)
; uncomment to enable logging

error_logfile=error.log

; create debug log as debug.log (defaults to same directory as sendmail.exe)
; uncomment to enable debugging

;debug_logfile=debug.log

; if your smtp server requires authentication, modify the following two lines

[email protected]
auth_password=monmotdepasse

; if your smtp server uses pop3 before smtp authentication, modify the 
; following three lines.  do not enable unless it is required.

pop3_server=
pop3_username=
pop3_password=

; force the sender to always be the following email address
; this will only affect the "MAIL FROM" command, it won't modify 
; the "From: " header of the message content

force_sender=

; force the sender to always be the following email address
; this will only affect the "RCTP TO" command, it won't modify 
; the "To: " header of the message content

force_recipient=

; sendmail will use your hostname and your default_domain in the ehlo/helo
; smtp greeting.  you can manually set the ehlo/helo name if required

hostname=

Sans oublier ma partie register.php

<?php
	require('config/db_config.php');
	require('includes/functions.php');
	if(isset($_POST['inscription'])){
		if(not_empty(['civilite','nom','prenom','email','mdp','mdp2','engage'])){
			$errors = [];
			extract($_POST);
			if(mb_strlen($nom) < 3 || mb_strlen($prenom) < 2){
				$errors[] = "Vos renseignements ne sont pas conformes, veuillez saisir 3 caractères minimum pour votre nom/prénom.";
			}
			if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
				$errors[] = "Votre adresse email a un format non adapté.";
			}
			if(mb_strlen($mdp) < 6){
				$errors[] = "Mot de passe trop court (6 caractères minimum).";
			}
			else{
				if($mdp != $mdp2){
					$errors[] = "Les deux mots de passe ne corrrespondent pas.";
				}
			}
			if(is_already_in_use('email',$email,'users')){
				$errors[] = "L'adresse email saisie est déjà utilisée pour un compte.";
			}
			if(count($errors)== 0){
				$to = $email;
				$subject = WEBSITENAME. " - ACTIVATION DE COMPTE";
				$token = sha1($nom.$email.$mdp);
				ob_start();
				require('templates/emails/active.tmpl.php');
				$content = ob_get_clean();
				$headers = 'MIME-VERSION : 1.0'.'\r\n';
				$headers .= 'Content-type: text/html; charset=iso-8859-1'.'\r\n';
				mail($to,$subject,$content,$headers);
				echo "Un mail d'activation vous a été envoyé.";
			}
		}
		else{
			$errors[] = "Veuillez renseigner tous les champs s'il vous plaît.";
		}
	}
?>


Donc c'est cool mais bon, j'aimerais poursuivre sur mon projet :|
À votre avis ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

28 juin 2017, 09:36

À votre avis ?
A mon avis tu devrais arrêter de faire des trucs au hasard, et relire ce que je t'ai dit plus haut.

Sous Windows, il y a 2 solutions simples pour faire fonctionner les mails en local :
- soit indiquer le SMTP de ton FAI
- soit utiliser une lib type PHPMailer et indiquer un SMTP externe.


Et UNIX != WINDOWS
Donc quand il y a marqué FOR UNIX ONLY et que tu t'entêtes là dessus, voila quoi...
Quand tout le reste a échoué, lisez le mode d'emploi...