php mail () berfungsi sangat lambat di mesin pengembangan lokal

21

Latar Belakang: Jika Anda telah menyiapkan server apache lokal untuk tujuan pengembangan, Anda mungkin mengalami masalah ketika sendmail membutuhkan waktu lama (setidaknya satu menit) untuk mengirim email. Ini sangat menyebalkan jika Anda mencoba men-debug masalah dengan email yang Anda buat.

Ada beberapa posting forum di internet yang membahas masalah ini. Namun, tidak ada tema yang menjelaskan apa yang harus dilakukan dengan cukup detail untuk pengetahuan saya yang terbatas. Inilah langkah-langkah yang berhasil bagi saya:

1) temukan nama host Anda (seandainya Anda lupa) menggunakan perintah ini:

:~$ cat /hosts/hostname

myhostname

2) edit file /etc/hostsdan pastikan baris pertama adalah sebagai berikut:

127.0.0.1 localhost.localdomain localhost myhostname

3) edit file konfigurasi sendmail ( /etc/mail/sendmail.cfdi Ubuntu) dan Batalkan komentar pada baris#O HostsFile=/etc/hosts

4) Nyalakan kembali komputer. Komputer seharusnya boot lebih cepat sekarang dan fungsi mail () akan segera kembali. NAMUN, email tidak akan benar-benar dikirim kecuali jika Anda mengikuti langkah 5.

5) Anda harus menggunakan opsi sendmail '-f' baru setiap kali menggunakan fungsi mail. Sebagai contoh:

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

Pertanyaan saya untuk sesama serverfaulter saya adalah:

Perubahan apa lagi yang bisa dilakukan sehingga saya tidak harus menggunakan opsi sendmail -f? Meskipun tidak terlalu sulit untuk menambahkan opsi -f, itu adalah masalah ketika CMS Anda (seperti Drupal) tidak menggunakan opsi -f saat mengirim email. Anda perlu meretas modul inti untuk menambahkan opsi ini.

Michael B
sumber
1
pada sistem Ubuntu saya perintahnya adalahcat /etc/hostname
zkent

Jawaban:

6

Ya saya tahu bahwa ini bukan yang Anda minta, tetapi mengapa Anda tidak mencoba Postfix atau Exim? Keduanya tersedia untuk ubuntu (Postfix bahkan merupakan mta default pada sistem Ubuntu) dan keduanya memberikan perintah 'sendmail' yang kompatibel yang bekerja dengan sangat baik. Sendmail IMHO agak ketinggalan zaman dan Anda akan mendapatkan peluang dukungan yang lebih baik dengan MTA yang lebih modern.

coredump
sumber
Bahkan jika ada sistem email yang lebih baik daripada sendmail, masalahnya adalah memelihara server pengembangan yang mencerminkan server produksi. sendmail adalah agen email default untuk php.
Michael B
1
Maksud Anda sendmail perangkat lunak atau sendmail biner? Karena Exim dan Postfix juga memiliki sendmailbiner yang menerima opsi yang sama dengan sendmail asli, untuk masalah kompatibilitas.
coredump
Saya bukan penggemar Exim dari pengalaman masa lalu, tetapi mencoba dan memperbaiki Postfix dengan masalah yang kita alami bersama Sendmail!
quickshiftin
2

Ini bekerja untuk saya:

  • Instal postfix

Lihat petunjuk di sini tentang cara melakukannya di sini: https://help.ubuntu.com/community/Postfix (Ini mungkin sudah diinstal, dan biner 'sendmail' sebenarnya bisa menjadi alias untuk postfix)

  • Ikuti instruksi di sini:

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

mkfifo /var/spool/postfix/public/pickup

Temukan sendmailprosesnya

ps aux | grep mail

Bunuh itu

kill <thepid>

Mengulang kembali postfix

/etc/init.d/postfix restart

Saya pikir Anda bisa mengatur parameter 'myorigin' ke nama domain aktif apa pun seperti nama domain yang Anda miliki.

Michael B
sumber
Sempurna! Apakah ini SETELAH mengganggu saya selama dua jam. =)
Hannes Schneidermayer
1

Ini mungkin atau mungkin bukan solusi bagi Anda: tambahkan mail.force_extra_parameters = "[email protected]"ke file php.ini Anda . Itu membuat PHP secara otomatis menambahkan [email protected] sebagai parameter kelima ke fungsi mail () PHP.

Itu nilai hardcoded dan hanya berlaku di php.ini sehingga tidak akan sangat fleksibel, tetapi mungkin bekerja untuk Anda dalam kasus pengembangan Anda?

Janne Pikkarainen
sumber
0

Dengan menonton lalu lintas jaringan (pikirkan tcpdump) atau dengan menjalankan proses stracesendmail atau apache Anda, Anda harus dapat mengetahui mengapa penundaan itu ada sehingga Anda dapat memperbaiki masalah root.

Biasanya keterlambatan dalam rentang tersebut adalah karena gagal pencarian DNS, tetapi Anda tidak akan tahu sampai Anda melihatnya. Kecuali jika Anda memperbaiki masalah yang mendasarinya, itu mungkin akan menjadi masalah tidak peduli bagaimana Anda mencoba mengatasinya.

tylerl
sumber
1
Penundaan itu disebabkan oleh nama host menjadi satu kata daripada FQDN (nama domain yang sepenuhnya memenuhi syarat). Dengan menunjuk sendmail ke / etc / hosts dan memiliki localhost.domain sebagai nama domain pertama (yang merupakan FQDN) tidak ada penundaan. Ini diperbaiki pada langkah 1-4. Masalah yang tersisa adalah harus menggunakan '-f' - masih merupakan peningkatan besar karena harus menunggu 2 menit untuk mengirim email.
Michael B
0

Saya belum pernah menemukan masalah menggunakan mail () di PHP yang bukan merupakan hasil dari masalah pada MTA.

Dalam file php.ini Anda akan menampilkan perintah apa yang dijalankannya untuk mengirim email (default: "sendmail -t -i"). Coba kirim email dari baris perintah menggunakan ini - saya berani bertaruh lambat.

Hal-hal yang biasa diperiksa adalah apakah server DNS dikonfigurasikan dengan benar pada mesin (dan dapat menyelesaikan semua alamat yang dikonfigurasi dalam MTA) dan bahwa jika relai cerdas dikonfigurasikan maka nama dapat diselesaikan ke alamat yang dapat disambungkan oleh sistem.

symcbean
sumber