過去 3 日間、多くの時間を費やしてきた 2 つの問題があります。ここで私を助けてくれた経験豊富なコーダーに本当に感謝しています。
User
登録コントローラーからDevise invitableを使って確認メールを送るモデルがあります。
User.invite!({:email => email, ...)
今、私はこれらの設定を持っています
config/environments/development.rb 内
config.action_mailer.delivery_method = :smtp
config.action_mailer.raise_delivery_errors = true
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
config.action_mailer.perform_deliveries = true
config.action_mailer.smtp_settings = {
address: 'mail.myapp.com',
port: 26,
domain: 'myapp.com',
user_name: 'notifications@myapp.com',
password: 'xxxx',
authentication: 'plain',
enable_starttls_auto: true,
openssl_verify_mode: 'none'
}
およびconfig/devise.rb
config.mailer_sender = 'notifications@myapp.com'
このメールは、デバッグ出力に「Sent email to ...」と表示されてからちょうど 20 分後に配信されます。
今、私はカスタム NotificationsMailer をコード内の他の場所でも使用しています。ここでは、デバイス ベースの登録プロセス以外の通知メールを送信しています。上記と同じ設定を入力しましたがconfig/initializers/setup_mail.rb
、この場合、メールは瞬時に配信されます。この遅延はなぜですか?
質問/疑問 #2 メール送信の配信プロセスを傍受できれば、ログを介して Mail::Message オブジェクトをチェックし、後で Sidekiq を使用して処理する非同期の方法を開発できると考えました。
そのため、config/application.rbで
ActionMailer::Base.add_delivery_method :queued, :QueuedDelivery
config/environments/development.rb 内
config.action_mailer.delivery_method = :queued
lib/queued_delivery.rb内
class QueuedDelivery
def deliver!(mail)
logger.debug "mail object string rep: #{mail.to_s}"
logger.debug "mail object settings: #{mail.deliver_method.settings}"
end
end
配信方法を変更したにもかかわらず、Devise がいつものように 20 分遅れてメールを送信し、上記のデバッグ レベルのログが表示されないのは奇妙です。
Devise はどのようにこれらのメールを送信していますか?! devise gemをチェックインdevise_mail()
したところ、このコードが finally で使用されていますmail headers_for(action, opts)
。ここで何が起こっているのですか?