web-dev-qa-db-fra.com

PHP la fonction mail ne fonctionne pas sur le serveur Centos

J'utilise centos Server et dois envoyer le courrier à l'utilisateur. J'ai donc copié le code en cours d'exécution à partir d'un serveur et je l'ai utilisé ici, mais il n'envoie pas de courrier.

Le code est:

                $to = $email; //writing mail to the user
                $subject = "Hii";
                $message = "<table>
                <tr><td> Hello ".$email.",</td></tr>
                <tr><td> Some Text </td></tr>
                <tr><td> Some Text </td></tr>
                <tr><td> Some Text </td></tr>
                <tr><td> Some Text </td></tr>
                </table>" ;
                $from = "[email protected]";
                // To send HTML mail, the Content-type header must be set
                    $headers  = 'MIME-Version: 1.0' . "\r\n";
                    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
                // Additional headers
                $headers .= 'From: Team <[email protected]>' . "\r\n";

                if(mail($to,$subject,$message,$headers))
                {
                    echo "0";// mail sent Successfully.
                }
                else
                {
                    echo "1";
                }

Il imprime toujours 1. Le même code fonctionne correctement sur un autre projet. S'il vous plaît, guidez-moi sur ce que je peux faire pour l'activer ici aussi? .__ Toute aide sera très appréciée!

16
Astha

Après avoir installé sendmail * et lancé les commandes suivantes:

[root@sendmail ~]# yum install sendmail*
[root@sendmail mail]# yum install dovecot
[root@sendmail mail]# cd /etc/mail/
[root@sendmail mail]# vi local-Host-names
# local-Host-names - include all aliases for your machine here.
example.com
[root@sendmail mail]# vi /etc/dovecot.conf
protocols = imap pop3 //uncomment
[root@sendmail mail]# m4 sendmail.mc > sendmail.cf
[root@sendmail mail]# make
[root@sendmail mail]# /etc/init.d/sendmail start
[root@sendmail mail]# /etc/init.d/saslauthd start
[root@sendmail mail]# /etc/init.d/dovecot start
[root@sendmail mail]# chkconfig sendmail on
[root@sendmail mail]# chkconfig dovecot on
[root@sendmail mail]# chkconfig saslauthd on

J'ai toujours eu le même problème. J'ai vérifié mon /var/log/maillog et j'ai vu une erreur:

My unqualified Host name (domain) unknown; sleeping for retry

Après plus de recherches, j'ai changé /etc/hosts de:

127.0.0.1     localhost localhost.localdomain domain
ip.ip.ip.ip  domain localhost 

à:

 127.0.0.1   localhost.localdomain localhost domain
 ip.ip.ip.ip  localhost domain  

et maintenant la fonction mail fonctionne bien.

24
Astha

Je sais que cette question a été résolue, mais j’ai eu un problème similaire… .. Au cas où quelqu'un d’autre ....

/ var/log/maillog m'a montré un problème d'autorisation Postfix.

sendmail: fatal: chdir /var/spool/postfix: Permission denied

J'ai trouvé que la solution était la politique SELinux sur CentOS (j'utilise la version 6).

Réponse rapide: setsebool httpd_can_sendmail 1

Vous pouvez utiliser -P pour rendre le changement permanent. J'avais juste besoin d'un e-mail de réinitialisation de mot de passe, donc inutile pour mon cas.

Crédit: http://www.spidersoft.com.au/2011/posftix-permission-denied-problem/?ModPagespeed=noscript

EDIT: J'aurais commenté mais je n'ai pas encore assez de réputation.

6
preOtep

J'ai eu le même problème. J'ai un serveur de développement à la maison et un serveur de production chez un serveur externe et les mails entrants sont envoyés à un autre serveur. PHP: s mail() fonctionne bien dans la maison du serveur, mais pas à la maison.

J'ai testé un peu et l'ai fait fonctionner à la maison de la même manière que dans la maison du serveur. La différence entre les méthodes serveur maison et maison réside dans la configuration de sendmail. Serveur maison, je n’avais qu’à installer sendmail et c’était bien, mais chez moi, j’ai dû installer aussi sendmail-cf et l’utiliser pour ajouter l’adresse du serveur de courrier sortant.

Supposons que vous ayez Centos, Apache et PHP sur le serveur domestique et que vous souhaitez envoyer des courriels à l'aide de la fonction PHP: s mail ().

1) Définissez le nom d’hôte sur le serveur domestique à deux endroits:/etc/sysconfig/network et/proc/sys/kernel/nomhôte de la manière suivante:

 # nano /etc/sysconfig/network
 RÉSEAU = oui 
 HOSTNAME = mydns157.dlinkddns.com 

 # nano /proc/sys/kernel/hostname
 HOSTNAME = mydns157.dlinkddns.com 

2) Installez sendmail et sendmail-cf:

 # miam installer sendmail sendmail-cf 

3) Ajoutez la ligne suivante dans /etc/mail/sendmail.mc, où vous avez le serveur de courrier sortant de votre fournisseur de services Internet:

 define ('SMART_Host', "mail.myisp.com") dnl 

4) Mettez à jour sendmail.cf:

 # /etc/mail/make

5) Redémarrez sendmail et Apache:

 # service sendmail restart 
 # service httpd restart 

6) Boot pour mettre à jour le nom d'hôte:

 # redémarrer 

C'est tout. Maintenant les travaux suivants:

 # php -r'mail ("[email protected]", "Sujet", "Corps", null, "[email protected]"); '

Vous pouvez sauter -f:

 # php -r'mail ("[email protected]", "Sujet", "Corps"); '

