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.
czy "sendmail" jest zainstalowany na pudełku? –
jak mogę to sprawdzić? – Astha
'yum install sendmail' powinien usunąć pomoc, ponieważ jeśli go nie zainstalowałeś, prawdopodobnie nie ma jej w systemie. –