19 Stimmen

Wie man E-Mails mit mehreren, dynamischen smtp mit Actionmailer/Ruby on Rails versendet

Ich habe diesen Beitrag gesehen, aber meiner ist etwas anders:

Rails ActionMailer mit mehreren SMTP-Servern

Ich erlaube den Benutzern, E-Mails mit ihren eigenen SMTP-Zugangsdaten zu senden, damit sie tatsächlich von ihnen stammen.

Aber sie werden von der Rails-App gesendet werden, so dass bedeutet, dass für jeden Benutzer, den ich ihre E-Mails mit ihren eigenen SMTP-Server senden müssen.

Wie kann ich das tun?

65voto

jcalvert Punkte 3488

Das, was in der anderen Antwort beschrieben wird, ist nicht sicher; Sie setzen hier Klassenvariablen, keine instanzierten Variablen. Wenn Ihr Rails-Container forking ist, können Sie dies tun, aber jetzt ist Ihre Anwendung abhängig von einem Implementierungsdetail des Containers. Wenn Sie keinen neuen Ruby-Prozess forken, dann kann es hier zu einer Race Condition kommen.

Sie sollten ein Modell haben, das ActionMailer::Base erweitert, und wenn Sie eine Methode aufrufen, wird diese ein Mail::Message-Objekt zurückgeben. Das ist Ihr Instanzobjekt, in dem Sie Ihre Einstellungen ändern sollten. Die Einstellungen sind auch nur ein Hash, so dass Sie sie einbinden können.

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

Wo in der obigen mail_settings gibt einige Hash mit entsprechenden Schlüssel IE

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

14voto

Mitch Punkte 1475

Hier ist eine Lösung, die ich auf der Grundlage der bisherigen Antworten und Kommentare gefunden habe. Sie verwendet eine ActionMailer Abfangjäger-Klasse .

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

9voto

Aditya Sanghi Punkte 13242

Für Rails 3.2.x

Sie können AbstractController::Callbacks in Ihre Mailer-Klasse einbinden und einen "after_filter :set_delivery_options" innerhalb des Mailers ausführen.

Die set_delivery_options-Methode hätte Zugriff auf Instanzvariablen, die Sie in Ihrer Mailer-Aktion eingerichtet haben, und Sie können auf das Mail-Objekt als "message" zugreifen.

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

7voto

Sandro L Punkte 1072

Seit Rails 4+ funktioniert es, die Anmeldedaten direkt über die Zustellungsmethode_Optionen Parameter:

class UserMailer < ApplicationMailer
  def welcome_email
    @user = params[:user]
    @url  = user_url(@user)
    delivery_options = { user_name: params[:company].smtp_user,
                         password: params[:company].smtp_password,
                         address: params[:company].smtp_host }
    mail(to: @user.email,
         subject: "Please see the Terms and Conditions attached",
         delivery_method_options: delivery_options)
  end
end

Siehe Versenden von E-Mails mit dynamischen Zustelloptionen (Rails Guides)

3voto

simianarmy Punkte 1445

Setzen Sie einfach die ActionMailer::Base Konfigurationswerte vor jeder Sendeaktion.

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 = ..

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X