2009-09-22 5 views
4

J'essaie de comprendre pourquoi la fonction de courrier en PHP échoue lorsqu'il est appelé via un navigateur Web (Apache), mais je peux exécuter le même script à partir de la ligne de commande en utilisantPHP mail() fonctionne à partir de la ligne de commande, mais pas apache

php -f mailtest.php

Ceci est l'un de mes serveurs de clients Fedora, donc je ne Grok complètement, mais j'ai accès root dois-je besoin de changer quoi que ce soit.

de php.ini:

sendmail_path =/usr/sbin/sendmail -t -i

Je ne sais pas si cela pourrait la matière, mais/usr/sbin/sendmail est un lien symbolique à/etc/alternatives/mta, qui est un lien symbolique vers /usr/sbin/sendmail.sendmail. FWIW l'utilisateur apache est autorisé à exécuter sendmail (testé sendmail directement à partir de la ligne de commande).

OS: Fedora Core 7 Linux (kernel 2.6.23.17) 
Apache: 2.2.8 
PHP: 5.2.6 

Toute aide ici sera grandement appréciée!

+0

Vous pouvez publier ceci sur serverfault.com – Josh

Répondre

17

J'ai trouvé le problème. SELinux empêchait apache d'utiliser sendmail. Pour diagnostiquer, je

$ sestatus -b | grep sendmail 
httpd_can_sendmail     off 

ensuite de fixer réellement le problème:

$ restorecon /usr/sbin/sendmail 
$ setsebool -P httpd_can_sendmail 1 

En savoir plus sur ce here.

+0

Heureux que vous l'ayez compris. Vous devez accepter votre propre réponse - vous octroie un représentant, un badge et permet aux autres de savoir que la question est traitée. – Josh

+0

merci, vous m'a conduit dans la bonne direction: j'ai eu un problème similaire et après avoir lu votre message, j'ai eu l'idée qu'il pourrait avoir quelque chose à faire avec mon installation apparmor ... en effet, c'était le problème. – aurora

+1

Vous devez exécuter cette commande en tant que FYI root. – anataliocs

0

Quelque chose dans le journal des erreurs d'apache? PHP est-il exécuté en tant que module apache ou en tant que binaire CGI?

EDIT: Hmmm ... rien dans le journal des erreurs. Qu'est-ce que l'appel à mail(...) revient? Quelque chose d'intéressant dans le journal de messagerie? Cela varie en fonction du MTA, souvent/var/log/maillog

EDIT 2: est-safe_mode activé et que vous utilisez additional_parameters de la fonction mail()?

+0

rien dans le journal des erreurs. PHP est exécuté en tant que module apache. – matt

+0

J'ai également activé toutes les erreurs (c'est-à-dire error_reporting (E_ALL);) et n'y vois pas d'erreurs ou d'avertissements. – matt

0

Est-ce une erreur d'autorisation utilisateur? Votre compte et celui utilisé pour exécuter des scripts PHP peuvent avoir des privilèges différents.

+0

Tous les utilisateurs ont l'autorisation d'exécuter sendmail. J'ai confirmé en exécutant sendmail en tant qu'utilisateur apache. – matt

0

Ceci est ma première réponse ici sur StackOverflow! : o

J'ai donc eu le même problème que toi, matt! J'utilise OpenSuse. Je me suis dit que postfix check a donné lieu à

postfix/postfix-script: warning: not owned by group maildrop: /usr/sbin/postqueue 
postfix/postfix-script: warning: not owned by group maildrop: /usr/sbin/postdrop 
postfix/postfix-script: warning: not set-gid or not owner+group+world executable: /usr/sbin/postqueue 
postfix/postfix-script: warning: not set-gid or not owner+group+world executable: /usr/sbin/postdrop 

alors j'ai couru les commandes suivantes:

# my postfix user is postfix and postfix group is maildrop 
sudo chown 'postfix:maildrop' /usr/sbin/post{drop,queue} 
sudo chmod g+s /usr/sbin/post{queue,drop} 

puis, j'ai essayé de simple script PHP de mon navigateur pour tester si tout fonctionne bien: (en supposant vouloir envoyer un courriel [email protected])

<?php 
$ret = mail('[email protected]', 'subject', 'message'); 
if ($ret === true) 
    echo 'Success'.PHP_EOL; 
else 
    echo 'Error'.PHP_EOL; 

et c'est bien!J'espère que vous allez résoudre le problème avec cette méthode

Questions connexes