2011-12-01 12 views
15

Sto utilizzando CentOS Server e devo inviare la posta all'utente, così ho copiato il mio codice in esecuzione da un server e l'ho usato qui, ma non sta inviando mail.La funzione di posta PHP non funziona sul server Centos

Codice è:

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

E 'sempre stampare 1. Lo stesso codice di bene in esecuzione su altri progetti. Per favore guidami cosa posso fare per abilitarlo anche qui? Qualsiasi aiuto sarà molto apprezzato!

+2

è "sendmail" installato nella casella? –

+0

come posso verificarlo? – Astha

+3

"yum install sendmail' dovrebbe essere di aiuto, perché se non lo hai installato, è probabile che non ci sia nel sistema. –

risposta

22

Dopo l'installazione di sendmail * e eseguendo i seguenti comandi:

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

ho ancora avuto lo stesso problema. Ho controllato il mio /var/log/maillog e ho visto un errore:

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

Dopo più ricerca, ho cambiato /etc/hosts da:

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

a:

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

e ora la funzione mail è ora lavorando bene .

+4

potrebbe essere /etc/dovecot/dovecot.conf? – emc

+2

postfix esegue questa operazione dalla casella – holms

+0

Ho usato queste istruzioni per configurare sendmail per CentOS in un contenitore Docker. Ho comunque dovuto solo fare yum install sendmail per usare mail(). La configurazione del file hosts come sopra si è rivelata fondamentale per fare in modo che la funzione di posta invii email in modo tempestivo. Grazie! –

2

Suggerirei di usare SwiftMailer semplicemente per questo.

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

ha funzionato tutto il giorno sulla posta ma gli errori non sono mai andati via, questo ha risolto il problema in 30 minuti! –

6

Ho avuto lo stesso problema. Ho un server di sviluppo a casa e un server di produzione su server esterno e le e-mail in arrivo vanno su un altro server. PHP: s mail() funziona bene in server house, ma non a casa.

Ho provato un po 'e ho funzionato a casa nello stesso modo in server house. La differenza tra i metodi in server house e home è la configurazione di sendmail. Server house Avevo solo da installare sendmail e andava bene, ma a casa dovevo installare anche sendmail-cf e usarlo per aggiungere l'indirizzo del server di posta in uscita.

Supponiamo di avere Centos, Apache e PHP sul server di casa e si desidera inviare e-mail utilizzando la funzione PHP: s mail().

1) Impostare hostname sul server di casa in due luoghi:/etc/sysconfig/network e/proc/sys/kernel/hostname in questo modo:

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

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

2) Installare sendmail e sendmail-cf:

 
# yum install sendmail sendmail-cf 

3) Aggiungere la seguente riga in /etc/mail/sendmail.mc, dove avete il vostro ISP: s in uscita server di posta:

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

4) Aggiorna sendmail.CF:

 
# /etc/mail/make 

5) Riavvia sendmail e Apache:

 
# service sendmail restart 
# service httpd restart 

6) Avvio di aggiornare hostname:

 
# reboot 

Questo è tutto. Ora le seguenti opere:

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

è possibile saltare -f:

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

in questo caso il nome del mittente diventano automaticamente user @ hostname, ad es. [email protected]


Alcune note di hostname

L'offerta di hostname è critica. L'impostazione predefinita in Centos6 è localhost.localdomain, ma mail() non funziona con esso se si salta il proprio indirizzo del mittente (ad esempio '[email protected]') quando si chiama mail(). Se sei sicuro che chiami sempre mail() usando il tuo indirizzo reale come indirizzo del mittente, il nome host può essere qualunque, ma se hai chiamate esistenti a mail() che non ha l'indirizzo del mittente (ho centinaia di chiamate simili per scopi di test), quindi è necessario disporre di un dominio reale come nome host, in quanto in questi casi il nome host del server viene utilizzato come dominio indirizzo-mittente. Reale, nel senso che il dominio deve avere almeno il record A DNS (per qualche ragione il mio ISP non richiede NS-record per l'indirizzo del mittente, solo A-record, ma prova e controlla con il tuo ISP). Lo svantaggio di utilizzare il dominio non-email come indirizzo del mittente è che le risposte e le notifiche di consegna andranno a meraviglia, ma se si rilascia l'indirizzo del mittente nel codice, di solito significa testare e eseguire il debug di qualcosa e non è necessario rispondere funzionalità. Il dominio può essere eg. quello che si ottiene dal server DNS dinamico es. mydns157.dlinkddns.com, che può puntare al router di casa (ma non necessario). È possibile ottenere record DNS in PHP utilizzando dns_get_record("mydns157.dlinkddns.com"), che restituisce un array come questo:

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

