How to debug emails locally using MailHog
April 5th, 2020 by Rijad HusicHow do you test your emails when working locally or from a staging server? Usually with manually testing and sending emails to only specific email addresses, and try not to send emails to real customers/users. You really need to be careful with those so it ends up as a really slow and painful process. Wouldn’t it be awesome to have a way to intercept all outgoing emails in a testing/debugging SMTP server so only could see those? The solution to this problem is called MailHog.
What is MailHog
MailHog is an email tool with a debugging SMTP server. It intersects all outgoing emails sent from your server, in this case, your local machine. With Mailhog you get a web interface with the email inbox just like Gmail for example. MailHog is really portable and built with Golang so it’s really easy to install it and use it.
When to use it
MailHog is a tool made by developers for developers. You can use it every day while developing any app. You don’t need to set up a real SMTP and you avoid all of the configurations.
How to install MailHog
MailHog is written in Go, so you’ll need to check if Go is already installed by running `go` in your terminal. If it’s not installed you’ll need to run the following commands:
cd ~
sudo apt-get install golang-go
mkdir gocode
echo "export GOPATH=$HOME/gocode" >> ~/.profile
source ~/.profile
Now we need to download MailHog from GitHub alongside with mhsendmail witch is the handler for forwarding PHP outgoing email to MailHog
go get github.com/mailhog/MailHog
go get github.com/mailhog/mhsendmail
Or if you are on windows you can download the corresponding release from https://github.com/mailhog/MailHog/releases
I’ll continue explaining how to install MailHog on Ubuntu system.
Next, we need to copy the binaries so they are available globally on the system. And connect PHP with MailHog.
sudo cp /home/rijadhusic/gocode/bin/MailHog /usr/local/bin/mailhog
sudo cp /home/rijadhusic/gocode/bin/mhsendmail /usr/local/bin/mhsendmail
As for the PHP we need to edit php.ini. Find where it says sendmail_path and edit the line so it matches the following
sendmail_path = /usr/local/bin/mhsendmail
And that’s it for the configuration. What we have left is to set it on bootup and test it out. Pretty easy right.
Starting MailHog after the system boot
In order to set MailHog run all the time and not worrying about it anymore you need to follow a few simple steps:
Create the following file /etc/systemd/system/mailhog.service and paste the following in it:
[Unit]
Description=MailHog service
[Service]
ExecStart=/usr/local/bin/mailhog \
-api-bind-addr 127.0.0.1:8025 \
-ui-bind-addr 127.0.0.1:8025 \
-smtp-bind-addr 127.0.0.1:1025
[Install]
WantedBy=multi-user.target
Start the mailhog service and check if it works by
sudo systemctl start mailhog
Enable the service on bootup by:
sudo systemctl enable mailhog
Restart your PC and then verify that MailHog is running with the following command:
systemctl | grep mailhog
You should get a response that the service is loaded active and running MailHog.
Testing
In order to test MailHog open up the web interface in your browser at 127.0.0.1:8025.
Now run this simple PHP script from the CLI:
php -r "\$from = \$to = 'testing@email.com'; \$x = mail(\$to, 'subject'.time(), 'Hello World', 'From: '. \$from); var_dump(\$x);"
And that’s it, now you don’t have to worry about sending emails to clients while working on your app. And you can use MailHog in your everyday work for testing emails.