Zend Framework uygulamasından alıcıya yüzlerce e-posta göndermek için en iyi yaklaşım nedir?

8 Cevap php

Benim uygulama için bir posta listesi sistemi uygulamak çalışıyorum. Şu anda abone listemde döngü, benim ulaşım gibi Zend_Mail_Transport_Smtp('localhost') kullanarak ve her biri için yeni bir Zend_Mail yolluyorum. Ancak, abone sayısını artırmak gibi komut dosyası için gereken zaman uzunluğu artar tamamlamak olduğunu fark ediyorum.

Ben e-postaların kuyruğa içeren, bu iş için daha profesyonel bir yaklaşım olmalı eminim. Ben ideal yaklaşım, formu doldurun gönderin tıklayın ve hemen e-postalar yerine göndermeyi tamamlamak için e-postaların yüzlerce beklenmeden, gönderilen olduğunu söyleyerek bir yanıt almak için kullanıcı için olurdu herhalde.

I Zend_Mail herhangi bir tür posta kuyruğa yapmaz anlıyorum. Bu deneyimi olan herkes, bana bu nasıl yapılabilir bir bakış verebilir misiniz? Ben cron / crontab / cronjobs hakkında bir şey biliyor, bu yüzden bunu içeriyorsa, süreci açıklayınız yok.

8 Cevap

Güvenilir PHP kullanarak e-postaların çok sayıda göndermek için bir kuyruk mekanizmasını kullanmak zorunda. Başkaları tarafından önerildiği gibi, bir kuyruk kullanarak süreci şöyle:

  • Kullanıcılar set üzerinden döngü, her biri için bir e-posta oluşturma ve muhtemelen içeriği özelleştirmek
  • Sonrasına kadar e-posta gönderme gecikme hangi sıraya her posta nesnesini iletin
  • Cron komut çeşit, bir seferde birkaç yüz sıranın içeriğini göndermek. Note: you'll want to tweak the number of emails you are sending by watching the logs for errors coming back from the actual sending process. If you try to send too many, I've noticed it reaches a point where the mail transport will no longer accept connections (I'm using qmail)

Bunu yapmak için kullanabileceğiniz orada bir kaç kütüphane vardır, PEAR Mail Queue (Mail_Mime ile) ve SwiftMailer hem siz e-posta oluşturmak ve kuyruğa sağlayacak. Şimdiye kadar, Zend Mail yalnızca (o daha sonra) kuyruk değil, e-posta oluşturma sağlar.

Ben öncelikle PEAR Mail Queue ile deneyime sahip ve birkaç FRİKİKLERİNDEN vardır. Eğer Posta Mime en quoted-yazdırılabilir kodlama uygulaması kullanılarak, (örneğin, 20.000 'den fazla kullanıcısı döngü ve makul bir süre içinde kuyruğuna içine almaya çalışırken) e-postaların çok sayıda sıraya çalışıyorsanız çok yavaş. Sen base64 kodlama geçerek bu hızlandırabilir.

Zend Mail gibi, PEAR Posta Kuyruğu içine Zend Posta nesneler koyar Zend Mail Transport nesneyi yazabilirsiniz. Ben bazı başarı ile yapmış, ama bu doğru olsun oynarken biraz alır. Bunu yapmak için,) sizin Zend Posta nesnesinin yöntemi veya (_sendMail yöntemini uygulamak (eğer Posta Kuyruğu içine Zend Posta nesne düşecek nerede olduğu) ve send için ulaşım nesne örneğini geçmek, Zend Posta Aktarım Özet uzatmak Zend Mail :: setDefaultTransport ().

Alt satırda bunu yapabilirsiniz birçok yolu vardır, ama sizin adınıza bazı araştırma ve öğrenme alacaktır. Ne var ki, bir çok çözülebilir bir sorundur.

NOTE: when I first read your question, I thought it said hundreds of thousand emails at once. When I double checked, I noticed it actually said hundreds to thousands. I'm too lazy to change my post now, so here are some caveats: From my experience, you can probably run fine without a commercial tool to about 40K. At about 10K you'll want to be following the 'minimum' list to prevent major pain when you start reaching larger list sizes. I do recommend implementing it all right away though.

Ben e-posta göndererek iki taraf vardır, önce söyledim:

  1. The technical side -- basically all of the RFC's around the smtp protocol, email formats, DNS records, etc. This is mildly complicated but solvable.
  2. The magical side -- email delivery management is voodoo. You will get frustrated, things will break for no apparent reason and you will consider leaving for another job that doesn't involve email.

Ben kendi toplu göndereni yazmıyorum öneririz. PHP iyi bir iş yapmak emin değilim, ama muhtemelen başka bir yerde zaman harcamak gerekir. Ben geçmişte kullanılan ve tavsiye ettik iki ürün Strongmail ve PowerMTA vardır. Uyardı - onlar yüksek bir fiyat etiketi var, ama neredeyse uzun vadede kendi çözüm bina daha harcayacağınız garanti edemez.

PHP kendi yazma ile çivilenmiş alırsınız bir alan / bataklık özelliğini daraltma. Posta sunucuları sizi yavaşlatmak ve küfrettiği sizi durdurmak için bir kaç mesaj yolladım sonra uyku (30) 's ekleyerek başlayacak.

Tipik olarak, bu ticari toplu gönderenler kuyruk için SMTP protokolünü çalıştırın. Sen Zend_Mail kullanmaya devam edeceğini, ama zor kod sizin sunucusuna bağlanmak için. Bu hedeflerine posta göndermek için bu kendi motorunu kullanmak, daha sonra sadece hızlı göndermek gibi yaklaşık mail sıraya olacak.

Bir 100K listesinde, e-posta en iyi uygulamaları istihdam etmek zorunda olacak. En azından, ihtiyacınız olacak:

  • SPF Records, belki DKIM yanı
  • Üzerinde segment trafiği için birden IP'ler - 3 IP, güvendiğiniz kaliteli adresi için bir tane, orta risk IP adresleri için bir tane ve yüksek risk IP adresleri için bir tane var. Bu tasarım en iyi müşterilerinin posta almak için riskini en aza indirir.
  • IP adreslerini göndermek için uygun ters DNS
  • Geribildirim spam şikayetleri işleme AOL, Hotmail, Yahoo ve diğerlerinden döngüler kullanın
  • Aboneliğini ve yönetim sıçrama - bu adresleri budama emin olun
  • Açık / tıklama izleme olması da önemli - A listesinde müşterilerin iseniz e-postalarınızı açılış değil, sen benzeri B listesine onları aşağılamak ve gerekir. ISS bir bal küpü haline inaktif hesapları dönecek, çünkü bu önemlidir. Hotmail bu ünlüdür.

Eğer e-posta gönderme konusunda gerçekten ciddi iseniz Son olarak, Geri Dönüş Yolu gibi diğer bazı araçlar isteyeceksiniz.

PHP.net Belgelerinden.

Note: It is worth noting that the mail() function is not suitable for larger volumes of email in a loop. This function opens and closes an SMTP socket for each email, which is not very efficient.
For the sending of large amounts of email, see the » PEAR::Mail, and » PEAR::Mail_Queue packages.

Zend Posta sınıfı muhtemelen oldukça iyidir (zerdüştlerin şeyler en iyi) Ama diğer seçenekleri isterseniz. İşte onlar.

Asychronous arka plan işleme için kuyrukta e-postaları yerleştirmek için Zend_Queue kullanın. Sen arka planda süreçleri kuyruğunu bir cron işi gerekir.

protected function _enqueueEmail(WikiEmailArticle $email)
{
    static $intialized = false; 

    if (!$initialized) {

        $this->_initializeMailQueue("wikiappwork_queue");
        $initialized = true;
    }

    $this->_mailQueue->send(serialize($email));  
}
protected function _initializeMailQueue()
{
    /* See: 1.) http://framework.zend.com/manual/en/zend.queue.adapters.html and
     *      2.) Zend/Queue/Adapter/Db/mysql.sql. 
     */

 $ini = Zend_Controller_Front::getInstance()->getParam('bootstrap')
                                            ->getOptions(); 

     $queueAdapterOptions =    array( 'driverOptions' => array(
    'host' => $ini['resources']['multidb']['zqueue']['host'],
    'username' => $ini['resources']['multidb']['zqueue']['username'],
    'password' => $ini['resources']['multidb']['zqueue']['password'],
    'dbname' => $ini['resources']['multidb']['zqueue']['dbname'],
    'type' => $ini['resources']['multidb']['zqueue']['adapter'] ),
    'name' => $ini['resources']['multidb']['zqueue']['queueName'] );

    $this->_mailQueue = new Zend_Queue('Db', $queueAdapterOptions);

 }

Sonra cron iş için, gibi bir komut

<?php
use \Wiki\Email\WikiEmailArticle;

// Change this define to correspond to the location of the wikiapp.work/libary
define('APPLICATION_PATH', '/home/kurt/public_html/wikiapp.work/application');

set_include_path(implode(PATH_SEPARATOR, array(
     APPLICATION_PATH . '/../library',
     get_include_path(),
 )));

// autoloader (uses closure) for loading both WikiXXX classes and Zend_ classes.
spl_autoload_register(function ($className) { 

  // Zend classes need underscore converted to PATH_SEPARATOR
  if (strpos($className, 'Zend_' ) === 0) {

        $className = str_replace('_', '/', $className );   
  }

  $file = str_replace('\\', '/', $className . '.php');

  // search include path for the file.
  $include_dirs = explode(PATH_SEPARATOR, get_include_path());

  foreach($include_dirs as $dir) {

    $full_file = $dir . '/'. $file;

    if (file_exists($full_file)) { 

        require_once $full_file; 
        return true; 
    }
  }

  return false; 
 }); 

// Load and parese ini file, grabing sections we need.
$ini = new Zend_Config_Ini(APPLICATION_PATH . 
                          '/configs/application.ini', 'production');

$queue_config = $ini->resources->multidb->zqueue;

$smtp_config = $ini->email->smtp;

$queueAdapterOptions =  array( 'driverOptions' => array(
                                        'host'      => $queue_config->host,
                    'username'  => $queue_config->username,
                    'password'  => $queue_config->password,
                    'dbname'    => $queue_config->dbname,
                    'type'      => $queue_config->adapter),
                'name' => $queue_config->queuename);

$queue = new Zend_Queue('Db', $queueAdapterOptions);


$smtp = new Zend_Mail_Transport_Smtp($smtp_config->server, array(
                'auth'      => $smtp_config->auth,
        'username'  => $smtp_config->username,
        'password'  => $smtp_config->password,
        'port'      => $smtp_config->port,
        'ssl'       => $smtp_config->ssl
        ));

Zend_Mail::setDefaultTransport($smtp);

$messages = $queue->receive(10); 

foreach($messages as $message) {

        // new WikiEmailArticle.     
    $email = unserialize($message->body);

        try {

            $email->send();

        }  catch(Zend_Mail_Exception $e) {

               // Log the error?
               $msg = $e->getMessage();
               $str = $e->__toString();
               $trace =  preg_replace('/(\d\d?\.)/', '\1\r', $str);
        } // end try

$queue->deleteMessage($message);

} // end foreach

Sen diğerleri de belirtildiği gibi (her ne kadar) posta önlemek, alıcıların binlerce içine PHP kadar kullanarak ince olmalıdır. Ben standart posta fonksiyonları atlayarak ve MTA ile daha doğrudan çalışarak üzerinde tekme posta büyük miktarlarda için tasarlanmış bir kaç sistemleri (100,000 + alıcıları) gördüm. Hatta daha sonra o gerekli olduğunu bana açık olmuştur değil.

E-posta profesyonel emin yapma biçimlendirme (HTML ve düz metin mümkün) iyi yapma hakkında daha fazla olduğunu, insanların kolayca iptal edebilirsiniz, sıçramalar posta sunucusu tüm doğru DNS kayıtları yerdesiniz olan, doğru işlenir ve sunucu yapılandırma duymazken t herhangi bir büyük kara sisteminin kurallarını ihlal. Eğer uygulama yazmak dil birkaç yüz veya bin hatta birkaç iletilere önemli bir faktör değildir.

Her e-posta bir birey için özelleştirilmiş php bir toplu mailler uyguladı. Bu zor değil ve çok uzun sürmedi. I swiftmailer ve cron kullanılır. Zend Posta de Tamam olabilir. Ben PEAR posta kuyruğunda ile başladı, ancak e-postaları kadar kuyruk çok yavaş oldu.

E-postaları kuyruk süreci şöyle devam etti:

  1. E-posta şablonu oluşturmak ve tutucuları ekleyin (veya bir şablon motoru kullanmak) benzersiz içerik ikame edilecek alanlar için.
  2. Bir döngü içinde, herhangi bir benzersiz içerik ile yerine yer tutucular, elde edilen e-posta içeriği eklemek konu, adresleri, toplu id, ve isteğe bağlı olarak bir veritabanı tablosuna bir öncelik değeri.

Ben e-postaların toplu göndermek için bir cron işi kullanılır. Ben sınırları ile paylaşılan bir bilgisayar üzerinde beri cron zaman aralığı ve parti başına gönderilen e-postaların sayısı önemliydi. Cron tarafından çağrıldı betiği cron sadece erişilebilir oldu. Komut x toplu id tarafından sipariş tablosundan e-postaların sayısını ve isteğe öncelik okuyun. Bir e-posta başarıyla gönderildi, bu veritabanı kuyruktan silindi. Bir e-posta gönderilecektir olamazdı, bu kuyrukta kalmış ve bir sayaç bu kayıt için artırılır edildi. Bir karşı bir dizi dizi bitmişti, sonra e-posta kuyruktan silindi.

Zend Posta sınıfı iyi görünüyor ve kullanımı kolay, aynı zamanda e-posta pazarlama çok önemli e-posta, bir düz metin ve HTML versiyonu göndermenizi sağlar.

Çerçeve çalışmaları ile aşina iseniz onunla sopa istiyorum.

Insanların büyük hacimli e-postalar göndermek dikkate alınması gereken önemli şeyler vardır:

  • Lütfen webserver e-postalar sitenizi ziyaret insanların sunucu üzerinde yük + açılan görüntü istekleri ile başa çıkabilir.

Cevap hayır ya da emin değilse, apache kriter kullanarak bunu eğer işe yardımcı gerekir. Sizin hala emin değilseniz, o partiden her zaman en iyisidir yükü yaymak için (crontab ile zamanlanmış olabilir) e-posta gönderebilirsiniz.

Bu yardımcı olur umarım.