Mass Mailing in Rails
I have a need to send out a bunch of individual emails from the same email address. I thought it would be good practice for me to see if I could do this as part of a rails app. The interesting thing is that I don’t want to save anything to a model. I just want to be able to upload a csv file, get all the names and email addresses out and send the same email with attachment to all of them. Here’s how I did it.
Here’s my standalone model
class Message include ActiveModel::Validations include ActiveModel::Conversion extend ActiveModel::Naming attr_accessor :name, :email, :doc validates_presence_of :name, :email def initialize(attributes = {}) attributes.each do |name, value| send("#{name}=", value) end end def persisted? false end def send_announcement pid = fork do GeneralMailer.send_announcement(self).deliver end Process.detach(pid) end end
class MessagesController < ApplicationController filter_access_to :all, :attribute_check => false def index end def new @message = Message.new end def create @file = IO.readlines(params[:message][:doc].tempfile) @file.each do |line| @a = line.chomp.split(',') @message = Message.new(name: @a[1], email: @a[0]) if @message.valid? @message.send_announcement end end redirect_to new_message_path end end
<%= form_for(@message) do |f| %>Text file of email addresses: <%= f.file_field :doc %>
<%= f.submit %>
<% end %>
class GeneralMailer < ActionMailer::Base default from: "sending_email_address" def send_announcement(message) @message = message attachments['color_test.pdf'] = File.read('/Users/me/Desktop/color-test.pdf') mail(to: "#{@message.name}<#{@message.email}>", subject: "2014 Conference") end end
I don’t really need the index method, but my form complained when it wasn’t there. I haven’t had a chance to look into why that is. I also tried using a form_tag form, but that didn’t upload the document. So I’m sure there’s a better way of doing this, but this actually does do what I want.