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.
è "sendmail" installato nella casella? –
come posso verificarlo? – Astha
"yum install sendmail' dovrebbe essere di aiuto, perché se non lo hai installato, è probabile che non ci sia nel sistema. –