2010-04-18 15 views
14

कई, गतिशील ActionMailer/रूबी का उपयोग कर smtp ईमेल भेजने के लिये मैं इस पोस्ट देखा था, लेकिन मेरा थोड़ा अलग है:कैसे ऑन रेल्स

Rails ActionMailer with multiple SMTP servers

मैं उपयोगकर्ताओं को अपने स्वयं एसएमटीपी क्रेडेंशियल्स का उपयोग मेल भेजने के लिए अनुमति देता है कर रहा हूँ तो यह वास्तव में उनसे आता है।

लेकिन उन्हें रेल ऐप से भेजा जाएगा, इसलिए इसका मतलब है कि प्रत्येक उपयोगकर्ता के लिए मुझे अपने ईमेल अपने स्वयं के एसएमटीपी सर्वर का उपयोग करके भेजना होगा।

मैं यह कैसे कर सकता हूं?

+1

कृपया मदद इस मिल पीआर रेल में विलय (https://github.com/rails/rails/pull/7397) यह वही करता है जो आप आसानी से सोच रहे हैं। –

उत्तर

3

बस प्रत्येक प्रेषण कार्रवाई से पहले ActionMailer :: बेस कॉन्फ़िगरेशन मान सेट करें।

smtp_config = user.smtp_configuration 

ActionMailer::Base.username = smtp_config.username 
ActionMailer::Base.password = smtp_config.password 
ActionMailer::Base.server = .. 
ActionMailer::Base.port = .. 
ActionMailer::Base.authentication = .. 
+0

मैं यह कैसे कर सकता हूं? एक्शनमेलर कॉन्फ़िगरेशन कॉन्फ़िगरेशन फ़ाइल में हैं ... smtp_config नामक स्थानीय चर बनाना और फिर संबंधित विधियों को पास करना? – Angela

+2

एसओ ने अभी अपना पिछला जवाब खो दिया है, इसलिए एक छोटे से नोट के साथ फिर कोशिश कर रहा है। आप केवल उन कॉल में एक्शनमेलर क्लास चर सेट कर रहे हैं। आमतौर पर उन्हें कॉन्फ़िगरेशन में परिभाषित किया जाता है, लेकिन आप उन्हें कभी भी बदल सकते हैं। आपके मामले में आप उन्हें प्रत्येक एक्शनमेलर बाल वर्ग की delivery_XXX विधि से पहले सेट करना चाहते हैं जिसे आपको कॉल करने की आवश्यकता है। – simianarmy

+2

jcalvert का जवाब इसे करने का सही तरीका है। –

55

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

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

msg = MyMailer.some_message 
msg.delivery_method.settings.merge!(@user.mail_settings) 
msg.deliver 

ऊपर mail_settings में जहां उपयुक्त कुंजी के साथ कुछ हैश रिटर्न IE

{:user_name=>username, :password=>password} 
+0

कुछ मामलों में एक्शनमेलर इंटरसेप्टर (डिलीवरी_मेल) इसका उपयोगी हो सकता है। –

+6

कृपया इस पीआर को रेल में विलय करने में मदद करें। (https://github.com/rails/rails/pull/7397) यह वही करता है जो ओपी आसानी से सोच रहा है। –

+6

@ आदित्यसंघी द्वारा उल्लिखित पुल अनुरोध रेल 4+ में विलय कर दिया गया था लेकिन पिछले संस्करणों में इसे पैच नहीं किया जाएगा। – plainjimbo

12

यहाँ एक समाधान है कि मैं पिछले जवाब और टिप्पणियों के आधार पर के साथ आया है। यह ActionMailer interceptor class का उपयोग करता है।

class UserMailer < ActionMailer::Base 
    default from: proc{ @user.mail_settings[:from_address] }  

    class DynamicSettingsInterceptor 
    def self.delivering_email(message) 
     message.delivery_method.settings.merge!(@user.mail_settings) 
    end 
    end 
    register_interceptor DynamicSettingsInterceptor 
end 
+0

यह एक आदर्श समाधान है और रेल 3 में अच्छी तरह से काम करता है। –

9

रेल 3.2.x

के लिए आप अपने मेलर कक्षा में AbstractController :: कॉलबैक शामिल कर सकते हैं और एक "after_filter: set_delivery_options" कर मेलर के अंदर।

set_delivery_options विधि आपके मेलर एक्शन में आपके द्वारा इंस्टेंस चर सेट अप तक पहुंच होगी और आप मेल ऑब्जेक्ट को "संदेश" के रूप में एक्सेस कर सकते हैं।

class MyNailer < ActionMailer::Base 
    include AbstractController::Callbacks 
    after_filter :set_delivery_options 

    def nail_it(user) 
    @user = user 
    mail :subject => "you nailed it" 
    end 

    private 

    def set_delivery_options 
    message.delivery_method.settings.merge!(@user.company.smtp_creds) 
    end 
end 
3

मामले में किसी को smtp पहचान के साथ गतिशील रूप से एक साथ वितरण पद्धति सेट करने की जरूरत है, यू तो मेरे addapted Aditya Sanghi संस्करण है यह चर के साथ एक साथ वितरण पद्धति सेट करने Mail::Message instance method उपयोग कर सकते हैं:

class MainMailer < ActionMailer::Base 
    WHATEVER_CONDITION = true # example only f.e. @ser 

    include AbstractController::Callbacks 
    after_filter :set_delivery_options 

    private 
    def set_delivery_options 
    settings = { 
    :address => 'smtp.mandrillapp.com', # intentionally 
    :port => 587, # intentionally 
    :domain => 'your_domain', #insetad of localhost.localdomain' 
    :user_name => 'smtp_username', 
    :password => 'smtp_password', 
    :authentication => 'PLAIN' # or smthing else 
} 
    if WHATEVER_CONDITION 
     message.delivery_method(:smtp, settings) 
    end 
    end 
end 
+0

WHATEVER_CONDITION कक्षा निरंतर है, तो, आपको इसका उपयोग करने की आवश्यकता क्यों है? – danmaz74

+0

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

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