auquel cas le nom de l'expéditeur devient automatiquement utilisateur @ nom d'hôte, par exemple. [email protected].


Quelques notes de nom d'hôte

La sélection du nom d'hôte est critique. La valeur par défaut dans Centos6 est localhost.localdomain, mais mail() ne fonctionne pas si vous ignorez votre propre adresse d'expéditeur (par exemple, '[email protected]') lorsque vous appelez mail (). Si vous êtes sûr de toujours appeler mail () en utilisant votre adresse réelle en tant qu’adresse d’expéditeur, le nom d’hôte peut être quelconque, mais si vous avez déjà des appels à mail () sans adresse d’expéditeur (j’en ai des centaines comme des appels à à des fins de test), vous devez alors avoir un domaine réel en tant que nom d’hôte, car le nom d’hôte de votre serveur est utilisé comme domaine de l’adresse de l’expéditeur dans ce cas. Réel en ce sens que le domaine doit avoir au moins un enregistrement DNS A (pour une raison quelconque, mon fournisseur d'accès ne requiert pas d'enregistrement NS pour l'adresse de l'expéditeur, mais uniquement un enregistrement, mais teste et vérifie auprès de votre fournisseur d'accès). L'inconvénient d'utiliser non-email-domain comme adresse d'expéditeur est que les notifications de réplication et de livraison iront au paradis, mais si vous supprimez l'adresse de l'expéditeur dans votre code, cela signifie généralement que vous testez et déboguez quelque chose sans réponse. fonctionnalité. Le domaine peut être par exemple. celui que vous obtenez du serveur DNS dynamique, par exemple. mydns157.dlinkddns.com, qui peut pointer vers votre routeur domestique (mais pas obligatoirement). Vous pouvez obtenir un enregistrement DNS dans PHP en utilisant dns_get_record("mydns157.dlinkddns.com"), qui renvoie un tableau comme celui-ci:

 [Hôte] => mydns157.dlinkddns.com 
 [type] => A 
 [ip] => 92.152.214.137 
 [classe] => IN 
 [ttl] => 7 

Si type dans l'enregistrement DNS ci-dessus est NS, alors le domaine agit comme un domaine de messagerie, ce qui est OK pour le nom d'hôte de son propre serveur, mais l'effet est légèrement différent. Si vous définissez comme nom d’hôte un domaine de messagerie existant, par exemple. myexistingemaildomain.com et envoyez un message à [email protected] Par exemple, à des fins de débogage, sendmail pense que le message doit être remis au dossier mail de l'utilisateur me sur ce serveur. Si l'utilisateur me n'existe pas, l'envoi échoue et s'il existe, le message passe à /var/mail/me. Cela peut être ce que vous voulez, mais (comme moi) vous voudrez peut-être que tous les messages soient remis à l'extérieur au lieu des dossiers du serveur.

Votre nom d’hôte (dans l’enregistrement DNS) n’a pas besoin de pointer sur l’adresse IP externe réelle de votre serveur pour que mail () fonctionne dans les cas de manque d’adresse de l’expéditeur, mais cela ne présente aucun danger. L'essentiel est que le nom d'hôte possède un enregistrement A valide et que le domaine vous appartient. Si le domaine ne vous appartient pas, vous risquez de créer une faille de sécurité. Si vous définissez comme nom d’hôte un domaine de messagerie existant, par exemple. Microsoft.com (quelle que soit la raison) et envoyez un message à quelqu'un sans ajouter votre propre adresse d'expéditeur lorsque vous appelez mail () (par exemple, '[email protected]'), l'adresse de l'expéditeur sera automatiquement [email protected]. Si vous êtes connecté en tant que root, l'adresse de l'expéditeur sera [email protected]. Les répliques et les notifications d'échec des livraisons vont alors à [email protected] et ce n'est peut-être pas votre intention.

6
Timo Kähkönen

Je recommanderais d'utiliser SwiftMailer pour simplement beaucoup de cela.

require_once('../lib/swiftMailer/lib/Swift_required.php');
function sendEmail(){
  //Sendmail
  $transport = Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs');

  //Create the Mailer using your created Transport
  $mailer = Swift_Mailer::newInstance($transport);

  $body="Dear $fname,\n\nYour job application was successful. \n\nYours,\n\nEamorr\n\n\n\n\n\n\n";


  //Create a message
  $message = Swift_Message::newInstance('Subject goes here')
    ->setFrom(array($email => "[email protected]"))
    ->setTo(array($email => "$fname $lname"))
    ->setBody($body);

  //Send the message
  $result = $mailer->send($message);
}
2
Eamorr

que cela vous aide

ini_set('sendmail_from', '[email protected]'); 
2
Sonal Khunt

Je viens d'avoir ce problème, deux choses.

Mes courriels allaient faire du spam, vérifiez bien cela. Probablement parce que mon serveur ne possédait pas les enregistrements PTR et SPF appropriés.

Mais aussi, j'ai trouvé beaucoup plus facile de tester sendmail avec ceci:

sendmail -s '[email protected]'
Subject:Testing!
hey there, how ya doin?
CTRL+D
2
Phil LaNasa

Vérifiez toujours votre maillog dans/var/log/maillog pour connaître la cause du problème ... J'ai eu un problème similaire une fois après avoir correctement configuré postfix. J'ai une erreur en disant fatal: setrlimit: Permission denied. La solution de rechange est de vérifier si le httpd peut envoyer un courrier est activé ou non par la commande getsebool httpd_can_sendmail. Si httpd peut envoyer le courrier est désactivé, activez-le avec la commande: setsebool -P httpd_can_sendmail 1. J'espère que cela t'aides.

0
Ratul Doley