How can I send mail with rails without a template?

后端 未结 4 1867
旧巷少年郎
旧巷少年郎 2021-02-01 01:29

In my Rails 3 project, I want to send some simple notification emails. I don\'t need to make a template for them or do any logic. I just want to fire them off from various place

相关标签:
4条回答
  • 2021-02-01 01:47

    The simplest way to send mail in rails 3 without a template is to call the mail method of ActionMailer::Base directly followed by the deliver method,

    For ex, the following would send a plain text e-mail:

    ActionMailer::Base.mail(
      from: "me@example.com",
      to: "you@example.com",
      subject: "test",
      body: "test"
    ).deliver
    

    http://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-mail gives you all the header options and also ideas about the how to send a multipart/alternative email with text/plain and text/html parts directly.

    0 讨论(0)
  • 2021-02-01 01:47

    Here is little example from Rails Guides which uses render method. I didn't try it, but if it works as render in cotrollers, then you can just use:

    render :text => "Your message"
    

    or

    render :text => my_message
    

    Where my_message is a parameter.

    You can just wrap it in a method which you can call from every place you want.

    Updated Rails 3.2.8

    In this version of Rails I had to do it like this:

    def raw_email( email, subject, body )
      mail(
        :to => email,
        :subject => subject
      ) do |format|
        format.text { render :text => body }
      end
    end
    
    0 讨论(0)
  • 2021-02-01 02:08

    You can try something like this:

    class Notifier < ActionMailer::Base
      def send_simple_message(options)
        mail(options.except(:body)) do |format|
          format.text { render :text => options[:body] }
        end.deliver
      end
    end
    
    0 讨论(0)
  • 2021-02-01 02:11

    Rails 5 users may find the accepted answer (using format.text {...}) doesn't work; at least I was getting an exception because Rails was looking for a view.

    Turns out there's a section in the Rails Guide called Sending Emails without Template Renderingand all one needs to do is supply :content_type and :body options to mail(). E.g.:

    class UserMailer < ApplicationMailer
      def welcome_email
        mail(to: params[:user].email,
             body: params[:email_body],
             content_type: "text/html",
             subject: "Already rendered!")
      end
    end
    
    0 讨论(0)
提交回复
热议问题