Se type sopra DNS-record è NS, poi gli atti di dominio come un dominio di posta elettronica, che è OK per nome host del proprio server, ma l'effetto è leggermente diverso. Se si imposta come hostname un dominio di posta elettronica es. myexistingemaildomain.com, e inviare un messaggio a [email protected] ad esempio per scopi di debug, sendmail pensa che il messaggio deve essere consegnato alla cartella di posta dell'utente me su questo server. Se l'utente me non esiste, l'invio non riesce e se l'utente esiste, il messaggio passa a /var/mail/me. Questo può essere quello che vuoi, ma (come me) potresti volere che tutti i messaggi vengano consegnati al posto delle cartelle del server.

Il nome host (nel record DNS) non deve puntare al reale IP esterno del server per far sì che mail() funzioni in casi di mancata corrispondenza dell'indirizzo, ma non c'è nulla di male. La cosa principale è che il nome host ha un record A valido e che il dominio appartiene a te. Se il dominio non ti appartiene, allora potrebbe nascere un buco di sicurezza. Se imposti come hostname alcuni domini di posta elettronica es. microsoft.com (per qualsiasi motivo) e inviare un messaggio a qualcuno senza aggiungere il proprio indirizzo mittente quando si chiama mail() (ad esempio '[email protected]'), l'indirizzo del mittente sarà automaticamente [email protected]. Se sei registrato come root, l'indirizzo del mittente sarà [email protected]. Le risposte e le notifiche delle consegne non riuscite vanno quindi a [email protected] e questa potrebbe non essere la tua intenzione.

+0

da 'servizio sendmail restart' im ottenere un errore' Avvio di sendmail: 554 5.0.0 Nessun mailer locale definito 554 5.0.0 Opzione QueueDirectory (Q) deve essere impostata ' –

6

So che è stata data una risposta, ma ho avuto un problema simile. Nel caso di qualcun altro ....

/var/log/maillog mi ha mostrato un problema di autorizzazione Postfix.

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

Errore di tracciamento Ho trovato la soluzione come criterio SELinux su CentOS (sto usando la versione 6).

risposta rapida: setsebool httpd_can_sendmail 1

È possibile utilizzare -P per rendere permanente la modifica; Avevo solo bisogno di un'e-mail per la reimpostazione della password, quindi non era necessaria per il mio caso.

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

EDIT: avrei commentato, ma non ho abbastanza reputazione ancora.

+0

im get' setsebool: SELinux è disabilitato' –

2

Ho appena avuto questo problema, due cose.

Le mie e-mail stavano andando a spam, sicuramente controllare che. Probabilmente perché il mio server non aveva i record PTR e SPF corretti.

Ma anche, l'ho trovato molto più facile per testare sendmail con questo:

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

controllare sempre il maillog in/var/log/maillog di conoscere la causa del problema. Ho avuto un problema simile una volta dopo aver configurato correttamente postfix. Ho ricevuto un errore dicendo fatal: setrlimit: Permission denied. La soluzione alternativa è verificare se httpd può inviare la posta è abilitata o meno dal comando getsebool httpd_can_sendmail. Se httpd può inviare la posta è disattivata, abilitarlo tramite il comando: setsebool -P httpd_can_sendmail 1. Spero che questo ti aiuti.

Problemi correlati