it-swarm.com.de

PHP Mail-Funktion funktioniert nicht auf Centos-Server

Ich verwende den centos Server und muss die Mail an den Benutzer senden, sodass ich meinen laufenden Code von einem Server kopiert und hier verwendet habe, aber er sendet keine Mails.

Code lautet:

                $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";
                }

Es wird immer gedruckt. 1. Gleicher Code, der für andere Projekte ordnungsgemäß ausgeführt wird. Bitte führe mich, was ich tun kann, um es auch hier zu aktivieren? Jede Hilfe wird sehr geschätzt!

16
Astha

Nachdem Sie sendmail * installiert und die folgenden Befehle ausgeführt haben:

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

Ich hatte immer noch das gleiche Problem. Ich habe meinen /var/log/maillog überprüft und einen Fehler festgestellt:

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

Nach weiterer Suche änderte ich /etc/hosts von:

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

zu:

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

und jetzt funktioniert die Mail-Funktion einwandfrei.

24
Astha

Ich weiß, dass dies beantwortet wurde, aber ich hatte ein ähnliches Problem ... Falls jemand anderes ...

/ var/log/maillog zeigte mir ein Postfix-Berechtigungsproblem.

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

Fehler aufspüren Ich habe eine Lösung gefunden, die auf CentOS die SELinux-Richtlinie ist (ich verwende Version 6).

Schnelle Antwort: setsebool httpd_can_sendmail 1

Sie können -P verwenden, um die Änderung dauerhaft zu machen. Ich habe nur die E-Mail zum Zurücksetzen des Passworts benötigt, also nicht für meinen Fall.

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

EDIT: Ich hätte kommentiert, aber ich habe noch nicht genug Ruf.

6
preOtep

Ich hatte das gleiche Problem. Ich habe einen Entwicklungsserver zu Hause und einen Prod-Server im externen Serverhaus und eingehende E-Mails werden an andere Server weitergeleitet. PHP: s mail() funktioniert gut im Serverhaus, aber nicht zu Hause.

Ich habe ein bisschen getestet und habe es so gemacht, dass es zu Hause genauso funktioniert wie im Serverhaus. Der Unterschied zwischen den Methoden in Server House und Home ist die Konfiguration von sendmail. Serverhaus Ich musste nur sendmail installieren und es war in Ordnung, aber zu Hause musste ich auch sendmail-cf installieren und es verwenden, um die Adresse für ausgehende Mail-Server hinzuzufügen.

Angenommen, Sie haben Centos, Apache und PHP auf dem Heimserver, und Sie möchten E-Mails mit der mail () - Funktion von PHP senden.

1) Stellen Sie den Hostnamen auf dem Heimserver an zwei Stellen ein:/etc/sysconfig/network und/proc/sys/kernel/hostname auf diese Weise:

 # nano /etc/sysconfig/network
 NETWORKING = ja 
 HOSTNAME = meinedns157.dlinkddns.com 

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

2) Installiere sendmail und sendmail-cf:

 # yum install sendmail sendmail-cf 

3) Fügen Sie die folgende Zeile in /etc/mail/sendmail.mc ein, wo Sie den Postausgangsserver Ihres ISP haben:

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

4) Aktualisieren Sie sendmail.cf:

 # /etc/mail/make

5) Sendmail und Apache neu starten:

 # Dienst sendmail restart 
 # Dienst httpd Neustart 

6) Booten, um den Hostnamen zu aktualisieren:

 # Neustart 

Das ist es. Nun funktioniert folgendes:

 # php -r'mail ("[email protected]", "Betreff", "Körper", null, "[email protected]"); '

Sie können -f überspringen:

 # php -r'mail ("[email protected]", "Betreff", "Körper"); '

in diesem Fall wird der Name des Absenders automatisch zu user @ hostname, z. [email protected]


Einige Notizen zum Hostnamen

