• Stars
    star
    6,036
  • Rank 6,669 (Top 0.2 %)
  • Language
    Ruby
  • License
    MIT License
  • Created about 14 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Catches mail and serves it through a dream.

MailCatcher

Catches mail and serves it through a dream.

MailCatcher runs a super simple SMTP server which catches any message sent to it to display in a web interface. Run mailcatcher, set your favourite app to deliver to smtp://127.0.0.1:1025 instead of your default SMTP server, then check out http://127.0.0.1:1080 to see the mail that's arrived so far.

MailCatcher screenshot

Features

  • Catches all mail and stores it for display.
  • Shows HTML, Plain Text and Source version of messages, as applicable.
  • Rewrites HTML enabling display of embedded, inline images/etc and opens links in a new window.
  • Lists attachments and allows separate downloading of parts.
  • Download original email to view in your native mail client(s).
  • Command line options to override the default SMTP/HTTP IP and port settings.
  • Mail appears instantly if your browser supports WebSockets, otherwise updates every thirty seconds.
  • Runs as a daemon in the background, optionally in foreground.
  • Sendmail-analogue command, catchmail, makes using mailcatcher from PHP a lot easier.
  • Keyboard navigation between messages

How

  1. gem install mailcatcher
  2. mailcatcher
  3. Go to http://127.0.0.1:1080/
  4. Send mail through smtp://127.0.0.1:1025

Command Line Options

Use mailcatcher --help to see the command line options.

Usage: mailcatcher [options]

MailCatcher v0.8.0

        --ip IP                      Set the ip address of both servers
        --smtp-ip IP                 Set the ip address of the smtp server
        --smtp-port PORT             Set the port of the smtp server
        --http-ip IP                 Set the ip address of the http server
        --http-port PORT             Set the port address of the http server
        --messages-limit COUNT       Only keep up to COUNT most recent messages
        --http-path PATH             Add a prefix to all HTTP paths
        --no-quit                    Don't allow quitting the process
    -f, --foreground                 Run in the foreground
    -b, --browse                     Open web browser
    -v, --verbose                    Be more verbose
    -h, --help                       Display this help information
        --version                    Display the current version

Upgrading

Upgrading works the same as installation:

gem install mailcatcher

Ruby

If you have trouble with the setup commands, make sure you have Ruby installed:

ruby -v
gem environment

You might need to install build tools for some of the gem dependencies. On Debian or Ubuntu, apt install build-essential. On macOS, xcode-select --install.

If you encounter issues installing thin, try:

gem install thin -v 1.5.1 -- --with-cflags="-Wno-error=implicit-function-declaration"

Bundler

Please don't put mailcatcher into your Gemfile. It will conflict with your application's gems at some point.

Instead, pop a note in your README stating you use mailcatcher, and to run gem install mailcatcher then mailcatcher to get started.

RVM

Under RVM your mailcatcher command may only be available under the ruby you install mailcatcher into. To prevent this, and to prevent gem conflicts, install mailcatcher into a dedicated gemset with a wrapper script:

rvm default@mailcatcher --create do gem install mailcatcher
ln -s "$(rvm default@mailcatcher do rvm wrapper show mailcatcher)" "$rvm_bin_path/"

Rails

To set up your rails app, I recommend adding this to your environments/development.rb:

config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = { :address => '127.0.0.1', :port => 1025 }
config.action_mailer.raise_delivery_errors = false

PHP

For projects using PHP, or PHP frameworks and application platforms like Drupal, you can set PHP's mail configuration in your php.ini to send via MailCatcher with:

sendmail_path = /usr/bin/env catchmail -f [email protected]

You can do this in your Apache configuration like so:

php_admin_value sendmail_path "/usr/bin/env catchmail -f [email protected]"

If you've installed via RVM this probably won't work unless you've manually added your RVM bin paths to your system environment's PATH. In that case, run which catchmail and put that path into the sendmail_path directive above instead of /usr/bin/env catchmail.

