This is the second part of a two-series tutorial to setup action mailbox with postfix. In this part, we will configure postfix in the 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)
- The existing app built with rails 6
- Ruby with rbenv setup
- Patience
Steps
Let’s login to our production server first.
Step 1: Create A Bash Script
Create a script to forward incoming emails to our rails app inside /usr/local/bin/
$ nano email_forwarder.sh
Add the 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='http://localhost:3000/rails/action_mailbox/relay/inbound_emails' INGRESS_PASSWORD='YOUR_INGRESS_PASSWORD'
Replace values of HOME
, PATH
, rbenv
, URL
and INGRESS_PASSWORD
as described below:
- Copy your home directory
cd
and copy what you get from pwd
command
$ cd $ pwd
- Copy what you get from
$PATH
andwhich rbenv
command
$ $PATH $ which rbenv
- Copy the password you added to
credentials
file or your ENV file
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 the 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
- Create
/etc/postfix/transport
to add a transport mapping. “forward_to_rails” can be whatever you want; it will be used later inmaster.cf
# /etc/postfix/transport mydomain.tld forward_to_rails:
- 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
- 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}
We should specify user so the 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
You can view postfix log with tail -f /var/log/mail.log
.
You must have everything now to receive the email in your Rails app. Test it with any of your email providers; 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 the comments below.
References: Action Mailbox, Pipe incoming mails to script
2 Comments
Pingback: Setup Action Mailbox With Postfix - Part 1
tail -f /var/log/mail.log. says no such file or folder.