2009-04-25 16 views
16

मैं अपने आवेदन के लिए एक मेलिंग सूची प्रणाली को लागू करने की कोशिश कर रहा हूं। मैं वर्तमान में Zend_Mail_Transport_Smtp('localhost') का उपयोग अपने परिवहन के रूप में कर रहा हूं, ग्राहकों की मेरी सूची के माध्यम से लूपिंग कर रहा हूं, और प्रत्येक को एक नया Zend_Mail भेज रहा हूं। हालांकि, मैं देख रहा हूं कि स्क्रिप्ट के पूरा होने के लिए समय की लंबाई बढ़ जाती है क्योंकि ग्राहकों की संख्या बढ़ जाती है।ज़ेंड फ्रेमवर्क एप्लिकेशन से सैकड़ों प्राप्तकर्ताओं को ईमेल भेजने का सबसे अच्छा तरीका क्या है?

मुझे यकीन है कि ऐसा करने के लिए और अधिक पेशेवर दृष्टिकोण होना चाहिए, जिसमें ईमेल की कतार शामिल है। मुझे लगता है कि प्रयोक्ता के लिए फॉर्म भरने के लिए आदर्श दृष्टिकोण होगा, भेजने के लिए क्लिक करें, और तुरंत प्रतिक्रिया दें कि ईमेल भेज रहे हैं, सैकड़ों ईमेल भेजने के लिए इंतजार करने के बजाय।

मुझे लगता है कि Zend_Mail कोई भी मेल मेल क्यूइंग नहीं करता है। क्या कोई भी जिसके साथ इसका अनुभव हो सकता है, मुझे इस बारे में एक सिंहावलोकन दें कि यह कैसे किया जा सकता है? मुझे क्रॉन/क्रोंटैब/क्रोनबॉज के बारे में कुछ भी पता नहीं है, इसलिए यदि इसमें शामिल है, तो कृपया प्रक्रिया की व्याख्या करें।

उत्तर

19

विश्वसनीय रूप से PHP का उपयोग करके बड़ी संख्या में ईमेल भेजने के लिए आपको क्यूइंग तंत्र का उपयोग करना होगा। दूसरों द्वारा सुझाए गए के रूप में, एक कतार उपयोग करने की प्रक्रिया कुछ इस तरह दिखता है: उन के अपने सेट से अधिक

  • लूप, हर एक के लिए सामग्री
  • पास कतार में प्रत्येक मेल वस्तु एक ईमेल बनाने और संभवतः को अनुकूलित जो बाद में
  • किसी भी प्रकार की क्रॉन स्क्रिप्ट में, ईमेल को भेजने में देरी होगी, कतार की सामग्री को एक समय में कुछ सौ भेजें। नोट: आप वास्तविक प्रेषण प्रक्रिया से वापस आने वाली त्रुटियों के लॉग देखकर आपके द्वारा भेजे जा रहे ईमेल की संख्या को ट्विक करना चाहते हैं। यदि आप बहुत अधिक भेजने का प्रयास करते हैं, तो मैंने देखा है कि यह एक बिंदु है जहां मेल ट्रांसपोर्ट अब कनेक्शन स्वीकार होगा (मैं qmail उपयोग कर रहा हूँ)

वहाँ आप के लिए उपयोग कर सकते हैं कुछ पुस्तकालयों रहे हैं पहुंचता है ऐसा करें, PEAR Mail Queue (Mail_Mime के साथ) और स्विफ्टमेलर दोनों आपको ईमेल बनाने और कतार बनाने की अनुमति देते हैं। अब तक, ज़ेंड मेल केवल ईमेल बनाने के लिए प्रदान करता है, कतार में नहीं (बाद में उस पर अधिक)।

मुझे मुख्य रूप से PEAR Mail Queue के साथ अनुभव है और कुछ गॉथैस हैं। यदि आप बड़ी संख्या में ईमेल कतारबद्ध करने की कोशिश कर रहे हैं (उदाहरण के लिए, 20,000 से अधिक उपयोगकर्ताओं को लूप करना और उन्हें उचित समय में कतार में लाने का प्रयास करना), मेल माइम के उद्धृत-प्रिंट करने योग्य एन्कोडिंग कार्यान्वयन का उपयोग करना बहुत धीमा है। आप बेस 64 एन्कोडिंग पर स्विच करके इसे तेज कर सकते हैं।