If starting mailcatcher on alternative SMTP IP and/or port with parameters like --smtp-ip 192.168.0.1 --smtp-port 10025, add the same parameters to your catchmail command:

sendmail_path = /usr/bin/env catchmail --smtp-ip 192.160.0.1 --smtp-port 10025 -f [email protected]

Django

For use in Django, add the following configuration to your projects' settings.py

if DEBUG:
    EMAIL_HOST = '127.0.0.1'
    EMAIL_HOST_USER = ''
    EMAIL_HOST_PASSWORD = ''
    EMAIL_PORT = 1025
    EMAIL_USE_TLS = False

Docker

There is a Docker image available on Docker Hub:

$ docker run -p 1080 -p 1025 sj26/mailcatcher
Unable to find image 'sj26/mailcatcher:latest' locally
latest: Pulling from sj26/mailcatcher
8c6d1654570f: Already exists
f5649d186f41: Already exists
b850834ea1df: Already exists
d6ac1a07fd46: Pull complete
b609298bc3c9: Pull complete
ab05825ece51: Pull complete
Digest: sha256:b17c45de08a0a82b012d90d4bd048620952c475f5655c61eef373318de6c0855
Status: Downloaded newer image for sj26/mailcatcher:latest
Starting MailCatcher v0.9.0
==> smtp://0.0.0.0:1025
==> http://0.0.0.0:1080

How those ports appear and can be accessed may vary based on your Docker configuration. For example, your may need to use http://127.0.0.1:1080 etc instead of the listed address. But MailCatcher will run and listen to those ports on all IPs it can from within the Docker container.

API

A fairly RESTful URL schema means you can download a list of messages in JSON from /messages, each message's metadata with /messages/:id.json, and then the pertinent parts with /messages/:id.html and /messages/:id.plain for the default HTML and plain text version, /messages/:id/parts/:cid for individual attachments by CID, or the whole message with /messages/:id.source.

Caveats

  • Mail processing is fairly basic but easily modified. If something doesn't work for you, fork and fix it or file an issue and let me know. Include the whole message you're having problems with.
  • Encodings are difficult. MailCatcher does not completely support utf-8 straight over the wire, you must use a mail library which encodes things properly based on SMTP server capabilities.

Thanks

MailCatcher is just a mishmash of other people's hard work. Thank you so much to the people who have built the wonderful guts on which this project relies.

Donations

I work on MailCatcher mostly in my own spare time. If you've found Mailcatcher useful and would like to help feed me and fund continued development and new features, please donate via PayPal. If you'd like a specific feature added to MailCatcher and are willing to pay for it, please email me.

License

Copyright © 2010-2019 Samuel Cochran ([email protected]). Released under the MIT License, see LICENSE for details.

More Repositories

1

rspec_junit_formatter

RSpec results that your CI can read
Ruby
294
star
2

sidekiq-cloudwatchmetrics

Publish Sidekiq metrics to AWS CloudWatch
Ruby
50
star
3

skinny

Thin WebSockets—they'll fit
Ruby
45
star
4

puma-plugin-systemd

Puma integration with systemd for better daemonising under modern Linux systemds: notify, status, watchdog
Ruby
38
star
5

awscli-keyring

AWS CLI Keyring
Python
26
star
6

zipstream

Create zip files to a stream with rails integration.
Ruby
21
star
7

home

My castle.
Shell
17
star
8

git-buildkite

Start Buildkite builds using git with a clickable link
Shell
15
star
9

soundwave

An example Ruby on Rails app with seekable waveform of audio attachment.
Ruby
14
star
10

node-mdns

Extensible mDNS in node.js using ndns
JavaScript
13
star
11

packer-post-processor-tfvars

Packer post-processor exporting terraform variables
Go
11
star
12

rails-subdomain

Some convenience methods making subdomains in Rails a whole lot easier.
Ruby
11
star
13

