Cuttlefish Lovely Transactional Email

Easy to set up, easy to use and open source


There are loads of great proprietary transactional email services out there. If you're happy spending the money then take a look at Sendgrid, Mailgun and Mandrill. These are just a few of them..
It's still early days for Cuttlefish and even now it already does a chunk of the most important things the proprietary services do. Cuttlefish offers basic bounce email handling, ensuring you maintain your good mail reputation by not resending to bounced addresses. Cuttlefish also gives you insight on how people read and respond to your emails via automatic open and click tracking.
Of course there is a lot that Cuttlefish doesn't yet do that the proprietary services do. It doesn't yet have an API or web callbacks for registering failed email deliveries to your app; It can't detect when a user marks one of your emails as spam; It doesn't have built in support for email templates.

System Requirements

In order to configure cuttlefish you must have the following softwares

  • Ruby 2.5.1
  • PostgresQL
  • Redis (2.4 or greater)
  • Postfix (Postfix is optional for local development or just trying it out. Some things like the email deliverability just won't show anything)


Following are the key features of cuttlefish

  • Ensure delivery.
  • Real time analytics.
  • Easy to use.
  • Flexible.
  • Reliable.
  • Open source.

Installation Instructions

We use Vagrant and Ansible to automatically set up a fresh server with everything you need to run Cuttlefish. It's a fairly complicated affair as Cuttlefish does have quite a few moving parts but all of this is with the purpose of making it easier for the developer sending mail.

These instructions are specifically for installing the server at

To install to a local test virtual machine

  1. Create a file ~/.cuttlefish_ansible_vault_pass.txt which contains the password for encrypting the secret values used in the deploy. The encrypted variables are at provisioning/roles/cuttlefish-app/vars/main.yml.
  2. Download base box and build virtual machine with everything needed for Cuttlefish. This will take a while (at least 30 mins or so)
    vagrant up
  3. Deploy the application. As this is the first deploy it will take quite a while (5 mins or so). Further deploys will be much quicker. We're using the --set-before local_deploy=true flag to deploy to your local test virtual machine instead of production.
    bundle exec cap --set-before local_deploy=true deploy:setup deploy:cold foreman:export foreman:start
  4. Add to your local /etc/hosts file
  5. Point your web browser at