Die Auswahl des Hostnamens ist kritisch. Die Standardeinstellung in Centos6 ist localhost.localdomain, aber mail() funktioniert nicht damit, wenn Sie beim Aufruf von mail () Ihre eigene Absenderadresse (z. B. '[email protected]') überspringen. Wenn Sie sicher sind, dass Sie mail () immer unter Verwendung Ihrer realen Adresse als Absenderadresse anrufen, kann der Hostname beliebig sein. Wenn Sie jedoch bereits E-Mail-Anrufe () haben, fehlt die Absenderadresse (ich habe Hunderte davon wie Anrufe zu Testzwecken), müssen Sie eine echte Domäne als Hostnamen haben, da in diesen Fällen der Hostname Ihres Servers als Absender-Adress-Domäne verwendet wird. Wirklich in dem Sinne, dass die Domäne mindestens über einen DNS-A-Eintrag verfügen muss (aus irgendeinem Grund erfordert mein ISP keinen NS-Eintrag für die Absenderadresse, sondern nur einen A-Eintrag, aber testen und prüfen Sie mit Ihrem ISP). Der Nachteil bei der Verwendung einer Nicht-E-Mail-Domäne als Absenderadresse besteht darin, dass Antworten und Zustellungsbenachrichtigungen in den Himmel kommen, aber wenn Sie die Absenderadresse in Ihrem Code ablegen, bedeutet dies normalerweise, dass Sie etwas testen und debuggen und keine Antwort benötigen Funktionalität. Die Domain kann zB sein. Die, die Sie von dynamischen DNS-Server erhalten, z. mydns157.dlinkddns.com, der auf Ihren Heimrouter verweisen kann (muss aber nicht). Sie können den DNS-Eintrag in PHP mit dns_get_record("mydns157.dlinkddns.com") abrufen, wobei ein Array wie folgt zurückgegeben wird:

 [Host] => mydns157.dlinkddns.com 
 [Typ] => A 
 [ip] => 92.152.214.137 
 [Klasse] => IN 
 [ttl] => 7 

Wenn type im obigen DNS-Datensatz NS ist, fungiert die Domäne als E-Mail-Domäne, was für den Hostnamen des eigenen Servers in Ordnung ist. Der Effekt ist jedoch etwas anders. Wenn Sie als Hostname eine vorhandene E-Mail-Domäne festlegen, z. myexistingemaildomain.com, und senden Sie eine Nachricht an [email protected], z. B. zu Debugging-Zwecken, denkt sendmail, dass die Nachricht an den E-Mail-Ordner des Benutzers me auf diesem Server zugestellt werden muss. Wenn me user nicht vorhanden ist, schlägt das Senden fehl, und wenn der Benutzer vorhanden ist, geht die Nachricht an /var/mail/me. Dies kann das sein, was Sie möchten, aber (wie ich) möchten Sie vielleicht, dass alle Nachrichten außerhalb von Serverordnern zugestellt werden.

Ihr Hostname (im DNS-Eintrag) muss nicht auf die tatsächliche externe IP-Adresse Ihres Servers verweisen, damit mail () in Fällen mit fehlender Absenderadresse funktioniert, es besteht jedoch kein Schaden. Die Hauptsache ist, dass der Hostname über einen gültigen A-Datensatz verfügt und die Domäne Ihnen gehört. Wenn die Domäne nicht Ihnen gehört, kann eine Sicherheitslücke entstehen. Wenn Sie als Hostnamen eine vorhandene E-Mail-Domäne angeben, z. Microsoft.com (aus welchem ​​Grund auch immer) und senden Sie eine Nachricht an jemanden, ohne beim Absenden von mail () Ihre eigene Absenderadresse hinzuzufügen (z. B. '[email protected]'). Die Absenderadresse wird automatisch [email protected] angezeigt. Wenn Sie als Root angemeldet sind, lautet die Absenderadresse [email protected]. Antworten und Benachrichtigungen über fehlgeschlagene Lieferungen gehen dann an [email protected] und dies ist möglicherweise nicht Ihre Absicht.

6
Timo Kähkönen

Ich würde empfehlen, SwiftMailer zu verwenden.

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

möge das dir helfen

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

Ich hatte gerade diese Ausgabe, zwei Dinge.

Meine E-Mails würden Spam erzeugen, das sollten Sie auf jeden Fall überprüfen. Wahrscheinlich, weil mein Server keine richtigen PTR- und SPF-Einträge hatte.

Ich habe es auch viel einfacher gefunden, sendmail damit zu testen:

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

Überprüfen Sie Ihr Mail-Protokoll immer in/var/log/maillog, um die Ursache des Problems zu ermitteln. Ich hatte einmal ein ähnliches Problem, nachdem ich Postfix richtig konfiguriert hatte. Ich habe eine Fehlermeldung erhalten, die fatal: setrlimit: Permission denied sagt. Umgehung ist die Überprüfung, ob der httpd-Server Mail senden darf oder nicht, mit dem Befehl getsebool httpd_can_sendmail. Wenn httpd Mail senden deaktiviert ist, aktivieren Sie es mit dem Befehl: setsebool -P httpd_can_sendmail 1. Hoffe das hilft.

0
Ratul Doley