php mail () işlevi yerel geliştirme makinesinde acı verici bir şekilde yavaşlıyor


21

Arka plan: Geliştirme amaçlı bir yerel apache sunucusu kurduysanız, sendmail'in e-posta göndermesi uzun sürdüğü (en az bir dakika) sorunla karşılaşmış olabilirsiniz. Oluşturduğunuz bir e-posta ile ilgili bir sorunu ayıklamaya çalışıyorsanız, bu son derece sinir bozucudur.

İnternette bu sorunu tartışan birkaç forum yazısı var. Ancak, hiçbir tema sınırlı bilgim için yeterince ayrıntılı olarak ne yapılması gerektiğini açıklamadı. İşte benim için işe yarayan adımlar:

1) bu komutu kullanarak ana bilgisayar adınızı (unutmuş olabilirsiniz) bulun:

:~$ cat /hosts/hostname

myhostname

2) dosyayı düzenleyin /etc/hostsve ilk satırın aşağıdaki olduğundan emin olun:

127.0.0.1 localhost.localdomain localhost myhostname

3) sendmail yapılandırma dosyasını düzenleyin ( /etc/mail/sendmail.cfUbuntu'da) ve Satırı uncomment#O HostsFile=/etc/hosts

4) Bilgisayarı yeniden başlatın. Bilgisayar şimdi daha hızlı açılmalı ve mail () işlevi neredeyse hemen dönmelidir. Ancak, 5. adımı izlemediğiniz sürece e-postalar aslında gönderilmez.

5) Her posta işlevini kullanırken sendmail '-f' seçeneğini kullanmalısınız. Örneğin:

mail('recipient@somewhere.com', 'the subject', 'the message', null, '-fsender@somewhere.com');

Sunucu arkadaşlarım için sorum şu:

Sendmail -f seçeneğini kullanmama gerek kalmadan başka hangi değişiklikler yapılabilir? -F seçeneğini eklemek çok zor olmasa da, CMS'nizin (Drupal gibi) posta gönderirken -f seçeneğini kullanmaması bir problemdir. Bu seçeneği eklemek için bir çekirdek modülü kırmanız gerekir.


1
Ubuntu sistemimde komut şudurcat /etc/hostname
zkent

Yanıtlar:


6

Peki, sorduğun şeyin bu olmadığını biliyorum ama neden Postfix veya Exim'i denemiyorsun? Her ikisi de ubuntu'da mevcut (Postfix, Ubuntu sistemlerinde varsayılan mta bile) ve her ikisi de çok iyi çalışan uyumlu bir 'sendmail' komutu sağlıyor. IMHO sendmail biraz tarihli ve daha modern MTA ile daha iyi destek şansı elde edeceksiniz.


Sendmail'den daha iyi posta sistemleri olsa bile, sorun, üretim sunucusunu yansıtan bir geliştirme sunucusu oluşturmaktır. sendmail php için varsayılan posta ajanıdır.
Michael B,

1
Yani yazılımı sendmail mi, yoksa ikili mail'i mi göndereceksin? Çünkü Exim ve Postfix sendmail, uyumluluk sorunları için orijinal sendmail ile aynı seçenekleri kabul eden bir ikiliye sahip.
coredump

Exim'in geçmiş deneyimlerinden çok fazla hayranı değilim, ancak Postfix'e hemen denedik ve Sendmail ile karşılaştığımız sorunları çözdüm!
quickshiftin

2

Bu benim için çalıştı:

  • Postfix'i yükle

Burada bunun nasıl yapılacağına ilişkin talimatlara bakın: https://help.ubuntu.com/community/Postfix (Zaten yüklü olabilir ve 'sendmail' ikilisi aslında postfix için bir takma ad olabilir)

  • Buradaki talimatları izleyin:

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

mkfifo /var/spool/postfix/public/pickup

bul sendmailsüreci

ps aux | grep mail

Öldür onu

kill <thepid>

Tekrar başlat postfix

/etc/init.d/postfix restart

Sanırım 'myorigin' parametresini sahip olduğunuz bir alan adı gibi herhangi bir aktif alan adına ayarlayabiliyorsunuz.


Mükemmel! Bu beni iki saat boyunca rahatsız etti. =)
Hannes Schneidermayer

1

Eklenti: Bu veya sizin için bir çözüm olabilir veya olmayabilir mail.force_extra_parameters = "-fsender@somewhere.com"senin için php.ini dosyasında. PHP'nin otomatik olarak -fsender@somewhere.com adresini PHP'nin mail () işlevine beşinci bir parametre olarak eklemesini sağlar.

Bu kodlanmış bir değerdir ve sadece php.ini'de uygulanabilir, bu yüzden çok esnek olmayacak, ama belki de geliştirme durumunuzda sizin için çalışıyor?


0

Ağ trafiğini izleyerek (düşünerek tcpdump) veya stracesendmail veya apache işlemlerinizi çalıştırarak , neden bu gecikmenin orada olduğu hakkında bir fikir edinebilmelisiniz , böylece kök sorununu çözebilirsiniz.

Genellikle bu aralıktaki gecikmeler başarısız DNS aramalarından kaynaklanır, ancak siz bakana kadar bilemezsiniz. Altta yatan sorunu çözmezseniz, nasıl çalışacağınız önemli değil, muhtemelen bir sorun haline gelecektir.


1
Gecikme, ana makine adının FQDN'den ziyade tek bir kelime olmasından kaynaklandı (tam etki alanı adı). Sendmail'i / etc / hosts dizinine işaretleyerek ve localhost.domain işlevini ilk etki alanı adı (FQDN) olarak işaretleyerek gecikme olmaz. Bu adım 1-4'te düzeltildi. Geriye kalan konu '-f' kullanmak zorunda - hala posta göndermek için 2 dakika beklemede büyük bir gelişme.
Michael B,

0

MTA'daki bir problemin sonucu olmayan PHP'de mail () kullanarak bir problemle karşılaşmadım.

Php.ini dosyanızda, bir e-posta göndermek için hangi komutu çalıştırdığını gösterecektir (varsayılan: "sendmail -t -i"). Bunu kullanarak komut satırından bir e-posta göndermeyi deneyin - Yavaşça bahse girerim.

Kontrol edilmesi gereken genel şeyler, bir DNS sunucusunun makinede doğru şekilde yapılandırılıp yapılandırılmadığıdır (ve MTA'da yapılandırılmış tüm adresleri çözebilir) ve akıllı bir röle yapılandırılmışsa, adın sistemin bağlanabileceği bir adrese çözülebilir olduğunu belirtir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.