Replyr Build Status

Replyr lets you receive and process reply emails with Rails. And with ease!

Here's an example

A User gets an email notification about a comment being posted on his page. Now he answers this email directly from his email client with a followup comment. Replyr receives the anwser and creates a new comment on his page.

How does this work?

Replyr generates a special reply_to email address which is unique to the user receiving the notification and the object in question (e.g. a comment). The resulting reply email address looks something like this:

reply-comment-12-56-01ce26dc69094af9246ea7e7ce9970aff2b81cc9@example.com

This address will be set as the reply_to address in the outgoing email from the rails app. When the user answers the email, the message will be sent to this address and Replyr will be able to handle it accordingly. It will check the mail for validity and then pass it to your custom code, which will then create a new comment.

How do the emails get into my app?

Replyr uses the awesome Mailman Gem to receive the reply emails. It can be configured to get the emails via Maildir, from a POP3- or from an IMAP-Server. It runs as a background daemon and observes your email directory or polls your email server for new emails. Take a look at the documentation to find out about its features and how to set it up:

https://github.com/titanous/mailman

Requirements

  • Ruby >= 1.9.3
  • Rails 3 >= 3.1 or Rails 4.x

Installation

Add the gem to your Gemfile

gem 'replyr'

Install

$ bundle
$ rails g replyr:install

Edit initializer

Open up config/initializers/replyr.rb and set the host names of your reply and bounce email addresses.

Ryplr.config.reply_host = "yourdomain.com"
Ryplr.config.bounce_host = "yourdomain.com"

Setup Mailman Gem

The Install Generator will already have created a script/mailman_server file which boots up the Mailman background job. According to your setup you will have to configure the file to your needs. By default it is setup to observe the ~/Maildir folder in your home directory.

Usage

Reply Handling

Make a model accept replies

Update your ActiveRecord models you want to reply to by adding a handle_reply like this:

class Comment < ActiveRecord::Base
  belongs_to :user

  handle_reply do |comment, user, text, files|
    Comment.create(body: text)
  end

end

The handle_reply method takes a block with 4 parameters. The first one is the original object (in this case the comment). The second is the user who is sending the reply. The third is the reply plain text from the email (HTML mails are not supported). The fourth and last argument is an Array of StringIO objects representing all files attached to the emails.

What you put in the handle_reply block is completely up to you. In this example we are just creating a new comment, but you could also handle attached files by passing them to carrierwave, etc.

Make your mailers send the reply_to address

To add the unique reply address to your outgoing emails and make them 'replyable', add the reply_to option to your mailers methods:

class CommentMailer < ActionMailer::Base

  def new_comment(user, comment)
    mail to: user.email, reply_to: comment.reply_address_for_user(user)
  end

end

Bounce Handling

Make a model accept bounce emails

Add a handle_bounce call to the ActiveRecord model you want to handle your bounce emails on.

class User < ActiveRecord::Base

  handle_bounce do |user, email|
    # Put your custom bounce handling code here
    # e.g. mark email as invalid
    user.update_attribute(:email_valid, false)
  end

end

Update your mailers and set the return_path

class CommentMailer < ActionMailer::Base

  def new_comment(user, comment)
    mail to: user.email, return_path: user.bounce_address
  end

end

Start up the worker

Start/Stop the Mailman background worker with the following commands:

$ RAILS_ENV=production script/mailman_daemon start
$ RAILS_ENV=production script/mailman_daemon stop