php mail () działa boleśnie wolno na lokalnej maszynie programistycznej

21

Tło: Jeśli skonfigurowałeś lokalny serwer Apache do celów programistycznych, możesz mieć problem z tym, że sendmail zajmuje dużo czasu (co najmniej minutę) na wysyłanie wiadomości e-mail. Jest to bardzo frustrujące, jeśli próbujesz debugować problem z wygenerowanym e-mailem.

W Internecie znajduje się kilka postów na forum, które omawiają ten problem. Jednak żaden z tematów nie opisał, co robić wystarczająco szczegółowo, aby uzyskać moją ograniczoną wiedzę. Oto kroki, które działały dla mnie:

1) znajdź swoją nazwę hosta (na wypadek, gdybyś zapomniał) za pomocą tego polecenia:

:~$ cat /hosts/hostname

myhostname

2) edytuj plik /etc/hostsi upewnij się, że pierwszy wiersz jest następujący:

127.0.0.1 localhost.localdomain localhost myhostname

3) edytuj plik konfiguracyjny sendmaila ( /etc/mail/sendmail.cfw Ubuntu) i odkomentuj linię#O HostsFile=/etc/hosts

4) Uruchom ponownie komputer. Komputer powinien teraz uruchomić się znacznie szybciej, a funkcja mail () powinna powrócić prawie natychmiast. JEDNAK e-maile nie zostaną wysłane, chyba że wykonasz krok 5.

5) Musisz użyć opcji sendmail „-f” za każdym razem, gdy korzystasz z funkcji mail. Na przykład:

mail('[email protected]', 'the subject', 'the message', null, '[email protected]');

Moje pytanie do moich innych administratorów serwerów brzmi:

Jakie dalsze zmiany można wprowadzić, aby nie musiałem używać opcji sendmail -f? Chociaż dodanie opcji -f nie jest trudne, jest problem, gdy Twój CMS (taki jak Drupal) nie używa opcji -f podczas wysyłania poczty. Aby dodać tę opcję, musisz zhakować moduł podstawowy.

Michael B.
źródło
1
w moim systemie Ubuntu polecenie brzmicat /etc/hostname
zkent

Odpowiedzi:

6

Wiem, że nie o to pytasz, ale dlaczego nie wypróbujesz Postfixa lub Exima? Oba są dostępne dla Ubuntu (Postfix jest nawet domyślnym MTA w systemach Ubuntu) i oba zapewniają kompatybilne polecenie „sendmail”, które działa bardzo dobrze. IMHO sendmail jest w pewnym sensie datą i zyskasz większe szanse na wsparcie dzięki bardziej nowoczesnemu MTA.

rdzeń rdzeniowy
źródło
Nawet jeśli istnieją lepsze systemy pocztowe niż sendmail, problemem jest utrzymanie serwera programistycznego, który odzwierciedla serwer produkcyjny. sendmail jest domyślnym agentem pocztowym dla php.
Michael B
1
Masz na myśli sendmail oprogramowanie lub sendmail binarny? Ponieważ Exim i Postfix mają również pliki sendmailbinarne, które akceptują te same opcje co oryginalny sendmail, ze względu na kompatybilność.
coredump
Nie jestem wielkim fanem Exima z poprzednich doświadczeń, ale spróbowałem Postfix i natychmiast rozwiązałem problemy, które się zdarzają w / Sendmail!
szybka zmiana w lipcu
2

To działało dla mnie:

  • Zainstaluj postfiks

Zobacz instrukcje, jak to zrobić tutaj: https://help.ubuntu.com/community/Postfix (może być już zainstalowany, a plik binarny „sendmail” może być aliasem postfiksa)

  • Postępuj zgodnie z instrukcjami tutaj:

http://lenss.nl/2009/01/making-php-mail-work-on-ubuntu-through-postfix/

mkfifo /var/spool/postfix/public/pickup

Znajdź sendmailproces

ps aux | grep mail

Zabij to

kill <thepid>

Uruchom ponownie postfix

/etc/init.d/postfix restart

Myślę, że możesz po prostu ustawić parametr „myorigin” na dowolną aktywną nazwę domeny, taką jak nazwa domeny, którą posiadasz.

Michael B.
źródło
Doskonały! Czy to PO TYM nękały mnie dwie godziny. =)
Hannes Schneidermayer
1

To może być, ale nie musi, rozwiązanie: dodaj mail.force_extra_parameters = "[email protected]"do pliku php.ini . To powoduje, że PHP automatycznie dołącza [email protected] jako piąty parametr do funkcji mail () PHP.

Jest to wartość zakodowana na stałe i ma zastosowanie tylko w php.ini, więc nie będzie zbyt elastyczna, ale może działa dla ciebie w przypadku programowania?

Janne Pikkarainen
źródło
0

Obserwując ruch sieciowy (pomyśl tcpdump) lub uruchamiając proces stracewysyłania lub wysyłania apache, powinieneś być w stanie dowiedzieć się, dlaczego to opóźnienie istnieje, abyś mógł rozwiązać problem root.

Zwykle opóźnienia w tym zakresie wynikają z nieudanych wyszukiwań DNS, ale nie dowiesz się, dopóki nie spojrzysz. O ile nie naprawisz podstawowego problemu, prawdopodobnie stanie się on problemem, bez względu na to, jak spróbujesz go obejść.

tylerl
źródło
1
Opóźnienie było spowodowane tym, że nazwa hosta była pojedynczym słowem, a nie FQDN (w pełni kwalifikowana nazwa domeny). Wskazując sendmail na / etc / hosts i mając localhost.domain jako pierwszą nazwę domeny (która jest FQDN), nie ma opóźnienia. Zostało to naprawione w krokach 1-4. Pozostałym problemem jest konieczność użycia „-f” - nadal znaczna poprawa polegająca na czekaniu 2 minut na wysłanie poczty.
Michael B
0

Nigdy nie spotkałem się z problemem korzystania z mail () w PHP, który nie był wynikiem problemu na MTA.

W pliku php.ini pokaże, jakie polecenie uruchomi, aby wysłać wiadomość e-mail (domyślnie: „sendmail -t -i”). Spróbuj wysłać wiadomość e-mail z wiersza polecenia, używając tego - założę się, że jest powolny.

Zwykle należy sprawdzić, czy serwer DNS jest poprawnie skonfigurowany na komputerze (i może rozpoznać wszystkie adresy skonfigurowane w MTA) i czy jeśli skonfigurowany jest inteligentny przekaźnik, wówczas nazwę można rozwiązać na adres, z którym system może się połączyć.

symcbean
źródło