2010-12-21 9 views
5

मैं रेलवे के साथ देरी_बॉज का उपयोग करके देरी मेल भेजने का तरीका जानने का प्रयास कर रहा हूं। मैंने व्यवहार्य संभावनाओं के हर संयोजन को काफी कोशिश की है जिसे मैं सोच सकता हूं - मैं पृष्ठभूमि में चलाने के लिए मेल प्राप्त कर सकता हूं, मैं इसे भविष्य के समय में भेजने में देरी नहीं कर सकता। DB में delayed_jobs तालिका कार्य, लॉग 'भेजा' कहते हैं साफ करता है, delayed_job कार्य प्रोसेसर कार्य & विफलता के बिना भेजा कहते हैं ऊपर उठाता है ... लेकिन मेल या तो है:रेल 3/देरी_बॉब - वॉन्टेड: देरी मेल का मूल उदाहरण

  • तुरंत भेजा, या

यदि मैं भविष्य में भेजने की कोशिश करता हूं तो बस नहीं पहुंचता है।

यदि कोई रेल की बेयर-हड्डियों का उदाहरण दे सकता है तो 3 देरी_बॉज जो भविष्य में मेल भेजता है, मैं वास्तव में सराहना करता हूं। मुझे यकीन है कि बहुत सारे लोग ऐसा करते हैं इसलिए मुझे संदेह है कि मुझे कुछ स्पष्ट याद आ रही है। (अनगिनत का) संयोजन एक मैं नीचे की कोशिश की है:

delayed_job: 2.1.2 रेल: 3.0.3 ActionMailer: 3.0.3

नियंत्रक:

class TestmailerController < ApplicationController 
    def index 
    Testmailer.delay.test_mail 
    end 

end 

मेलर:

class Testmailer < ActionMailer::Base 
    def test_mail 
    mail(:to => '([email protected]', :from => '(removedforprivacy)@gmail.com', :subject => 'Testing Delayed Job', :content_type => 'text/plain').deliver 
    end 
    handle_asynchronously :test_mail, :run_at => Proc.new { 2.minutes.from_now } 


end 

config/वातावरण/development.rb के प्रासंगिक मेल हिस्सा:

# Don't care if the mailer can't send 
    config.action_mailer.raise_delivery_errors = true 

    # Print deprecation notices to the Rails logger 
    config.active_support.deprecation = :log 

    config.action_mailer.default_url_options = { :host => 'localhost:3000' } 

    ActionMailer::Base.smtp_settings = { 
    :address => "smtp.gmail.com", 
    :port => 587, 
    :domain => "gmail.com", 
    :user_name => "(removedforprivacy)", 
    :password => "(removedforprivacy)", 
    :authentication => "plain", 
    :enable_starttls_auto => true 
    } 

नौकरी आदेश:

rake jobs:work 

उत्तर

13

मैं एंड्रिया के साथ सहमत - मैं इस सटीक समस्या हो रही थी, और mysql के लिए SQLite से अपने स्थानीय विकास डेटाबेस स्विच करने के बाद, मैं की तरह

Emailer.delay({:run_at => 5.minutes.from_now}).welcome(@user) 

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

+0

क्या आप जानते हैं कि देरी विधि के बिना इसे कैसे पूरा किया जाए। मैं handle_async ... विधि का उपयोग करना चाहता हूँ। मुझे सभी कॉलर्स बदलने के बजाय, सभी बुलाए गए स्थानों में देरी करने में सक्षम होना पसंद है। – baash05

1

दोनों .delay पद्धति का उपयोग करके और handle_asynchronously :test_mail की स्थापना अनावश्यक है। अपने कोड से .delay विधि को हटाने का प्रयास करें। बस

Testmailer.test_mail # without .deliver due to a delayed_job issue 

का उपयोग हालांकि, मैं अपने विन्यास पर कुछ परीक्षण भाग गया और जब SQLite, run_at बस नजरअंदाज कर दिया है (पता नहीं क्यों) का उपयोग कर, लेकिन जब का उपयोग कर mysql2 सब कुछ ठीक काम करता है।

1

मै मैंडोइड के साथ रेल 3 में पाया गया है कि हैंडल_एसिंक्रोनस लाइन को हटाने से यह काम पर आता है। मुझे सभी प्रकार की समस्याएं थीं, और ऐसा लगता है कि देरी_job मेरे ईमेलर वर्ग के भीतर किसी ऑब्जेक्ट को पहचान नहीं रहा था। Handle_asynchronously इसे ठीक से हटा रहा है।

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