Teslimat kullanıcı geribildirim verirken PHP kullanarak asycronously posta göndermek mümkün mü?

4 Cevap php

Teslimat canlı kullanıcı geribildirim verirken PHP kullanarak asycronously posta göndermek mümkün mü?

Ben recenty müşterilere biçimlendirilmiş e-posta göndermek için şirketimizin intranet için küçük bir app yazdım. Arayüzü oldukça temiz ve sadece bir iş numarasının girdi, daha sonra inşa gerektirir ve posta gönderir. Posta, inşa olurken, başka bir sunucudan gelen ekleri numarasını alır ve her şey otomatik. Kullanılan kütüphane PHPMailer.

Muhtemelen diğer teknolojileri kullanarak, ama yine gönderilen postaların ilerlemesini göstermek için, ana dili olarak PHP kullanarak bir yolu var mı? Ben posta aslında, vb gönderilmiş olup olmadığını kontrol için kontrol güçlü hata kodlu var ama bir ilerleme çubuğu, vb aracılığıyla kullanıcılara aslında sunucuya postayı teslim görsel ipucu veren bir yol eksik

Bu PHP ve Ajax gibi bir şey kullanarak mümkün mü? Nasıl transit posta ilerlemeyi belirlemek istiyorsunuz?

4 Cevap

Ben burada en iyi seçenek zamanı tahmin olduğunu düşünüyorum. Eğer SMTP sunucusu alıcı hızını bilmek, bazı 10MB postalar gönderilmesi için gereken ne kadar zaman test edebilirsiniz. Bu bilgi ile onun büyüklüğü dayalı herhangi bir e-posta transfer süresi tahmin, ve müşteriye buna dayanarak bazı görsel rahatsızlığı verebilir.

Ben PHPMailer aşina değilim, ama kesinlikle gönderilen e-postaların durumu hakkında onu sorgulamak için edebilmek için kütüphane desteğine ihtiyacımız var.

PHP parçacığı yoktur göz önüne alındığında, ben teslimatlar için bir veritabanı kuyruğu olan öneririz, ve veritabanı üzerinde mevcut durumunu işaretleme, yan teslimatları işler ana site (veya cron üzerinden) tetiklenen harici PHP süreç olurdu Her teslimatta: NOT_PROCESSED, IN_PROGRESS, BAĞLAMA, BAĞLI, SENDING_DATA, KABUL, FAILURE_X. Sen Ajax ile her tesliminde durumu veritabanını sorgulayabilirsiniz.

PHPMailer dahili makinenizde bir röle SMTP sunucusu kullanır standart PHP mail () fonksiyonu, kullanıyorsa, (size Soketleri kendi oluşturduğunuz takdirde olurdu) durumu hakkında fazla bir bilgi, sadece üç ana durumu olabilir ki olamaz NOT_PROCESSED, IN_PROGRESS, FAILURE_X.

(Bu başarısızlığın nedenini açıkladığı gibi FAILURE_X gerçekten, birçok devletleri temsil eder).

Mail () kullanarak son bir göz bilmeniz mümkün olacak durumu her zaman çok hızlı bir şekilde kabul edecek yerel SMTP röle, sadece durum olduğunu, ve posta gerçekten olup olmadığını söylemek mümkün olmayacaktır (en azından buna arayüz veya yapmak için kötü şeyler mailQ, okumak zorunda kalmadan) giden sunucuya teslim.

DISCLAIMER

Hatta e-posta diğer ucunda alındıktan eğer bilemeyiz, ne de ne kadar zaman alacak gerçek durumu bilmek iyi durumda, ben böyle bir yapı nasıl olurdu yararlı emin değilim göz önüne alındığında. Yeterli olacağını kesinlikle programlamak eğlenceli olurdu, ama ben standart e-posta feragatnamelere (bu bazen yeniden denemeden önce ayrılmak, tekrar deneyin başarısız olursa e-postalar, transit kaybolmuş olabilir) ile belki de sadece bazı göz şeker, gerçekten yararlı olacaktır şüphesiz .

Eğer işlemi e-posta varsa bilgilerini geri göndermek, o mesajları ile bir ilerleme çubuğu veya ilerleme metni güncellemek mümkün Mayıs.

Bu Wordpress yükseltmeleri / iş yükler şekilde benzemektedir. "Yeniden başarılı" reaktivasyonu çalışılıyor "," Plugin yükleme "," Plugin devre dışı bırakılması "," xxxx.xxx.xxx indiriliyor ": işlemi tamamlanır tamamlanmaz, metin her adımı anlatıyor görüntüleyen benzer bir şey bir dinleyici üzerinde gerekir. istemci tarafı ve sunucu üzerindeki mesajların bir gönderen: komut çalıştırır gibi, istemciye mesaj gönderir.

Daha önce söylediğim gibi, bu sadece gerçekçi kadarıyla sunucu olarak gidebilirsiniz. Posta başarılı sunucu sol eğer delalet olabilir, ama e-posta alıcısı konformasyon adım çeşit olmadan, ben bu kadar gitmek gibi olduğunu düşünüyorum.

Bize orada tamamlamak için bir şans olduğunu tahmin ediyorum, ama bu çözüm birileri tarafından zaten yapılır emin olamaz: (.

Düşüncelerim:

as I know you can work with socket in non-blocking mode stream_set_blocking() then you could try to use that approach to send emails via that non-blocking socket.