Как мне отправить почту с рельсами без шаблона? - PullRequest
39 голосов
/ 07 февраля 2011

В моем проекте на Rails 3 я хочу отправить несколько простых уведомлений по электронной почте. Мне не нужно делать шаблон для них или делать какую-либо логику. Я просто хочу отстрелить их из разных мест системы.

Если бы я делал это в произвольном скрипте ruby, я бы использовал pony . Однако я хотел бы по-прежнему использовать средства и конфигурацию почты rails, чтобы получить ту же надежность и настройки, что и для остальной почты в моей системе.

Какой самый простой способ сделать это? В идеале был бы такой метод, как

ActionMailer.send(:to => 'foo@example.com', :subject =>"the subject", :body =>"this is the body")

Ответы [ 4 ]

100 голосов
/ 19 октября 2012

Самый простой способ отправить почту в рельсы 3 без шаблона - это вызвать метод mail для ActionMailer::Base, а затем метод deliver,

Например, по электронной почте было бы отправлено следующее сообщение:

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 дает вам все варианты заголовка, а также идеи о том, как отправить составное / альтернативное электронное письмо с текстовыми / обычными и текстовыми / HTML-частями напрямую.

9 голосов
/ 07 февраля 2011

Здесь - небольшой пример из Rails Guides, в котором используется метод render. Я не пробовал, но если он работает как render в cotrollers, то вы можете просто использовать:

render :text => "Your message"

или

render :text => my_message

Где my_message - параметр.

Вы можете просто обернуть его в метод, который вы можете вызвать из любого места.

Обновлены Rails 3.2.8

В этой версии Rails мне пришлось сделать это так:

def raw_email( email, subject, body )
  mail(
    :to => email,
    :subject => subject
  ) do |format|
    format.text { render :text => body }
  end
end
7 голосов
/ 07 февраля 2011

Вы можете попробовать что-то вроде этого:

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
4 голосов
/ 10 мая 2018

Пользователи Rails 5 могут найти принятый ответ (используя format.text {...}) не работает; по крайней мере, я получал исключение, потому что Rails искал представление.

Оказывается, в Rails Guide есть раздел под названием Отправка электронных писем без рендеринга шаблонов , и все, что нужно сделать, это указать в параметрах: content_type и: body значение 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
...