Page 1 sur 1

[SSMTP & PHP] - Envoi d'un mail via la fonction mail() - (Résolu)

Publié : mar. 22 sept. 2015, 18:55
par Maltergate
Bonjour à tous et à toutes.

J'aimerais sur l'un de mes sites avoir un formulaire de contact qui, une fois rempli par l'utilisateur, m'enverrait un mail avec les informations.

J'ai décidé d'utiliser ssmtp plutôt que de monter un postfix ou autre... J'ai configuré ce dernier pour qu'il transmette le message au SMTP de Gmail à l'aide d'une adresse perso. Ssmtp fonctionne bien puisque lorsque j'exécute la commande suivante :

Code : Tout sélectionner

echo test121 | mail -v -s "encore un autre test" monadresse@outlook.fr
J'ai bien un mail envoyé par Gmail, qui atterrit dans ma boîte Outlook.

Cependant, lorsque je passe à PHP, les choses se compliquent. J'ai un fichier contact.php :

Code : Tout sélectionner

<?php
$name = $_POST['name'];
$email_address = $_POST['email'];
$phone = $_POST['phone'];
$message = $_POST['message'];
	
$to = 'monadresse@outlook.fr';
$email_subject = "Formulaire de contact Invie:  $name";
$email_body = "You have received a new message from your website contact form.\n\n"."Here are the details:\n\nName: $name\n\nEmail: $email_address\n\nPhone: $phone\n\nMessage:\n$message";	
mail($to,$email_subject,$email_body);			
?>
Et là, c'est le drame. Ça n'envoie rien. Pourtant, j'ai bien été faire les manipulations dans le php.ini :

Code : Tout sélectionner

[mail function]
; For Win32 only.
; http://php.net/smtp
;SMTP = localhost
; 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/bin/ssmtp -t
Si quelqu'un a une idée ou a déjà été confronté au problème, je suis fort preneur. J'ai beau :google: dans tous les sens, je ne trouve pas...

Merci beaucoup pour votre aide !

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail()

Publié : mar. 22 sept. 2015, 19:34
par benjarobin
Bonjour,
As tu regardé les logs du serveur, cela aiderait je pense. Tu peux aussi essayer d'afficher les erreurs php au client, voir php.ini

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail()

Publié : mar. 22 sept. 2015, 19:53
par papajoke
Bonjour,
On configure ssmtp par utilisateur et pour php l'utilisateur doit être http(nginx)

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail()

Publié : mar. 22 sept. 2015, 20:15
par benjarobin
@papajoke Euh non... C'est toujours bien de vérifier vite fait avant :-(
https://wiki.archlinux.org/index.php/SSMTP

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail()

Publié : mar. 22 sept. 2015, 20:29
par papajoke
? pour moi
il fallait utiliser le fichier /etc/ssmtp/revaliases pour donner accès à un utilisateur particulier

Code : Tout sélectionner

root:p.test@serveur.fr:smtp.free.fr
papajoke:p.test@serveur.fr:smtp.free.fr
http:p.test@serveur.fr:smtp.free.fr

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail()

Publié : mar. 22 sept. 2015, 20:39
par benjarobin
Absolument pas... Cela permet juste de changer la valeur par défaut du From
A reverse alias gives the From: address placed on a user's outgoing messages and (optionally) the mailhub these messages will be sent through.
Edit: Après test, je confirme mes dires

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail()

Publié : mar. 22 sept. 2015, 20:43
par oktoberfest
Hello,

j'utilise ssmtp lors de mes sauvegardes nocturnes pour envoyer un compte-rendu d'exécution, ceci via un script shell lancé par un timer systemd. Et comme toi je me suis rendu compte que mes mails ne partaient pas alors qu'un essai en ligne de commande fonctionnait très bien.

La dernière ligne de mon script ressemble à ça :

Code : Tout sélectionner

journalctl --since today --unit=backup.service | mailx -s 'Backup' -r <email emetteur> <email destinataire>
Si à la suite de cette ligne de code j'ajoute une temporisation (j'ai mis un 'sleep 60') alors le mail part. Je n'ai pas cerné complètement le problème mais je pense que le souci est que mon script s'achève avant que ssmtp ait eu le temps d'envoyer le mail et ça pose problème.
Dans ton cas le souci peut être similaire : ton script php se termine après l'exécution de la commande mail. Essaye d'ajouter une petite pause (60 secondes est exagéré dans ton cas) pour voir si ça résoud ton problème.

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail()

Publié : mar. 22 sept. 2015, 21:04
par benjarobin
@oktoberfest Sans le verbose j'ai tout de suite la main, retour au prompt, tandis qu'avec le verbose il faut quelques secondes pour avoir le message "closing connection"
Et voilà trouvé :D :mrgreen: Rajoute l'option -Ssendwait Ce qui donne :

Code : Tout sélectionner

journalctl --since today --unit=backup.service | mailx -Ssendwait -s 'Backup' -r <email emetteur> <email destinataire>
Fin du HS

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail()

Publié : mar. 22 sept. 2015, 21:08
par papajoke
test sous nginx (localhost sur mon desktop) de la fonction php.mail()
false sans la ligne http:mon.email@serveur.fr:smtp.free.fr dans revaliases et email bien envoyé/reçu avec
ps: mail envoyé dans la seconde

