web-dev-qa-db-fra.com

Comment puis-je envoyer un courrier avec Rails sans modèle?

Dans mon Rails 3 projet, je veux envoyer des courriels de notification simples. Je n'ai pas besoin de faire un modèle pour eux ou de faire une logique. Je veux juste les tirer de divers endroits dans le système.

Si je faisais cela dans un arbitraire Ruby Script, j'utiliserais poney . Cependant, j'aimerais toujours utiliser le Rails = Installations et configuration de messagerie, afin que je reçois la même fiabilité et la même configuration que j'ai pour le reste du courrier dans mon système.

Quel est le moyen le plus simple de faire cela? Idéalement, il y aurait une méthode comme

ActionMailer.send(:to => '[email protected]', :subject =>"the subject", :body =>"this is the body")
44
John Bachir

Le moyen le plus simple d'envoyer du courrier en Rails 3 sans modèle consiste à appeler la méthode mailActionMailer::Base directement suivi de la méthode deliver,

Pour EX, ce qui suit enverrait un courrier électronique de texte brut:

ActionMailer::Base.mail(
  from: "[email protected]",
  to: "[email protected]",
  subject: "test",
  body: "test"
).deliver

http://api.rubyonrails.org/classes/actionmailer/base.html#method-i-mail Vous donne toutes les options d'en-tête et des idées sur la façon d'envoyer un email multipart/alternatif avec Texte/Pièces simples et HTML/HTML.

104
KMG

ICI est petit exemple de Rails GUIDES qui utilise render méthode. Je n'ai pas essayé, mais si cela fonctionne comme render Dans les cotrolers, vous pouvez simplement utiliser:

render :text => "Your message"

ou

render :text => my_message

my_message est un paramètre.

Vous pouvez simplement l'envelopper dans une méthode que vous pouvez appeler de chaque endroit que vous souhaitez.

Mis à jour Rails 3.2.8

Dans cette version de Rails J'ai dû le faire comme ceci:

def raw_email( email, subject, body )
  mail(
    :to => email,
    :subject => subject
  ) do |format|
    format.text { render :text => body }
  end
end
9
klew

Rails 5 Les utilisateurs peuvent trouver la réponse acceptée (en utilisant format.text {...}) Ne fonctionne pas; Au moins, je reçois une exception parce que Rails cherchait une vue.

Il y a une section dans le Rails Guide appelé Envoi d'emails sans rendu de modèle et tout il faut faire est de fournir: content_type et: options corporelles à mail(). Par exemple:

class UserMailer < ApplicationMailer
  def welcome_email
    mail(to: params[:user].email,
         body: params[:email_body],
         content_type: "text/html",
         subject: "Already rendered!")
  end
end
8
arooaroo