ज़ेंड मेल के लिए, आप एक ज़ेंड मेल ट्रांसपोर्ट ऑब्जेक्ट लिख सकते हैं जो आपके ज़ेंड मेल ऑब्जेक्ट्स को पियर मेल कतार में रखता है। मैंने कुछ सफलता के साथ ऐसा किया है, लेकिन इसे सही करने के लिए थोड़ा सा खेलना पड़ता है।ऐसा करने के लिए, ज़ेंड मेल ट्रांसपोर्ट सार का विस्तार करें, _sendMail विधि को लागू करें (जहां आप अपनी ज़ेंड मेल ऑब्जेक्ट को मेल कतार में छोड़ देंगे) और अपने परिवहन ऑब्जेक्ट का उदाहरण अपने ज़ेंड मेल ऑब्जेक्ट की प्रेषण() विधि पर भेजें या ज़ेंड मेल :: setDefaultTransport() द्वारा।

नीचे की रेखा यह है कि आप ऐसा करने के कई तरीके हैं, लेकिन यह आपकी ओर से कुछ शोध और सीख लेगा। हालांकि, यह एक बहुत ही हल करने योग्य समस्या है।

0

ज़ेंड मेल क्लास अच्छा दिखता है, और उपयोग करने में आसान है, यह आपको ईमेल का सादा पाठ और HTML संस्करण भेजने की अनुमति देता है, जो ईमेल मार्केटिंग में बहुत महत्वपूर्ण है।

यदि आप फ्रेम काम से परिचित हैं तो मैं इसके साथ रहूंगा।

महत्वपूर्ण बातें जब लोगों की बड़ी मात्रा को ईमेल भेजने पर विचार कर रहे हैं:

  • अपने वेबसर्वर छवि के अनुरोध के साथ सामना कर सकते हैं जब ईमेल खोले जाते हैं + अपनी साइट पर जाकर लोगों के सर्वर पर लोड।

यदि उत्तर कोई नहीं है या आपका अनिश्चित है, तो अपाचे बेंचमार्क का उपयोग करके यह काम करने में आपकी सहायता करने में सक्षम होना चाहिए। यदि आपका अभी भी अनिश्चित है, तो लोड को फैलाने के लिए बैच को ईमेल भेजने के लिए हमेशा सर्वोत्तम होता है (जिसे क्रोंटैब के साथ समय दिया जा सकता है)।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

यह एक भ्रामक जवाब के बाद से यदि क्रॉन का उपयोग नहीं है एक स्क्रिप्ट, स्क्रिप्ट टाइमआउट जब ईमेल भेजने एक मुद्दा हो जाएगा से पहले यातायात चिंता का विषय है। – rick

+0

मुझे लगता है कि फिल का सुझाव है कि आप ईमेल भेजने के लिए क्रॉन का उपयोग करते हैं। उदाहरण के लिए, सूची समाप्त होने तक, केवल 30 मिनट, प्रत्येक 30 मिनट में भेजें। – grossvogel

+0

लेकिन ऐसा लगता है कि वह सुझाव दे रहा है कि क्रॉन्टाब को उच्च यातायात के समाधान के रूप में इस्तेमाल किया जाना चाहिए? वैसे भी, हमें विपणन अभियान के साथ बहुत अधिक यातायात उत्पन्न करने के लिए बहुत भाग्यशाली होना चाहिए। संभावना है, यह कोई मुद्दा नहीं है। – rick

3

PHP.net दस्तावेज़ीकरण से।

नोट: यह ध्यान देने योग्य है कि मेल() फ़ंक्शन एक लूप में ईमेल की बड़ी मात्रा के लिए उपयुक्त नहीं है। यह फ़ंक्शन प्रत्येक ईमेल के लिए एक SMTP सॉकेट खोलता है और बंद करता है, जो बहुत ही कुशल नहीं है।
बड़ी मात्रा में ईमेल भेजने के लिए, PEAR::Mail, और »PEAR::Mail_Queue पैकेज देखें।

ज़ेंड मेल क्लास शायद बहुत अच्छा है (ज़ेंड की अधिकांश चीज़ें अच्छी है) लेकिन यदि आप अन्य विकल्प चाहते हैं। वे यहाँ हैं।

+0

पीएआर :: मेल मेरे अनुभव में धीमा है। PHPMailer और स्विफ्टमेलर उत्कृष्ट हैं। – rick

2

आपको हजारों प्राप्तकर्ताओं में PHP का उपयोग करके ठीक होना चाहिए, हालांकि मेल() से बचें क्योंकि दूसरों ने नोट किया है। मैंने मानक मेलिंग कार्यों को बाईपास करने और एमटीए के साथ अधिक सीधे काम करने की कोशिश करने के लिए बड़ी मात्रा में मेल (100,000+ प्राप्तकर्ता) के लिए तैयार की गई कुछ प्रणालियों को देखा है। फिर भी यह मेरे लिए स्पष्ट नहीं है कि आवश्यक था।

