11
votes

Méthode de livraison de messagerie commutateur dans les rails pendant l'exécution

J'essaie de configurer une application Rails afin que je puisse choisir entre différentes méthodes de livraison de courrier, selon que certaines conditions soient vraies ou non.

Ainsi, donnée deux méthodes de livraison: P>

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


2 commentaires

Quelles sont les deux méthodes de livraison que vous voulez?


Je ne vois pas vraiment comment cela est pertinent pour la question, mais l'un d'entre eux est: SMTP via SendGrid et l'autre utilisera Amazon SES (avec MailChimp STS).


4 Réponses :


10
votes

Donc, il s'avère que vous pouvez réellement passer un paramètre par défaut code> en tant que paramètre par défaut sur ActionMailer CODE>.

Il est donc pleinement possible de le faire: P >

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


0 commentaires

17
votes

Vous pouvez passer une option: Delivery_Method à la méthode de la messagerie également:

def notification
  mail(:from => 'from@example.com',           
       :to => 'to@example.com', 
       :subject => 'Subject',
       :delivery_method => some_condition ? :foo : :bar)
end


1 commentaires

Oui, bien sûr, vous pouvez le faire, car vous pouvez définir une méthode de livraison par défaut à l'aide de la méthode par défaut , que j'ai expliquée dans ma réponse.



2
votes

Notez que vous pouvez également ouvrir la configuration de l'application pour modifier de manière dynamique l'application de la méthode de livraison: xxx

Ceci peut être utile dans dB / graines.rb Si vous envoyez des courriels de confirmation de compte lors de la création de compte, par exemple.


1 commentaires

Cela ne semble pas changer la méthode utilisée, cependant. Il signalera la nouvelle méthode via des rails.Application.config.action_mailer.delivery_method - mais utilisez toujours l'ancien (au moins pour moi)



4
votes

Vous pouvez créer une sous-classe ActionMailer distincte et modifier la livraison_method + smtp_settings comme ceci:

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


0 commentaires