Code : Tout sélectionner

$cat ssmtp.conf
#
# /etc/ssmtp.conf -- a config file for sSMTP sendmail.
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
#root=papajoke@archlinux.info
# The place where the mail goes. The actual machine name is required
# no MX records are consulted. Commonly mailhosts are named mail.domain.com
# The example will fit if you are in domain.com and you mailhub is so named.
#mailhub=mail.archlinux.info:587
# Where will the mail seem to come from?
#rewriteDomain= archlinux.info
# The full hostname
hostname=localhost

# Use SSL/TLS before starting negotiation
#UseTLS=Yes
#UseSTARTTLS=Yes

# Username/Password
#AuthUser=
#AuthPass=

# Email 'From header's can override the default domain?
FromLineOverride=yes

#-----------------------------#

root=MOI@free.fr
mailhub=smtp.free.fr
avec dans revaliases

Code : Tout sélectionner

root:MOI@serveur.fr:smtp.free.fr
patrick:MOI@serveur.fr:smtp.free.fr
http:MOI@serveur.fr:smtp.free.fr

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail()

Publié : mar. 22 sept. 2015, 21:17
par benjarobin
@papajoke Tu as peut être mit exprès (ou involontairement) les valeurs par défaut à des valeurs invalides
Peux tu donner le contenu de /etc/ssmtp/ssmtp.conf en modifiant bien sûr ton user et mot de passe.
Pour comprendre ce que tu as modifié, peux tu mettre en utilisateur abcdef, en email abcdef@servmail.fr, en mot de passe 123456, et le serveur mail smtp.servmail.fr

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail()

Publié : mar. 22 sept. 2015, 21:22
par oktoberfest
benjarobin a écrit : Et voilà trouvé :D :mrgreen: Rajoute l'option -Ssendwait Ce qui donne :

Code : Tout sélectionner

journalctl --since today --unit=backup.service | mailx -Ssendwait -s 'Backup' -r <email emetteur> <email destinataire>
Fin du HS
Cool je viens de modifier mon script (Le 'sleep', je trouvais ça vraiment moche). Je verrai demain matin si j'ai ou pas un mail dans ma boite aux lettres.

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail()

Publié : mar. 22 sept. 2015, 21:24
par Maltergate
J'ai vérifié dans mon mail.log : je n'ai absolument rien.

Le fichier contact_me.php est en root:root 755.

J'ai essayé avec un petit fichier php de test test_mail.php :

Code : Tout sélectionner

<?php
mail('monadresse@outlook.fr', 'Objet de test', 'Corps du message de test');
?>
Et ça fonctionne... Donc ça vient de mon coté, une page qui pointe pas.

Mais du coup je profite que le thread soit ouvert et je me pose la question du root:root et 755 :arrow: j'ai l'impression que c'est pas top.

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail()

Publié : mar. 22 sept. 2015, 21:29
par benjarobin
Je confirme, un fichier php devrait dans l'idéal être en : root:root 644

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail() - (Résolu)

Publié : mar. 22 sept. 2015, 21:38
par Maltergate
Super. Merci beaucoup :)

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail()

Publié : mar. 22 sept. 2015, 21:41
par papajoke
donné les codes des fichiers + haut.

en console(zsh pas php)
j'ai la même attitude, si je supprime la ligne : patrick:MOI@serveur.fr:smtp.free.fr
$ mail... ne fonctionne plus, erreur :
sendmail: 504 5.5.2 <patrick@localhost>: Sender address rejected: need fully-qualified address
par contre sudo mail... fonctionne bien

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail() - (Résolu)

Publié : mar. 22 sept. 2015, 22:09
par benjarobin
C'est normal que cela échoue, la valeur par défaut n'est pas la bonne... Remplace

Code : Tout sélectionner

hostname=localhost
par

Code : Tout sélectionner

hostname=MOI@serveur.fr
Après je ne dis pas que ta configuration est mauvaise, je dis juste que le fichier revaliases est optionnel si tout est correctement configuré

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail() - (Résolu)

Publié : mar. 22 sept. 2015, 22:14
par papajoke
merci
benjarobin a écrit :@papajoke Tu as peut être mit exprès (ou involontairement) les valeurs par défaut à des valeurs invalides
:bravo:

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail() - (Résolu)

Publié : mar. 22 sept. 2015, 22:31
par benjarobin
Pour la sécurité par contre, j'utilise ceci qui est bien plus sécurisant que ta technique :

Code : Tout sélectionner

chmod 640 /etc/ssmtp/ssmtp.conf
chown root:mail /etc/ssmtp/ssmtp.conf
Ce qui implique que seul les utilisateurs dans le groupe mail peuvent envoyer des emails, tous les autres utilisateurs ne peuvent pas voir le mot de passe

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail() - (Résolu)

Publié : mer. 23 sept. 2015, 13:12
par oktoberfest
Pour ma part, l'option sendwait marche très bien et fait exactement ce qu'il me manquait. Merci pour l'info benjarobin

Re: [SSMTP & PHP] - Envoi d'un mail via la fonction mail() - (Résolu)

Publié : mer. 23 sept. 2015, 13:39
par benjarobin
Je n'avais pas l'information, j'ai vraiment pris que 3 minutes pour trouver la réponse :-)