Suche…


Einführung

Mit Action Mailer können Sie E-Mails aus Ihrer Anwendung mithilfe von Mailer-Klassen und -Ansichten senden. Mailer arbeiten sehr ähnlich wie Controller. Sie erben von ActionMailer :: Base und leben in App / Mailern. Sie haben dazugehörige Ansichten, die in App / Ansichten angezeigt werden.

Bemerkungen

Es wird empfohlen, das Versenden von E-Mails asynchron zu verarbeiten, um Ihren Webserver nicht zu blockieren. Dies kann durch verschiedene Dienste wie delayed_job .

Basic Mailer

In diesem Beispiel werden vier verschiedene Dateien verwendet:

  • Das Benutzermodell
  • Der User Mailer
  • Die HTML-Vorlage für die E-Mail
  • Die Nur-Text-Vorlage für die E-Mail

In diesem Fall ruft das Benutzermodell die approved Methode im Mailer auf und übergibt die genehmigte post (die approved Methode im Modell kann durch einen Rückruf, von einer Controller-Methode usw. aufgerufen werden). Anschließend generiert der Mailer die E-Mail entweder aus der HTML- oder der Nur-Text-Vorlage anhand der Informationen aus dem übergebenen post (z. B. dem Titel). Standardmäßig verwendet der Mailer die Vorlage mit demselben Namen wie die Methode im Mailer (weshalb sowohl die Mailer-Methode als auch die Vorlage den Namen "Genehmigt" haben).

user_mailer.rb

class UserMailer < ActionMailer::Base
  default from: "[email protected]"

  def approved(post)
      @title = post.title
      @user = post.user
      mail(to: @user.email, subject: "Your Post was Approved!")
  end
end

user.rb

def approved(post)
    UserMailer.approved(post)
end