ईमेल पेशेवर बनाना यह सुनिश्चित करने के बारे में अधिक है कि स्वरूपण अच्छा है (एचटीएमएल और सादा पाठ जब भी संभव हो), लोग आसानी से सदस्यता रद्द कर सकते हैं, बाउंस सही ढंग से संभाले जा रहे हैं, मेल सर्वर के पास सभी सही DNS रिकॉर्ड्स मौजूद हैं, और सर्वर कॉन्फ़िगरेशन किसी भी प्रमुख ब्लैकलिस्ट सिस्टम के नियमों का उल्लंघन नहीं करता है। जिस भाषा में आप आवेदन लिखते हैं वह कुछ सौ या यहां तक ​​कि कुछ हज़ार संदेशों में एक प्रमुख कारक नहीं है।

18

नोट: जब मैंने पहली बार अपना प्रश्न पढ़ा, तो मैंने सोचा कि यह एक बार में सैकड़ों हजार ईमेल कहता है। जब मैंने दोबारा जांच की, मैंने देखा कि वास्तव में यह सैकड़ों से हजारों लोगों ने कहा था। मैं अब अपनी पोस्ट को बदलने के लिए बहुत आलसी हूं, इसलिए यहां कुछ चेतावनी दी गई हैं: मेरे अनुभव से, आप शायद वाणिज्यिक उपकरण के बिना लगभग 40 के लिए ठीक चल सकते हैं। जब आप बड़ी सूची आकार तक पहुंचना शुरू करते हैं तो लगभग 10K पर आप प्रमुख दर्द को रोकने के लिए 'न्यूनतम' सूची का पालन करना चाहेंगे। हालांकि मैं इसे तुरंत लागू करने की सलाह देता हूं।

मैं इस से पहले कहा है, ई-मेल भेजने के लिए दोनों पक्षों ने देखते हैं:

  1. तकनीकी पक्ष - मूल रूप से आरएफसी smtp प्रोटोकॉल के आसपास के सभी , ईमेल प्रारूपों, डीएनएस रिकॉर्ड, आदि यह हल्के से जटिल लेकिन हल करने योग्य है।
  2. जादुई पक्ष - ईमेल वितरण प्रबंधन वूडू है। आपको निराश हो जाएगा, चीजें स्पष्ट कारण के लिए टूट जाएंगी और आप एक और नौकरी छोड़ने पर विचार करें जिसमें ईमेल शामिल नहीं है।

मैं आपके स्वयं के थोक प्रेषक को लिखने की सलाह नहीं देता हूं। मुझे यकीन है कि PHP एक अच्छी नौकरी कर सकता है, लेकिन आपको शायद अपना समय कहीं और खर्च करना चाहिए। अतीत में उपयोग किए गए दो उत्पादों और अनुशंसा स्ट्रॉन्गमेल और पावरएमटीए हैं। चेतावनी दीजिये - उनके पास एक उच्च मूल्य टैग है, लेकिन मैं लगभग गारंटी दे सकता हूं कि आप लंबे समय तक अपना स्वयं का समाधान तैयार करेंगे।

एक क्षेत्र जिसे आप PHP में लिखने के साथ नाखुश हो जाएंगे वह थ्रॉटलिंग/टैर पिटिंग है। आपको धीमा करने और स्पैमिंग से रोकने के लिए कुछ संदेश भेजे जाने के बाद मेल सर्वर नींद (30) में जोड़ना शुरू कर देंगे।

आमतौर पर, ये वाणिज्यिक थोक प्रेषक क्यूईई के लिए एसएमटीपी प्रोटोकॉल चलाते हैं। आप Zend_Mail का उपयोग करना जारी रखेंगे, लेकिन यह आपके सर्वर से कनेक्ट करने के लिए हार्ड कोड है। यह मेल जितनी जल्दी हो सके उतनी जल्दी कतारबद्ध करेगा, फिर मेल को अपने गंतव्यों पर भेजने के लिए अपने इंजन का उपयोग करें।

एक 100 के सूची में, आपको ईमेल सर्वोत्तम प्रथाओं को नियोजित करना होगा। कम से कम, आप की आवश्यकता होगी:

  • एसपीएफ़ रिकॉर्ड्स, संभवतः DKIM रूप में अच्छी तरह से अधिक यातायात के खण्ड
  • एकाधिक आईपी - राशि 3 आईपी के, गुणवत्ता का पता तुम पर भरोसा है, मध्यम जोखिम आईपी पतों के लिए एक के लिए एक और एक उच्च जोखिम आईपी पते के लिए। यह डिज़ाइन आपके सर्वोत्तम ग्राहकों को मेल प्राप्त करने के जोखिम को कम करने में मदद करता है।
  • आईपी भेजने के लिए उचित रिवर्स DNS के पते
  • प्रतिक्रिया और स्पैम शिकायतों की प्रक्रिया
  • सदस्यता समाप्त करने के लिए एओएल, हॉटमेल, याहू से लूप दूसरों का उपयोग करें और प्रबंधन उछाल - सुनिश्चित करें कि आप इन पतों
  • होने प्रूनिंग कर रहे हैं खुली/क्लिक ट्रैकिंग भी महत्वपूर्ण है - यदि आप ए सूची में ग्राहक हैं तो अपने ईमेल नहीं खोल रहे हैं, तो आपको उन्हें बी सूची में और फिर आगे बढ़ाना होगा। यह महत्वपूर्ण है क्योंकि आईएसपी निष्क्रिय खातों को हनीपॉट में बदल देगा। हॉटमेल इस के लिए प्रसिद्ध है।

अंत में, यदि आप ईमेल भेजने के बारे में वास्तव में गंभीर हैं, तो आप रिटर्न पथ जैसे कुछ अन्य टूल चाहते हैं।

+0

आप अपनी सामग्री जानते हैं। दुर्भाग्य से, आपका जवाब जबरदस्त है। ज़ेंड मेल के साथ स्ट्रॉन्गमेल या पावरएमटीए का उपयोग कैसे किया जाएगा और आपके द्वारा सूचीबद्ध सभी बुलेट पॉइंट्स को कवर किया जाएगा? – rick

+0

आप स्ट्रॉन्गमेल के साथ एप्लिकेशन को जोड़ सकते हैं, जब मैं डेटा स्टोरेज पर मेरा मतलब कहता हूं, इसका मतलब है कि आपको कोड की किसी भी लाइन को लागू करने की आवश्यकता नहीं है, तो आप केवल अपने उपयोगकर्ता विवरण स्ट्रॉन्गमेल सर्वर के साथ साझा करें और लाखों ईमेल भेजें:) – vaske

2

मैंने PHP में एक थोक मेलर लागू किया जहां प्रत्येक ईमेल को किसी व्यक्ति को अनुकूलित किया गया था। यह मुश्किल नहीं था और बहुत लंबा नहीं लगा। मैंने swiftmailer और क्रॉन का इस्तेमाल किया। ज़ेंड मेल भी ठीक हो सकता है। मैंने पियर मेल कतार के साथ शुरुआत की, लेकिन ईमेल कतार में बहुत धीमी थी।

ईमेल कतार की प्रक्रिया इतनी तरह से चला गया:

  1. ईमेल टेम्पलेट बनाएँ और प्लेसहोल्डर जोड़ने (या एक टेम्पलेट इंजन का उपयोग) ऐसे क्षेत्र हैं जहां अद्वितीय सामग्री प्रतिस्थापित किया जाएगा।
  2. एक लूप में, किसी भी अद्वितीय सामग्री के साथ प्लेसहोल्डर विकल्प, परिणामस्वरूप ईमेल सामग्री, विषय, पते, बैच आईडी, और वैकल्पिक रूप से डेटाबेस तालिका में प्राथमिकता मान डालें।

मैंने ईमेल के बैच भेजने के लिए क्रॉन नौकरी का उपयोग किया। क्रॉन समय अंतराल और प्रति बैच भेजे गए ईमेल की संख्या महत्वपूर्ण थी क्योंकि मैं सीमा के साथ साझा मेजबान पर था। क्रॉन नौकरी द्वारा बुलाया गया स्क्रिप्ट केवल क्रॉन द्वारा ही पहुंचा जा सकता था। स्क्रिप्ट बैच आईडी द्वारा आदेशित तालिका से ईमेल की संख्या x और वैकल्पिक रूप से प्राथमिकता को पढ़ती है। यदि कोई ईमेल सफलतापूर्वक भेजा गया था, तो इसे डेटाबेस कतार से हटा दिया गया था। अगर कोई ईमेल नहीं भेजा जा सका, तो यह कतार में रहा और उस रिकॉर्ड के लिए एक काउंटर बढ़ाया गया। यदि काउंटर एक सेट नंबर पर था, तो कतार से ईमेल हटा दिया गया था।

+0

PEAR_Mail के साथ कतार में तेजी लाने के लिए कुछ उपयोगी टिप्स * _seq MySQL में एक मेमोरी टेबल बनाते हैं। मैंने इसे प्रति 100 प्रविष्टियों के लेनदेन में भी लपेट लिया –

0

मैंने Swiftmailer के साथ एक न्यूजलेटर प्रबंधन प्रणाली विकसित की है और इसे कार्यान्वित करना बहुत आसान है। यह एसएमटीपी, एन्क्रिप्शन, अनुलग्नक, बैच भेजता है, ...

3

एस्क्रोनस पृष्ठभूमि प्रक्रिया के लिए कतार में ईमेल रखने के लिए Zend_Queue का उपयोग करें। पृष्ठभूमि में कतार को संसाधित करने के लिए आपको क्रॉन नौकरी की आवश्यकता होगी।

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); 

} 
क्रॉन जॉब के लिए

फिर, जैसे

<?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 
संबंधित मुद्दे

 संबंधित मुद्दे