0

私たちは現在、ユーザーがお互いの実際のメール アドレスを見なくても (ダブル ブラインド)、メールを送信できるようにしてusername@parse.example.comいます。

class ForwardsMailbox < ApplicationMailbox
  before_processing :ensure_users
 
  def process
    content = mail.multipart? ? mail.parts.first.body.decoded : mail.decoded
    UserMailer.with(sender: sender, recipient: recipient, subject: mail.subject, content: content).forward_email.deliver_later
  end
 
  private 
  def sender
    @sender ||= User.find_by(email: mail.from.first)
  end
  def recipient
    @recipient ||= User.find_by(username: mail.to.first.split('@').first)
  end
  def ensure_users
    bounce_with UserMailer.invalid_user(inbound_email) if sender.nil? or recipient.nil?
  end
end

mailオブジェクトの内容を抽出したり、マルチパートかどうかを確認したりする代わりに、オブジェクト全体を転送することは可能ですか?

4

1 に答える 1

2

これを試してみてください。メソッドでメール オブジェクトを再利用しprocess、メッセージを自分で直接配信します。配信方法を正しく構成するには、ActionMailer にアクセスする必要がありますが、うまくいくと思います。

def process
  mail.to = sender.email
  mail.from = recipient...
  ActionMailer::Base.wrap_delivery_behavior(mail) # this sets delivery to use what we specified in our rails config.
  mail.deliver # This delivers our email to the smtp server / API
end

仕組み:

舞台裏では、メーラーはオブジェクトを呼び出しdeliverMailメールを送信しているだけです。ActionMailer::MessageDelivery実際にそれを見たい場合は、熟読することができます。ここではその機能を直接使用しているだけです。

元のメール オブジェクトからすべてのフィールドをメーラーのメール オブジェクトにコピーするには多くの試行錯誤が必要になるため、この場合はメーラーを使用しないことをお勧めします。

注意すべきことの 1 つは、メッセージが再配信されても​​ヘッダーは変更されないため、次のようなものMessage-IDは同じままです (これは問題になる場合とそうでない場合がありますが、考慮すべき点です)。

deliver最後に、私のように API/SMTP サーバーへの呼び出しがブロックされることを心配している場合でも、心配はいりません。ActionMailbox はメソッドが ActiveJob 経由で実行されることを既に保証しているように見えるprocessため、SMTP/API リクエストに時間がかかったり、Web リクエストがブロックされたりすることを心配する必要はありません ( ActionMailbox ガイドを参照)。

于 2020-09-30T20:19:44.223 に答える