2011-07-04 5 views
10

के दौरान रेल में मेल डिलीवरी विधि स्विच करें, मैं रेल अनुप्रयोग स्थापित करने की कोशिश कर रहा हूं ताकि मैं कुछ मेल डिलीवरी विधियों के बीच चयन कर सकूं कि कुछ शर्त सही है या नहीं।रनटाइम

तो, दिए गए दो वितरण विधियों:

ActionMailer::Base.add_delivery_method :foo 
ActionMailer::Base.add_delivery_method :bar 

मैंने सोचा कि मैं सिर्फ इस तरह कुछ करने के लिए एक ईमेल इंटरसेप्टर बनाने में सक्षम हो जाएगा:

class DeliveryMethodChooser 
    def self.delivering_email(message) 
    if some_condition 
     # code to use mail delivery method foo 
    else 
     # code to use mail delivery method bar 
    end 
    end 
end 

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

+0

क्या दो वितरण विधियों आप चाहते हैं कर रहे हैं? – s84

+0

मुझे वास्तव में यह नहीं पता कि यह प्रश्न के लिए प्रासंगिक है, लेकिन उनमें से एक है: प्रेषक के माध्यम से smtp और दूसरा अमेज़ॅन एसईएस (मेलचंप एसटीएस के साथ) का उपयोग करेगा। – Frost

उत्तर

7

तो, यह पता चला है कि आप वास्तव में को ActionMailer पर डिफ़ॉल्ट पैरामीटर के रूप में पास कर सकते हैं।

ऐसा करना इसलिए पूरी तरह से संभव है:

class SomeMailer < ActiveMailer::Base 
    default :delivery_method => Proc.new { some_condition ? :foo : :bar } 
end 

मुझे यकीन है कि मैं वास्तव में यकीन है कि मैं इस समाधान को पसंद नहीं कर रहा हूँ, लेकिन यह कुछ समय के लिए काम करता है और यह केवल की एक अपेक्षाकृत कम राशि के लिए किया जाएगा पहर। साथ ही DELIVERY_METHOD मेल विधि करने के लिए विकल्प:

+0

रेल में काम नहीं कर रहा है 4.1.4 – user1735921

14

आप एक पारित कर सकते हैं

def notification 
    mail(:from => '[email protected]',   
     :to => '[email protected]', 
     :subject => 'Subject', 
     :delivery_method => some_condition ? :foo : :bar) 
end 
+0

हां, निश्चित रूप से आप यह कर सकते हैं, क्योंकि आप 'डिफ़ॉल्ट' विधि का उपयोग करके एक डिफ़ॉल्ट वितरण विधि सेट कर सकते हैं, जिसे मैंने अपने उत्तर में समझाया था। – Frost

2

ध्यान दें कि आप भी आवेदन के विन्यास को खोल सकते हैं गतिशील वितरण पद्धति को बदलने के लिए आवेदन चौड़ा:

SomeRailsApplication::Application.configure do 
    config.action_mailer.delivery_method = :file 
end 

यह db/seeds.rb में उपयोगी हो सकता है यदि आप खाता निर्माण पर खाता पुष्टिकरण ईमेल भेजते हैं, उदाहरण के लिए।

+2

हालांकि यह वास्तव में उपयोग की जाने वाली विधि को बदलने में प्रतीत नहीं होता है। यह Rails.application.config.action_mailer.delivery_method के माध्यम से नई विधि की रिपोर्ट करेगा - लेकिन फिर भी पुराने (मेरे लिए कम से कम) का उपयोग करें – Kevin

+0

मेरे लिए भी काम नहीं कर रहा है। – abhishek77in

3

आप एक अलग ActionMailer उपवर्ग DELIVERY_METHOD + इस तरह smtp_settings बना सकते हैं और बदल सकते हैं:

class BulkMailer < ActionMailer::Base 
    self.delivery_method = Rails.env.production? ? :smtp : :test 
    self.smtp_settings = { 
    address: ENV['OTHER_SMTP_SERVER'], 
    port:  ENV['OTHER_SMTP_PORT'], 
    user_name: ENV['OTHER_SMTP_LOGIN'], 
    password: ENV['OTHER_SMTP_PASSWORD'] 
    } 

    # Emails below will use the delivery_method and smtp_settings defined above instead of the defaults in production.rb 

    def some_email user_id 
    @user = User.find(user_id) 
    mail to: @user.email, subject: "Hello #{@user.name}" 
    end 
end