2011-07-04 41 views
10

Tôi đang cố thiết lập ứng dụng đường ray để tôi có thể chọn giữa các phương thức gửi thư khác nhau tùy thuộc vào việc một số điều kiện có đúng hay không.chuyển đổi phương thức gửi thư trong đường ray trong thời gian chạy

Vì vậy, được đưa ra hai phương pháp phân phối:

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

tôi nghĩ rằng tôi muốn có thể chỉ cần tạo ra một đánh chặn email để làm một cái gì đó như thế này:

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 

Vấn đề mặc dù, là Tôi không chắc chắn làm thế nào để thực sự thiết lập thay đổi phương thức gửi thư được sử dụng cho một thư đã cho. Bất kỳ ý tưởng? Thậm chí có thể tự động chọn phương thức delivery_method để sử dụng không?

+0

gì là hai phương pháp giao hàng bạn muốn? – s84

+0

Tôi không thực sự thấy làm thế nào đó là có liên quan đến câu hỏi, nhưng một trong số họ là: smtp qua sendgrid và một trong những khác sẽ được sử dụng Amazon SES (với mailchimp STS). – Frost

Trả lời

7

Vì vậy, nó chỉ ra rằng bạn thực sự có thể vượt qua một Proc làm thông số mặc định cho ActionMailer.

Đó là do đó hoàn toàn có thể làm điều này:

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

Tôi không chắc tôi thực sự chắc chắn tôi thích giải pháp này, nhưng nó hoạt động trong thời gian tới và nó sẽ chỉ cho một số tiền tương đối ngắn thời gian.

+0

không hoạt động trong đường ray 4.1.4 – user1735921

14

Bạn có thể vượt qua một: DELIVERY_METHOD lựa chọn phương pháp email cũng như:

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

Có, tất nhiên bạn có thể làm điều này, vì bạn có thể đặt phương thức phân phối mặc định bằng phương thức 'mặc định', mà tôi đã giải thích trong câu trả lời của mình. – Frost

2

Lưu ý rằng bạn cũng có thể mở ra cấu hình của ứng dụng để tự động thay đổi phương pháp phân phối ứng dụng rộng:

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

Điều này có thể hữu ích trong db/seeds.rb nếu bạn gửi email xác nhận tài khoản khi tạo tài khoản, ví dụ:

+2

Điều này dường như không thực sự thay đổi phương pháp được sử dụng, mặc dù. Nó sẽ báo cáo phương thức mới thông qua Rails.application.config.action_mailer.delivery_method - nhưng sau đó vẫn sử dụng phương thức cũ (ít nhất là đối với tôi) – Kevin

+0

Dường như không hoạt động cho tôi. – abhishek77in

3

Bạn có thể tạo một lớp con ActionMailer riêng biệt và thay đổi DELIVERY_METHOD + smtp_settings như thế này:

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 
Các vấn đề liên quan