approved.html.erb

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <title>Post Approved</title>
    </head>
    <body>
        <h2>Congrats <%= @user.name %>! Your post (#<%= @title %>) has been approved!</h2>
        <p>We look forward to your future posts!</p>
    </body>
</html>

approved.text.erb

Congrats <%= @user.name %>! Your post (#<%= @title %>) has been approved!
We look forward to your future posts!

Neuen Mailer generieren

Geben Sie den folgenden Befehl ein, um einen neuen Mailer zu erstellen

rails generate mailer PostMailer 

Dadurch wird eine leere Vorlagendatei in app/mailers/post_mailer.rb Namen PostMailer generiert

class PostMailer < ApplicationMailer
end

Es werden auch zwei Layoutdateien für die E-Mail-Ansicht erstellt, eine für das HTML-Format und eine für das Textformat.

Wenn Sie den Generator nicht verwenden möchten, können Sie eigene Mailer erstellen. ActionMailer::Base Sie sicher, dass sie von ActionMailer::Base erben

Anhänge hinzufügen

ActionMailer erlaubt auch das Anhängen von Dateien.

attachments['filename.jpg'] = File.read('/path/to/filename.jpg')

Anhänge werden standardmäßig mit Base64 codiert. Um dies zu ändern, können Sie der Attachments-Methode einen Hash hinzufügen.

attachments['filename.jpg'] = {
  mime_type: 'application/gzip',
  encoding: 'SpecialEncoding',
  content: encoded_content
}

Sie können auch Inline-Anhänge hinzufügen

attachments.inline['image.jpg'] = File.read('/path/to/image.jpg')

ActionMailer-Rückrufe

ActionMailer unterstützt drei Rückrufe

  • before_action
  • after_action
  • around_action

Stellen Sie diese in Ihrer Mailer-Klasse bereit

class UserMailer < ApplicationMailer
  after_action :set_delivery_options, :prevent_delivery_to_guests, :set_business_headers

Erstellen Sie dann diese Methoden unter dem private Schlüsselwort

private
  def set_delivery_options
  end

  def prevent_delivery_to_guests
  end

  def set_business_headers
  end
end

Generieren Sie einen geplanten Newsletter

Erstellen Sie das Newsletter- Modell:

  rails g model Newsletter name:string email:string

  subl app/models/newsletter.rb

  validates :name, presence: true
  validates :email, presence: true

Erstellen Sie den Newsletter- Controller:

  rails g controller Newsletters create
  
  class NewslettersController < ApplicationController
    skip_before_action :authenticate_user!
    before_action :set_newsletter, only: [:destroy]

    def create
      @newsletter = Newsletter.create(newsletter_params)
      if @newsletter.save
        redirect_to blog_index_path
      else
        redirect_to root_path
      end
    end

    private

      def set_newsletter
        @newsletter = Newsletter.find(params[:id])
      end

      def newsletter_params
        params.require(:newsletter).permit(:name, :email)
      end

  end

Ändern Sie danach die Ansicht " create.html.erb" in den Namen " Nex" . Wir konvertieren diese Datei in eine Teilansicht , die in der Fußzeile gespeichert wird. Der Name lautet _form.html.erb .

Namensdatei ändern von: Zu:
app / views / newsletters / create.html.erb app / views / newsletters / _form.html.erb

Danach legen Sie die Routen fest:

  subl app/config/routes.rb
    
  resources :newsletters

Später müssen wir das Formular festlegen, das zum Speichern jeder Mail verwendet wird:

  subl app/views/newsletters/_form.html.erb

  <%= form_for (Newsletter.new) do |f| %>
    <div class="col-md-12" style="margin: 0 auto; padding: 0;">
      <div class="col-md-6" style="padding: 0;">
        <%= f.text_field :name, class: 'form-control', placeholder:'Nombre' %>
      </div>
      <div class="col-md-6" style="padding: 0;">
        <%= f.text_field :email, class: 'form-control', placeholder:'Email' %>
      </div>
    </div>
    <div class="col-md-12" style="margin: 0 auto; padding:0;">
      <%= f.submit class:"col-md-12 tran3s s-color-bg hvr-shutter-out-horizontal", style:'border: none; color: white; cursor: pointer; margin: 0.5em auto; padding: 0.75em; width: 100%;' %>
    </div>
  <% end %>

Und danach in die Fußzeile einfügen:

  subl app/views/layouts/_footer.html.erb

  <%= render 'newsletters/form' %>

Installieren Sie nun - letter_opener - to, um die E-Mail im Standardbrowser als Vorschau anzuzeigen , anstatt sie zu senden. Das bedeutet, dass Sie die E-Mail-Zustellung nicht in Ihrer Entwicklungsumgebung einrichten müssen, und Sie müssen sich keine Sorgen mehr machen, dass Sie versehentlich eine Test-E-Mail an die Adresse eines anderen Benutzers gesendet haben.

Fügen Sie zuerst den Edelstein Ihrer Entwicklungsumgebung hinzu und führen Sie den Befehl bundle aus, um ihn zu installieren.

  subl your_project/Gemfile

  gem "letter_opener", :group => :development

Legen Sie dann die Bereitstellungsmethode in der Entwicklungsumgebung fest:

  subl your_project/app/config/environments/development.rb

  config.action_mailer.delivery_method = :letter_opener

Erstellen Sie nun eine Mailer-Struktur , um die gesamten Mailer zu verwalten, an denen wir arbeiten werden. Im Terminal

  rails generate mailer UserMailer newsletter_mailer

Und im UserMailer müssen wir eine Methode namens Newsletter Mailer erstellen, die erstellt wird, um den neuesten Blogeintrag zu enthalten und mit einer Rake-Aktion ausgelöst zu werden. Wir gehen davon aus, dass Sie zuvor eine Blogstruktur erstellt haben.

subl your_project/app/mailers/user_mailer.rb

class UserMailer '[email protected]'

  
  def newsletter_mailer
    @newsletter = Newsletter.all
    @post = Post.last(3)
    emails = @newsletter.collect(&:email).join(", ")
    mail(to: emails, subject: "Hi, this is a test mail.")
  end
  
end

Danach erstellen Sie die Mailer-Vorlage :

subl your_project/app/views/user_mailer/newsletter_mailer.html.erb

<p> Dear Followers: </p>
<p> Those are the lastest entries to our blog. We invite you to read and share everything we did on this week. </p>

<br/>
<table>
<% @post.each do |post| %>
  <%#= link_to blog_url(post) do %>
      <tr style="display:flex; float:left; clear:both;">
        <td style="display:flex; float:left; clear:both; height: 80px; width: 100px;">
          <% if post.cover_image.present? %>
            <%= image_tag post.cover_image.fullsize.url, class:"principal-home-image-slider" %>
          <%# else %>
            <%#= image_tag 'http://your_site_project.com' + post.cover_video, class:"principal-home-image-slider" %>
            <%#= raw(video_embed(post.cover_video)) %>
          <% end %>
        </td>
        <td>
          <h3>
            <%= link_to post.title, :controller => "blog", :action => "show", :only_path => false, :id => post.id %>
          </h3>
          <p><%= post.subtitle %></p>
        </td>
        <td style="display:flex; float:left; clear:both;">
           
        </td>
      </tr>
  <%# end %>
<% end %>
</table>

Da wir die E-Mail als separaten Vorgang senden möchten, erstellen wir eine Rake-Aufgabe, um die E-Mail auszulösen. Fügen Sie dem lib / task-Verzeichnis Ihrer Rails-Anwendung eine neue Datei mit dem Namen email_tasks.rake hinzu:

touch lib/taks/email_tasks.rake

desc 'weekly newsletter email'
task weekly_newsletter_email: :environment do
  UserMailer.newsletter_mailer.deliver!
end

Die send_digest_email:: -Umgebung bedeutet, die Rails-Umgebung vor dem Ausführen der Task zu laden, sodass Sie auf die Anwendungsklassen (wie UserMailer) innerhalb der Task zugreifen können.

Wenn Sie nun den Befehl rake -T ausführen, wird die neu erstellte Rake-Task aufgelistet. Testen Sie alles, indem Sie die Aufgabe ausführen und prüfen, ob die E-Mail gesendet wird oder nicht.

Führen Sie den Befehl rake aus, um zu testen, ob die Mailer-Methode funktioniert:

  rake weekly_newsletter_email

Zu diesem Zeitpunkt haben wir eine Arbeitsrechenaufgabe, die mit Crontab geplant werden kann. Also installieren wir den Whenever Gem, der eine klare Syntax für das Schreiben und Bereitstellen von Cron-Jobs bereitstellt.

subl your_project/Gemfile
  
  gem 'whenever', require: false

Führen Sie danach den nächsten Befehl aus, um eine ursprüngliche config / schedule.rb-Datei für Sie zu erstellen (sofern der config-Ordner bereits in Ihrem Projekt vorhanden ist).

  wheneverize .

  [add] writing `./config/schedule.rb'
  [done] wheneverized!

Jetzt müssen wir in der Zeitplandatei unseren CRON-Job erstellen und die Mailer-Methode aufrufen, um den CRON-Job zu bestimmen, um einige Aufgaben ohne Hilfe und in einem bestimmten Zeitraum auszuführen. Sie können verschiedene Syntaxtypen verwenden, wie auf diesem Link erläutert.

subl your_project/config/schedule.rb

every 1.day, :at => '4:30 am' do
  rake 'weekly_newsletter_email'
end

Cron Job-Basissyntax

Cron Jobs mit wann immer

Um zu testen, dass der Cron Job erfolgreich erstellt wurde, können wir den nächsten Befehl verwenden, um seit dem Terminal unseren geplanten Job in CRON SYNTAX zu lesen:

your_project your_mac_user$ whenever

30 4 * * * /bin/bash -l -c 'cd /Users/your_mac_user/Desktop/your_project && RAILS_ENV=production bundle exec rake weekly_newsletter_email --silent'

Um den Test in der Entwicklungsumgebung auszuführen, ist es ratsam, die nächste Zeile in der Datei " application.rb " zu setzen, um der Anwendung mitzuteilen, wo welche Modelle verwendet werden.

  subl your_project/config/application.rb

  config.action_mailer.default_url_options = { :host => "http://localhost:3000/" }

Damit Capistrano V3 den neuen Cron-Job im Server und den Auslöser speichern kann, der die Ausführung dieser Aufgabe auslöst, müssen wir die nächste Anforderung hinzufügen:

  subl your_project/Capfile

  require 'whenever/capistrano'

Und in die deploy - Datei die Kennung , die Cron - Job über die Umwelt und den Namen der Anwendung verwenden.

subl your_project/config/deploy.rb

set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:rails_env)}" }

Führen Sie nach dem Speichern der Änderungen für jede Datei den Befehl capistrano deploy aus:

  cap production deploy

Und jetzt wurde Ihr Job erstellt und kalenderisiert, um die Mailer-Methode auszuführen, die ich will und in dem Zeitraum, in dem wir diese Dateien festlegen.

ActionMailer-Interceptor

Action Mailer stellt Hooks für die Interceptor-Methoden bereit. Auf diese Weise können Sie Klassen registrieren, die während des Lebenszyklus der Postzustellung aufgerufen werden.

Eine Interceptor-Klasse muss die: delivering_email (message) -Methode implementieren, die vor dem Senden der E-Mail aufgerufen wird, sodass Sie Änderungen an der E-Mail vornehmen können, bevor sie die Zustellungsagenten treffen. Ihre Klasse sollte alle erforderlichen Änderungen direkt an der in Mail :: Message übergebenen Instanz vornehmen.

Für Entwickler kann es nützlich sein, E-Mails an sich selbst und nicht an echte Benutzer zu senden.

Beispiel für die Registrierung eines Actionmailer-Interceptors:

# config/initializers/override_mail_recipient.rb

if Rails.env.development? or Rails.env.test?
  class OverrideMailRecipient
    def self.delivering_email(mail)
      mail.subject = 'This is dummy subject'
      mail.bcc = '[email protected]'
      mail.to = '[email protected]'
    end
  end
  ActionMailer::Base.register_interceptor(OverrideMailRecipient)
end


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow