7

Notifier モデル (20 件以上のメール) ですべてのメールに 1 つのレイアウトを使用していますが、レイアウトや HTML をまったく使用せずにプレーン テキストのメールを送信したい場合があります。私はどうやって理解することができないようですか?プレーン テキストのメールを送信しようとしても、メール内のレイアウトとすべての HTML が取得されます。

Rails 2.3.8 を使用しています。

ここでこのモンキーパッチについて読みました...しかし、レールの新しいバージョンがこれを克服したことを示しているように見えましたか? そして、モンキーパッチを回避できるのであれば、モンキーパッチは本当にしたくありません。

Rails - メーラー テンプレートを使用してマルチパート メールの複数のレイアウトを設定する

  layout "email" # use email.text.(html|plain).erb as the layout


  def welcome_email(property)
    subject    'New Signup'
    recipients property.email
    from       'welcome@test.com'
    body       :property => property
    content_type "text/html"
  end

  def send_inquiry(inquire)
    subject    "#{inquire.the_subject}"
    recipients inquire.ob.email
    from       "Test on behalf of #{inquire.name} <#{inquire.email}>"
    body       :inquire => inquire
    content_type "text/plain"

  end

私も2つのファイルを持っています。

email.text.html.erb
email.text.plain.erb

content_type が「text/plain」であっても、常に text.html.erb を使用します...

4

3 に答える 3

9

編集: レイアウトは、電子メール テンプレートとは異なる命名規則に従います。次のように名前を変更するだけです。

layout.text.html.erb    => layout.html.erb
layout.text.plain.erb   => layout.text.erb

これを使用する場合、パーツを手動で定義するという間違いも犯しました:

part :content_type => 'text/plain',
     :body => render_message('my_template')

その場合、Rails はパーツの content_type を判別できず、それが HTML であると想定します。

これら2つのことを変更した後、うまくいきました!

元の返信が続きます..


私は過去に何度もこの質問に苦労してきました. この問題を抱えているのは私だけだといつも思っていました。なぜなら、Google はこの問題に関して何の役にも立たないからです。

今回はそれを理解するために Rails を掘り下げることにしましたが、これまでのところあまり成功していませんが、おそらく私の発見は他の誰かがこれを理解するのに役立つでしょう.

私が見つけたのは、ActionMailer::Base では #render_message メソッドが適切な content_type を決定する役割を担っており、それを @current_template_content_type に割り当てる必要があるということです。#default_template_format はレイアウトの適切な MIME タイプを返すか、@current_template_content_type が設定されていない場合はデフォルトで :html になります。

これは、私のアプリで ActionMailer::Base#render_message がどのように見えるかです (2.3.5)

  def render_message(method_name, body)
    if method_name.respond_to?(:content_type)
      @current_template_content_type = method_name.content_type
    end
    render :file => method_name, :body => body
  ensure
    @current_template_content_type = nil
  end

問題は、method_name が文字列 (ローカル ビューの名前、私の場合は "new_password.text.html") のように見え、もちろん文字列が #content_type に応答しないことです。これは、@current_template_content_type が常に nil のままであることを意味します。 #default_template_format のデフォルトは常に :html です。

実際の解決策にはほど遠いことはわかっています。ActionMailer の内部は、私には不透明すぎます。

于 2010-09-14T14:10:16.313 に答える
5

OK、これが機能するかどうかはわかりませんが、デフォルトの content_type は text/plain のようです。したがって、text/plain 以外のものが必要な場合にのみコンテンツ タイプを設定する必要があります。

これを試して:

def send_inquiry(inquire)
  subject    "#{inquire.the_subject}"
  recipients inquire.ob.email
  from       "Test on behalf of #{inquire.name} <#{inquire.email}>"
  body       :inquire => inquire
end

私はまだあなたがこれを考慮する必要があると思います:

layout "email", :except => [:send_inquiry]

プレーンテキストの電子メールには「レイアウト」がなく、送信したい実際のコンテンツのみがあるように見えるため、上記を使用します。

于 2010-09-10T16:08:35.570 に答える
0

これは便利だなと思いました。

http://blog.blazingcloud.net/2009/11/17/simple-email-form-with-actionmailer/

彼は、さまざまなコンテンツ タイプのビュー テンプレートの名前を変更することを利用しています。

于 2012-05-24T11:13:45.797 に答える