logo Homepage
+  NewbieContest
|-+  Programmation» Langages Web» [Resolu] envoie de mail PHP
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [Resolu] envoie de mail PHP  (Lu 9845 fois)
neibb

Profil challenge

Classement : 258/54252

Membre Junior
**
Hors ligne Hors ligne
Messages: 76


Voir le profil
« le: 16 Juillet 2018 à 16:50:29 »

Bonjour a tous,

je voudrais parvenir a envoyer un mail via php. Mon script a l'air de bien s'executer, cependant, lors de ma phase de test je ne recois aucun message...

Code:
<?php
ini_set
("SMTP","smtp.orange.fr");                             // Utilisation du smtp ouvert de Orange
ini_set("smtp_port","25");
ini_set("sendmail_from","test@gmail.com");            // Devrait fonctionner avec n'importe quoi ici (Teste et approuve sur python)
ini_set("display_errors");

$mail 'mon_adresse@mail.com';                              // Declaration de l'adresse de destination.
$passage_ligne "\n";
$message_txt "Message de test.";

 
//Creation de la boundary
$boundary "-----=".md5(rand());

 
//Sujet.
$sujet "Test";

 
//Creation du header de l'e-mail.
//$header = "From: \"neib\"<adresse@mail.com>".$passage_ligne;       // Ici j'ai commente car pour moi c'est mes ini_set du debut, mais meme decommente ca ne marche pas...
$header "Reply-to: \"neib\"<mon_adresse@mail.com>".$passage_ligne;
$header.= "MIME-Version: 1.0".$passage_ligne;
$header.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;

 
//Creation du message.
$message $passage_ligne."--".$boundary.$passage_ligne;

//Ajout du message au format texte.
$message.= "Content-Type: text/plain; charset=\"ISO-8859-1\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
$message.= $passage_ligne.$message_txt.$passage_ligne;

//Fermeture boundary
$message.= $passage_ligne."--".$boundary."--".$passage_ligne;


//Envoi du mail.
try
{
mail($mail,$sujet,$message,$header);
}
catch (
Exception $e)
{
echo 
"Message could not be sent.";
echo 
"Mailer Error: " $mail->ErrorInfo;
}

echo 
"Message has been sent.";
?>


Ce qui m'enerve c'est que je n'arrive pas du tout a comprendre ce qui ne va pas. J'ai essaye plusieurs variantes, mais ce code est le seul qui ne me retourne aucune erreur.
Au passage, je me demande meme si je pourrait pas completement me passer du header? (Meme resultat avec ou sans.)
Est-ce qu'une ame charitable pourrait m'aider a y voir plus clair?

Merci beaucoup.
« Dernière édition: 17 Juillet 2018 à 19:52:24 par neibb » Journalisée

neibb.
the lsd
Administrateur

Profil challenge

Classement : 189/54252

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #1 le: 16 Juillet 2018 à 17:05:36 »

Io

1. Le smtp orange écoute t-il bien sur le port 25
2. Regarde avec un outil comme wireshark si tes paquets partent bien
3. Spam ?
4. Trop de code. Réduis le au strict minimum afin de voir s'il est fonctionnel, puis rajoute tes différentes parties (les headers additionnel, les boundaries, etc)

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
neibb

Profil challenge

Classement : 258/54252

Membre Junior
**
Hors ligne Hors ligne
Messages: 76


Voir le profil
« #2 le: 16 Juillet 2018 à 17:28:57 »

Ok merci.
Oui, j'etais justement en train de simplifier tout ca :

Code:
<?php
ini_set
("SMTP","smtp.orange.fr");
ini_set("smtp_port","25");
ini_set("sendmail_from","test@gmail.com");
ini_set("display_errors");

$mail 'mon_adresse@mail.com';
$message "Message de test.";
$sujet "Test";

try
{
mail($mail,$sujet,$message);
}
catch (
Exception $e)
{
echo 
"Message could not be sent. ";
echo 
"Mailer Error: " $mail->ErrorInfo;
exit;
}

echo 
"Message has been sent";
?>


Citation
1. Le smtp orange écoute t-il bien sur le port 25
Oui, je l'ai deja utilise via un autre code en python est fonctionne parfaitement.

Citation
2. Regarde avec un outil comme wireshark si tes paquets partent bien
Alors c'est quelque chose que je ne maitrise vraiment pas... (l'occaz de s'y mettre me dira-t-on.)

Code:
3. Spam ?
Ce n'est vraiment pas mon idee ici. J'ai meme hesite un peu avant d'effectuer mon premier post. Non, c'est une reflexion faite a partir d'un challenge, qui me permet au passage de me faire la main en programmation.

Bon, je vais chercher du cote de wireshark alors. Sinon, dans le code, rien de choquant?

En tout cas merci bien!


Journalisée