dotjs-fluid

Userscript to put dotjs into your Fluid browsers
JavaScript
10
star
14

virtus-multiparams

Rails multiparams support for virtus models
Ruby
8
star
15

rbenv-install

A really thin wrapper around ruby-build for rbenv.
Shell
7
star
16

git-worktree-buildkite-hooks

Buildkite hooks to use Git worktrees
Shell
7
star
17

jquery.scrollmarkers

jQuery scrollmarkers--decorate the scrollbar with jump markers
JavaScript
7
star
18

ruby-1.9.3-p0

A clone of ruby-1.9.3-p0 for patching
C
7
star
19

derail

My curated set of technology choices.
Ruby
6
star
20

rubygems-keychain

Store Rubygems api keys and signing certificates securely in your macOS Keychain
Ruby
6
star
21

rack-s3

A Rack::Static like middleware for serving assets from S3
Ruby
6
star
22

christen

Run Rails, DNS and sign SSL all together like DNSimple.
Ruby
6
star
23

sinatra-diet

Sinatra on a Diet gets Thin and Skinny, asynchronously
Ruby
5
star
24

gem

Just enough not-Rubygems to index a collection of gems for download.
Ruby
4
star
25

rack-process

Proxy to a rack application in a separate process
Ruby
4
star
26

rspec-rails-assign

A nicer way to asset instance variable assignments in controller examples
Ruby
4
star
27

happening

An easy way to do event-based and scheduled programming in Ruby based on libevent.
Ruby
3
star
28

syllable

Made to partially satisfy a bountify bounty
Ruby
3
star
29

github-pipeline-upload-buildkite-plugin

Python
2
star
30

gravatard

A simple gravatar.com drop-in made for Railscamp 8
Ruby
2
star
31

lenientcsv

Lenient CSV parsing in Ruby
Ruby
2
star
32

homebridge-intesisbox

Homebridge plugin for Intesisbox gateways
JavaScript
2
star
33

notpm

Not-quite an NPM registry
Ruby
2
star
34

ucc-openid

Project to write a working UCC OpenID server.
2
star
35

openid_provider_profile

OpenID attribute exchange (AX) for user and profile fields for Drupal's OpenID Provider (http://drupal.org/project/openid_provider)
PHP
2
star
36

gdataplus

Extending GData to provide a nicer, ruby-like interface to certain APIs.
Ruby
2
star
37

webapp

An old Python project to create yet another web framework, here for posterity.
Python
1
star
38

rqrcode-renderer

Ruby
1
star
39

twatter

It's Twitter, but not.
Ruby
1
star
40

xbmc-web

XBMC web interface that doesn't suck (WIP)
CoffeeScript
1
star
41

oidc-token-buildkite-plugin

Shell
1
star
42

xmpr

XMP Reader in Ruby
Ruby
1
star
43

spoj

Some old SPOJ problems
C
1
star
44

menutarget

Easily set a menu item to open in a new window
PHP
1
star
45

nonogrammer

Ruby
1
star
46

nestive-example

Ruby
1
star
47

user_cull

Drupal module to mass delete users by uploading a CSV/list of usernames and emails
1
star
48

railscamp_attendees

Railscamp attendee lists
Ruby
1
star
49

codejam

Some old attempts at Google CodeJam problems
Python
1
star
50

rubygems.rc

Rubygems.org clone made at Railscamp XI
Ruby
1
star
51

homebrew-git-buildkite

Homebrew formula for git-buildkite
Ruby
1
star
52

erroneous

Render errors in rails and cache them in your public directory
Ruby
1
star
53

homebrew-mailcatcher

1
star
54

BDRS

Biological Data Recording System (BDRS), also known as the ALA Citizen Science project
JavaScript
1
star
55

setup-crane-buildkite-plugin

Installs crane for use in Buildkite builds
Shell
1
star
56

hellothisis.dog

HTML
1
star