2011-12-01 20 views
15

Używam serwera Centos i muszę wysłać wiadomość do użytkownika, więc skopiowałem uruchomiony kod z jednego serwera i użyłem go tutaj, ale to nie wysyła wiadomości.Funkcja poczty PHP nie działa na serwerze Centos

Code jest:

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

Zawsze druku 1. Ten sam kod działa prawidłowo na inny projekt. Proszę wskazać mi, co mogę zrobić, aby włączyć to tutaj? Każda pomoc będzie bardzo ceniona!

+2

czy "sendmail" jest zainstalowany na pudełku? –

+0

jak mogę to sprawdzić? – Astha

+3

'yum install sendmail' powinien usunąć pomoc, ponieważ jeśli go nie zainstalowałeś, prawdopodobnie nie ma jej w systemie. –

Odpowiedz

22

Po zainstalowaniu sendmaila * i uruchamiając następujące polecenia:

[[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 

wciąż miał ten sam problem. Sprawdziłem mój /var/log/maillog i nastąpił błąd:

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

Po dalszych poszukiwaniach, zmieniłem /etc/hosts od:

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

do:

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

a teraz funkcja mail jest teraz działa poprawnie .

+4

może być /etc/dovecot/dovecot.conf? – emc

+2

Postfix robi to po wyjęciu z pudełka – holms

+0

Użyłem tych instrukcji, aby skonfigurować sendmail dla CentOS w kontenerze Docker. Musiałem jednak tylko wykonać yum install sendmail, aby użyć mail(). Konfiguracja pliku hostów, jak wyżej, okazała się krytyczna, aby funkcja pocztowa wysyłała wiadomości e-mail w odpowiednim czasie. Dziękuję Ci! –

2

Polecam korzystanie z SwiftMailer po prostu bardzo dużo.

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); 
} 
+0

pracował na mail przez cały dzień, ale błędy nigdy nie zniknęły, to naprawił mój problem w 30 minut! –

6

Miałem ten sam problem. Mam serwer programistyczny w domu i serwer prod w zewnętrznej serwerowni, a przychodzące wiadomości trafiają na inny serwer. PHP: s mail() działa ładnie w domu serwera, ale nie w domu.

Przetestowałem trochę i dostałem go do pracy w domu w taki sam sposób jak w domu na serwerze. Różnica między metodami w domu serwera i domu to konfiguracja sendmaila. Dom serwera Musiałem tylko zainstalować sendmaila i było dobrze, ale w domu musiałem zainstalować również sendmail-cf i użyć go do dodania adresu serwera poczty wychodzącej.

Załóżmy, że masz Centos, Apache i PHP na serwerze macierzystym i chcesz wysyłać wiadomości e-mail za pomocą funkcji PHP: s mail().

1) Ustaw hosta na serwerze domowym w dwóch miejscach:/etc/sysconfig/network i/proc/sys/kernel/hostname w ten sposób:

 
# nano /etc/sysconfig/network 
    NETWORKING=yes 
    HOSTNAME=mydns157.dlinkddns.com 

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

2) Instalowanie sendmail i sendmail-cf:

 
# yum install sendmail sendmail-cf 

3) Dodaj następujący wiersz do /etc/mail/sendmail.mc, gdzie masz swój ISP: s serwer poczty wychodzącej:

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

4) Zaktualizuj sendmail.CF:

 
# /etc/mail/make 

5) Restart sendmail i apache:

 
# service sendmail restart 
# service httpd restart 

6) Boot zaktualizować nazwę hosta:

 
# reboot 

To wszystko. Teraz następujące prace:

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

Można pominąć -f:

 
# php -r'mail("[email protected]", "Subject", "Body");' 

w takim przypadku nazwa nadawcy stają się automatycznie użytkownik @ nazwa hosta, np. [email protected]


Niektóre nuty hosta

