DEV Community

Cover image for Setup Action Mailbox with Postfix - Part 2
Prabin Poudel for Truemark Technology

Posted on • Updated on • Originally published at thedevpost.com

Setup Action Mailbox with Postfix - Part 2

This is the second part of a 2 series tutorial to setup action mailbox with postfix. In this part, we will configure postfix in production server to forward incoming emails to our rails app so action mailbox can process it.

If you haven't read the first part where we setup action mailbox and test it in development, you can read it here.

You should have

  • Postfix configured in production server (same server as your rails app)
  • Existing app built with rails 6
  • Ruby with rbenv setup
  • Patience

Steps

Login to your production server first and then;

Step 1: Create bash script

Create a script inside /usr/local/bin/ to forward all incoming emails to our rails app

$ nano email_forwarder.sh
Enter fullscreen mode Exit fullscreen mode

Add following to the script

#!/bin/sh
export HOME=YOUR_HOME_PATH
export PATH=YOUR_PATH
export RBENV_ROOT=YOUR_RBENV_PATH

cd /path/to/your/project && bin/rails action_mailbox:ingress:postfix URL='https://truemark.com.np/rails/action_mailbox/relay/inbound_emails' INGRESS_PASSWORD='YOUR_INGRESS_PASSWORD'
Enter fullscreen mode Exit fullscreen mode

Replace value of HOME, PATH, RBENV_ROOT, URL and INGRESS_PASSWORD as described below:

  • Copy your home directory for HOME

cd and copy what you get from pwd command

$ cd
$ pwd
Enter fullscreen mode Exit fullscreen mode
  • Copy what you get from $PATH and which rbenv command for PATH and RBENV_PATH respectively
$ $PATH
$ which rbenv
Enter fullscreen mode Exit fullscreen mode
  • Copy the password you added to credentials or your ENV | application.yml file for INGRESS_PASSWORD

For URL, if your application lived at https://example.com, the full command would look like this:

bin/rails action_mailbox:ingress:postfix URL=https://example.com/rails/action_mailbox/relay/inbound_emails INGRESS_PASSWORD=YOUR_STRONG_PASSWORD

Step 2: Configure Postfix to Pipe Incoming emails to script

We will follow steps as described here.

  • Create /etc/postfix/virtual_aliases to add a catch-all alias; localuser needs to be an existing local user:
# /etc/postfix/virtual_aliases
@mydomain.tld   localuser@mydomain.tld
Enter fullscreen mode Exit fullscreen mode
  • Create /etc/postfix/transport to add a transport mapping. "forward_to_rails" can be whatever you want; it will be used later in master.cf
# /etc/postfix/transport
mydomain.tld    forward_to_rails:
Enter fullscreen mode Exit fullscreen mode
  • Next, both transport and virtual_aliases need to be compiled into berkeley db files:
$ sudo postmap /etc/postfix/virtual_aliases
$ sudo postmap /etc/postfix/transport
Enter fullscreen mode Exit fullscreen mode
  • Add the transport to /etc/postfix/master.cf
# /etc/postfix/master.cf
forward_to_rails   unix  -       n       n       -       -       pipe
  flags=Xhq user=deploy:deploy argv=/usr/local/bin/email_forwarder.sh
  ${nexthop} ${user}
Enter fullscreen mode Exit fullscreen mode

We should specify user so script is run by that user and not postfix or nobody. user=deploy:deploy ~ user=user:group

  • Add following in /etc/postfix/main.cf
# /etc/postfix/main.cf
  transport_maps = hash:/etc/postfix/transport
  virtual_alias_maps = hash:/etc/postfix/virtual_aliases
Enter fullscreen mode Exit fullscreen mode

You can view postfix log with tail -f /var/log/mail.log.

You must have everything now to receive email in your rails app. Test it with any of your email provider; just send the email to email@your-configured-domain.com and check if it is being received in the log. If you have any comments or suggestions, please let me know in comments below.

References: Action Mailbox, Pipe incoming mails to script

Discussion (0)