neibb.
flob
Administrateur

Profil challenge

Classement : 19/54252

Membre Junior
*****
Hors ligne Hors ligne
Messages: 74


Voir le profil WWW
« #3 le: 16 Juillet 2018 à 19:37:35 »

Salut !

Si par hasard tu utilises Wamp, tu dois installer et configurer sendmail car il n'est pas inclut par défaut.
Tu peux facilement trouver un tuto pour faire ça en cherchant "wamp sendmail" sur ton moteur de recherche favori.

Petit détail : il me semble que la fonction mail de Php ne lance pas d'exception, le try catch n'est donc pas utile.
Journalisée

Newbie Contest Staff :
Flob
Statut :
Administrateur
Citation :
...
Blog :
elrindel.github.io
neibb

Profil challenge

Classement : 258/54252

Membre Junior
**
Hors ligne Hors ligne
Messages: 76


Voir le profil
« #4 le: 17 Juillet 2018 à 00:26:50 »

Salut flob,
j'ai installe php avec Apache2 sur debian.
De ce que j'ai pu voir, php inclu une fonction native mail() independante de sendmail:

Citation
"Il n'y pas d'installation nécessaire pour utiliser ces fonctions, elles font parties du coeur de PHP.",
 http://php.net/manual/fr/book.mail.php

Et en meme temps je viens de trouver le contre-exemple :
Citation
Configuration à l'exécution :
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
Options de configuration pour le mail:

Nom                     Défaut                                   Modifiable
(...)
SMTP                  "localhost"                             PHP_INI_ALL   
smtp_port           "25"                                      PHP_INI_ALL   
sendmail_from    NULL                                     PHP_INI_ALL
sendmail_path    "/usr/sbin/sendmail -t -i"       PHP_INI_SYSTEM
On voit bien ici l'appel a sendmail derniere ligne. Les deux trois lignes d'avant viennent pour appuyer mon code.

Du coup j'avais exim4 d'installe par defaut dans debian et non sendmail, dans un premier temps j'ai teste avec :
Code:
ini_set("sendmail_path","/usr/sbin/exim4");
mais sans succes. (Modifiable que par system? donc pas moi?)
Je l'ai donc desinstalle et remplace par sendmail, mais le mail n'arrive toujours pas.

Voici le contenu de mon php.ini:
Code:
[mail function]
; For Win32 only.
; http://php.net/smtp
;SMTP = localhost
SMTP = smtp.orange.fr
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = me@example.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
;sendmail_path = /usr/sbin/exim4
sendmail_path = "/usr/sbin/sendmail -t -i"
(teste avec exim4 puis commente apres installation de sendmail, du coup la valeur par defaut me semble bien.)

Pour le try/catch, en fait je cherchais un moyen de choper les messages d'erreurs possibles. Me disant que si la fonction mail() echouait j'aurai une exception.
Du coup comment je pourrais faire pour attraper les erreurs possibles?


Du cote de wireshark, j'ai ecoute sur wlan0. Etant donne la masse de resultats, j'ai filtre avec l'ip de smtp.orange.fr mais je n'ai rien vu. Rien non plus sur le port 25 ou le protocole smtp. Apres je cherche peut etre mal, je decouvre juste wireshark.

Mon probleme pourrait-il venir de ma configuration d'Apache?
Je vais continuer de creuser, peut-etre qu'en reprenant la doc a tete repose ca ira mieux. Merci de vos reponses!

PS: Desole, the lsd, je ne t'ai pas salue sur mon precedent message, je devais etre trop presse d'avoir une reponse...
Alors du coup j'en profite maintenant : Salut the lsd! Merci de ta reponse (en + si rapide!), et je te prie de m'escuser pour ce manque de politesse.  
« Dernière édition: 17 Juillet 2018 à 00:33:02 par neibb » Journalisée

neibb.
neibb

Profil challenge

Classement : 258/54252

Membre Junior
**
Hors ligne Hors ligne
Messages: 76


Voir le profil
« #5 le: 17 Juillet 2018 à 14:40:56 »

Bon, je viens un peu faire le point, vu que mon precedent  message etait quand meme un peu brouillon.

1 - Effectivement, la fonction mail() de PHP utilise bien par defaut l'outil sendmail, mais sendmail n'est pas le seul possible.
Par defaut Debian lui, a d'installe exim4 (qui doit faire plus ou moins la meme chose que sendmail).

2 - On peut specifier ce genre de choses a PHP grace au fichier php.ini,
a la rubrique : [mail function],
a la ligne : sendmail_path = "/usr/sbin/exim4 -t -i" ou bien : sendmail_path = "/usr/sbin/sendmail -t -i".

