web-dev-qa-db-ja.com

Railsを使用して電子メールに画像を埋め込む正しい方法は何ですか?

Railsを使用してメールに画像を埋め込む正しい方法は何ですか?

58
Alexey Zakharov

Oksanaからの回答とカスタムヘルパーアプローチを組み合わせて、以下を非常にうまく機能させました。

_app/helpers/email_helper.rb_

_module EmailHelper
  def email_image_tag(image, **options)
    attachments[image] = File.read(Rails.root.join("app/assets/images/#{image}"))
    image_tag attachments[image].url, **options
  end
end
_

_app/mailers/base_mailer.rb_

_class BaseMailer < ActionMailer::Base
  add_template_helper(EmailHelper)
end
_

_app/mailers/my_mailer.rb_

_class MyMailer < BaseMailer

  def send_my_mail(email)  
    mail to: email, subject: "My Subject"
  end
end
_

次に、たとえば、使用する電子メールレイアウトファイルに会社のロゴを添付する場合

_app/views/layouts/email.html.erb_

<%= email_image_tag("company_logo.png") %>


** optionsはタグの拡張性を高めますが、Ruby> = 2でのみ動作します。この作業をRuby <2で行うには、重要なWordオプションを処理する古い方法を使用します。

64
Tyrone Wilson

レール5

メールメソッドで、画像を指すインライン添付ファイルを追加します。

class ConfirmationMailer < ActionMailer::Base
  def confirmation_email
      attachments.inline["logo.png"] = File.read("#{Rails.root}/app/assets/images/logo.png")
      mail(to: email, subject: 'test subject')
  end
end

次に、メールのHTMLビューでimage_tag添付URL付き:

<%= image_tag(attachments['logo.png'].url) %>
35
Joel

Oksanaとtdubsの回答に追加する

Tdubsモジュールはデスクトップ上で動作しますが、モバイルGmailクライアントの場合、画像は添付ファイルとして表示されます。これを修正するには、

app/helpers/email_helper.rb

module EmailHelper
    def email_image_tag(image, **options)
        attachments[image] = {
            :data => File.read(Rails.root.join("app/assets/images/emails/#{image}")),
            :mime_type => "image/png",
            :encoding => "base64"
        }
        image_tag attachments[image].url, **options
    end
end

残りについては、tdubsの回答に従ってください。

21
Pavan Katepalli

多くの調査の後、メールに画像を埋め込む非常にクリーンな方法を見つけました。 production.rbおよびdevelopment.rbに次の行を追加するだけです

config.action_mailer.asset_Host = 'YOUR Host URL'

次のコードを使用して、ビューに画像を埋め込みます。

<%= image_tag('My Web Site Logo.png') %>

注:YOURホストURLおよびMy Web Site Logo.png上記のコード。

Action Mailerの基本的な使用方法の詳細については、 ActionMailer :: Base を参照してください。

14
Aamir

ここから貼り付けたコピー

http://api.rubyonrails.org/classes/ActionMailer/Base.html#class-ActionMailer::Base-label-Inline+Attachments

インライン添付

ファイルを他のHTMLとインラインで表示するように指定することもできます。これは、会社のロゴや写真を表示する場合に便利です。

    class Notifier < ApplicationMailer
      def welcome(recipient)
       attachments.inline['photo.png'] = File.read('path/to/photo.png')
       mail(to: recipient, subject: "Here is what we look like")
     end
   end

ビューで画像を参照するには、welcome.html.erbファイルを作成し、表示する添付ファイルを渡すimage_tagを呼び出してから、添付ファイルのurlを呼び出して、画像の相対コンテンツIDパスを取得します。ソース:

  <h1>Please Don't Cringe</h1>

  <%= image_tag attachments['photo.png'].url -%>

アクションビューのimage_tagメソッドを使用しているため、必要な他のオプションを渡すことができます。

 <h1>Please Don't Cringe</h1>

 <%= image_tag attachments['photo.png'].url, alt: 'Our Photo', class: 'photo' -%>
5
strohy1210

Railsについてはあまり知りませんが、C#で電子メールを作成し、Google APIを介してユーザーの受信トレイに挿入するプロジェクトに取り組んできました。電子メールを作成するには、電子メール文字列をゼロから生成する必要がありました。メールのマルチパートを有効にすると、画像バイトはbase64エンコーディングを使用してマルチパートセクションに含まれます。

TMailおよびRubyMailパッケージをチェックアウトして、これらのアクションがサポートされているかどうかを確認することをお勧めします。

0
regex