Wybór hosta jest krytyczna. Wartością domyślną w Centos6 jest localhost.localdomain, ale mail() nie działa z nim, jeśli podczas wywoływania poczty() pomijany jest własny adres nadawcy (np. '[email protected]'). Jeśli jesteś pewien, że zawsze nazywasz mail() używając swojego prawdziwego adresu jako adresu nadawcy, nazwa hosta może być czymkolwiek, ale jeśli masz już połączenia z pocztą(), które nie mają adresu nadawcy (mam setki takich jak połączenia dla w celach testowych), musisz mieć prawdziwą domenę jako nazwę hosta, ponieważ nazwa hosta twojego serwera jest używana w tych przypadkach jako domena-adres-nadawcy. Rzeczywiste w tym sensie, że domena musi mieć co najmniej rekord A DNS (z jakiegoś powodu mój ISP nie wymaga rekordu NS dla adresu nadawcy, tylko rekord A, ale testuj i sprawdź u swojego usługodawcy internetowego). Wadą używania domeny innej niż e-mail jako adresu nadawcy jest to, że odpowiedzi i powiadomienia o dostarczeniu trafią do nieba, ale jeśli zrzucisz adres nadawcy w swoim kodzie, zwykle oznacza to, że testujesz i debugujesz coś i nie potrzebujesz odpowiedzi funkcjonalność. Domeną może być np. ten, który otrzymujesz z serwera dynamicznego dns, np. mydns157.dlinkddns.com, który wskazuje domowy router (ale nie musi). Można uzyskać rekord DNS w PHP przy użyciu dns_get_record("mydns157.dlinkddns.com"), która zwraca tablicę takiego:

 
[host] => mydns157.dlinkddns.com 
[type] => A 
[ip] => 92.152.214.137 
[class] => IN 
[ttl] => 7 

Jeśli type podano DNS-płyta jest NS, to akty domeny jako domeny e-mail, który jest ok dla hosta własny serwer, ale efekt jest trochę inny. Jeśli ustawisz jako nazwę hosta istniejącą domenę e-mail, np. myexistingemaildomain.com, i wysłać wiadomość do [email protected] np. Do celów debugowania, sendmail myśli, że wiadomość musi być dostarczona do folderu pocztowego użytkownika me na tym serwerze. Jeśli użytkownik nie istnieje, wysyłanie kończy się niepowodzeniem, a jeśli istnieje, wiadomość przechodzi do /var/mail/me. Może to być to, czego chcesz, ale (jak ja) możesz chcieć, aby wszystkie wiadomości były dostarczane poza folderami serwera.

Twoja nazwa hosta (w rekordzie DNS) nie musi wskazywać zewnętrznego adresu IP twojego serwera, aby poczta() działała w przypadkach braku adresu nadawcy, ale nie zaszkodzi. Najważniejsze, że nazwa hosta ma poprawny rekord A i że domena należy do Ciebie. Jeśli domena nie należy do Ciebie, może pojawić się luka w zabezpieczeniach. Jeśli ustawisz jako nazwę hosta istniejącą domenę e-mail, np. microsoft.com (z dowolnego powodu) i wysłać wiadomość do kogoś bez dodawania własnego adresu nadawcy podczas wywoływania poczty() (np. '[email protected]'), adres nadawcy będzie automatycznie [email protected]. Jeśli jesteś zalogowany jako root, adres nadawcy będzie [email protected]. Odpowiedzi i powiadomienia o nieudanych dostawach idą następnie pod numer [email protected], a to może nie być Twoja intencja.

+0

z 'service sendmail restart' im błąd' Starting sendmail: 554 5.0.0 Nie zdefiniowano lokalnego programu pocztowego 554 5.0.0 Opcja QueueDirectory (Q) musi być ustawiona ' –

6

Wiem, że odpowiedź została udzielona, ​​ale miałem podobny problem. W przypadku ktokolwiek inny ....

/var/log/maillog pokazał mi problem z Postfix.

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

Błąd śledzenia Stwierdziłem, że rozwiązaniem jest polityka SELinux w CentOS (używam wersji 6).

Szybka odpowiedź: setsebool httpd_can_sendmail 1

Można użyć -P, aby zmiana na stałe; Potrzebowałem tylko e-maila służącego do resetowania hasła, więc nie było to konieczne w mojej sprawie.

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

EDIT: Ja bym skomentował, ale nie mam jeszcze wystarczającej reputacji.

+0

im' setsebool: SELinux jest wyłączony' –

2

Właśnie miałem ten problem, dwie rzeczy.

Moje e-maile będą spamować, zdecydowanie sprawdź to. Prawdopodobnie dlatego, że mój serwer nie miał odpowiednich rekordów PTR i SPF.

Ale również uważam, że to o wiele łatwiejsze do testowania sendmail z tym:

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

Zawsze sprawdzić maillog w katalogu/var/log/maillog poznać przyczynę problemu. Miałem podobny problem jeden raz po właściwym skonfigurowaniu Postfiksa. Wystąpił błąd informujący o fatal: setrlimit: Permission denied. Obejście problemu polega na sprawdzeniu, czy serwer httpd może wysyłać pocztę za pomocą komendy getsebool httpd_can_sendmail. Jeśli httpd może wysyłać pocztę jest wyłączone, włącz ją komendą: setsebool -P httpd_can_sendmail 1. Mam nadzieję że to pomoże.

Powiązane problemy