J'ai donc essaye avec les deux programmes mais visiblement aucun mail n'est envoye.
J'ai egalement suivi la doc officielle de PHP afin d'utiliser la fonction mail() de la maniere la plus simple possible.
En cherchant a propos de Apache2 et l'envoi de mail, je retombe toujours sur l'utilisation de PHP. Donc mon probleme viendrait surement de sa (mauvaise) configuration...

Par contre j'ai trouve ca sur le net :
Citation
Si vous envisagez d'envoyer du courrier à d'autres domaines Internet, vous devez vous assurer que l'adresse IP de la machine qui envoie le courrier comporte également une entrée DNS inversée (enregistrement PTR). La plupart des fournisseurs d'accès Internet importants rejetteront votre courrier si votre adresse IP n'a pas d'enregistrement PTR ou s'il pointe vers un hôte générique (par exemple, 1.2.3.3.domain.isp.com). Il devrait inverser quelque chose comme mail.yourdomain.com

Cependant, comme je l'expliquais au debut, ce service smtp de chez orange, je l'ai deja teste et approuve (encore a l'instant via un script python et le mail est bien recu) et a aucun moment je me suis pose de questions a propos de ce PTR...

Par contre j'ai reussi a intercepter le mail envoye via python sur wireshark, ce qui me permet de bien visualiser sa structure. Peut-etre est-ce juste une erreur de conception/structure/compatibilite?
A suivre...

Des gens ont-ils deja envoye des mail via PHP (de maniere authentifie ou non) histoire de comparer?
Merci!
« Dernière édition: 17 Juillet 2018 à 14:44:01 par neibb » Journalisée

neibb.
flob
Administrateur

Profil challenge

Classement : 19/54252

Membre Junior
*****
Hors ligne Hors ligne
Messages: 74


Voir le profil WWW
« #6 le: 17 Juillet 2018 à 16:58:54 »

Perso j'utilise PHPMailer pour faciliter les choses ...

Pour sendmail, tu dois avoir une configuration à faire pour indiquer le SMTP etc... J'ai pas encore eu l'occasion de réaliser ce genre de config, voilà un lien qui semble donner pas mal d'infos : https://www.digitalocean.com/community/tutorials/how-to-send-email-through-an-external-smtp-service-with-sendmail-on-freebsd-10-1
Journalisée

Newbie Contest Staff :
Flob
Statut :
Administrateur
Citation :
...
Blog :
elrindel.github.io
the lsd
Administrateur

Profil challenge

Classement : 189/54252

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #7 le: 17 Juillet 2018 à 17:03:12 »

Neibb, pas de souci, je me formalise pas pour ça t'en fais pas ^^


Pour le spam, ma question, c'était pas si ton but était d'en faire (encore heureux), mais si ton mail ne tombait pas dans tes spams ^^'
De toute façon, si tu ne vois rien avec wireshark, c'est que le problème vient bien de ton code

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
neibb

Profil challenge

Classement : 258/54252

Membre Junior
**
Hors ligne Hors ligne
Messages: 76


Voir le profil
« #8 le: 17 Juillet 2018 à 19:48:45 »

Ca y est!, j'en suis venu a bout!!!

Donc c'etait bel et bien un probleme de configuration.
Je suis reparti sur exim4 au final mais la procedure doit etre la meme avec sendmail :

Pour la configuration :
Code:
sudo dpkg-reconfigure exim4-config
De la, on a une interface qui s'affiche a l'ecran, il suffit de repondre au questions.
Ou alors modifier directement le fichier /etc/exim4/update-exim4.conf.conf.

Apres on recharge la nouvelle config :
Code:
sudo update-exim4.conf

Et on redemarre le service :
Code:
sudo service exim4 restart

Un peu plus de detailles dans un lien ci-joint.
J'ai un peu honte, j'aurais du commencer par la... https://doc.ubuntu-fr.org/exim4-satellite  
(En meme temps, personne ne parlait de ca dans les docs que j'avais suivi... (ni meme pour sendmail))

Du coup pour la configuration de sendmail on peut faire ca :
Code:
sudo sendmailconfig


J'ai egalement modifie le fichier /etc/hosts pour y mettre en premiere ligne:
Code:
127.0.0.1 localhost localhost.localdomain domain_name          # En remplacant "localhost.localdomain" et "domain_name" par les infos qui vont biens.
Puis en commentant les doublons.

On redemarre exim4, puis apache2, et la miracle ca fonctionne!

Bon il reste bien les petites configurations a faire, mais ca je m'en charge! Oh top!
Un grand merci a vous deux!  

PS : Pour l'histoire des spams, a ouais, j'avais pas compris ^^ bon ba tant mieux alors!
Et puis merci au passage, j'ai pu voir que wireshark etait pas bien mechant, et tres interessant!
« Dernière édition: 17 Juillet 2018 à 19:54:19 par neibb » Journalisée

neibb.
Pages: [1]
  Imprimer  
 
Aller à: