How to Send alerts to mail inbox from your Linux Server

Rakesh Jain
6 min readSep 28, 2020

--

There will be times when we want to send out some data, stats or resource alerts to our email from Linux host.

In this tutorial I am going to show how to setup emails to get notified when your machines want some tender love and attention.

Step 1: Install Postfix and Simple Authentication and Security Layer (SASL) packages

root@kmaster-rj:~# apt-get install libsasl2-modules postfix

There will be prompts asking General type of mail configuration. Select Internet Site:

Enter the fully qualified name of your domain.
here its kmaster-rj.example.com.

Step 2: Update Postfix main.cf file

After the installation completion, ensure that the myhostname parameter is configured with your server’s FQDN:

root@kmaster-rj:/etc/postfix/sasl# cat /etc/postfix/main.cf | grep ^myhostname
myhostname = kmaster-rj.example.com

Step 3: Generate an Google App Password for Postfix

When Two-Factor Authentication (2FA) is enabled, Gmail is preconfigured to refuse connections from applications like Postfix that don’t provide the second step of authentication.

While this is an important security measure that is designed to restrict unauthorized users from accessing your account, it hinders sending mail through some SMTP clients as you’re doing here. Follow these steps to configure Gmail to create a Postfix-specific password:

  • Log in to your email, then click the following link: Manage your account access and security settings. Scroll down to “Password & sign-in method” and click 2-Step Verification. You may be asked for your password and a verification code before continuing. Ensure that 2-Step Verification is enabled.
  • Click the following link to Generate an App password for Postfix:
  • Click Select app and choose Other (custom name) from the dropdown. Enter “Postfix” and click Generate.
  • The newly generated password will appear. Write it down or save it somewhere secure that you’ll be able to find easily in the next steps, then click Done:
  • You can verify the presence of password we generated just now

Step 4: Add Gmail Username and App Password to Postfix configuration

Usernames and passwords are stored in sasl_passwd in the /etc/postfix/sasl/ directory.

Now you will have to add your email login credentials to this file and to Postfix.

  • Create /etc/postfix/sasl/sasl_passwd file if not exist by default and add your gmail ID and password we
root@kmaster-rj:/etc/postfix/sasl# cat /etc/postfix/sasl/sasl_passwd
[smtp.gmail.com]:587 youremailaddress@gmail.com:kkegfdgdfgfdeaue
root@kmaster-rj:/etc/postfix/sasl#

Note: The SMTP server smtp.gmail.com supports message submission over port 587 (StartTLS) and port 465 (SSL). Whichever protocol you choose, be sure the port number is the same in /etc/postfix/sasl/sasl_passwd and /etc/postfix/main.cf files.

  • create the hash file for Postfix using the postmap command
root@kmaster-rj:~# postmap /etc/postfix/sasl/sasl_passwd

If the above command is executed successfully, then you should have a new file named sasl_passwd.db in the /etc/postfix/.

root@kmaster-rj:/etc/postfix/sasl# ls
sasl_passwd sasl_passwd.db

Step 5: Secure Your Postfix Hash Database and Email Password Files

Since sasl_passwd consists of username and password in plain text, so it is recommended to change the file permission to root. This is to esnure that only the root user is able to read and edit the credentials in this file.

root@kmaster-rj:/etc/postfix/sasl# chown root:root /etc/postfix/sasl/sasl_passwd /etc/postfix/sasl/sasl_passwd.dbroot@kmaster-rj:/etc/postfix/sasl# chmod 0600 /etc/postfix/sasl/sasl_passwd /etc/postfix/sasl/sasl_passwd.db

Step 6: Configure Relay Host

Modify the main.cf file and set the relayhost entry to external SMTP server address as below.

Note: if you have specified port no in sasl_passwd i.e. 587 as in the above example, then we need to specify in the same in the main.cf file also.

root@kmaster-rj:~# cat /etc/postfix/main.cf | grep -i ^relayhost
relayhost = [smtp.gmail.com]:587
root@kmaster-rj:~#

Step 7: Add Custom Configuration At The End Of File

root@kmaster-rj:~# cat /etc/postfix/main.cf | tail -n 10
# Enable SASL authentication
smtp_sasl_auth_enable = yes
# Disallow methods that allow anonymous authentication
smtp_sasl_security_options = noanonymous
# Location of sasl_passwd
smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd
# Enable STARTTLS encryption
smtp_tls_security_level = encrypt
# Location of CA certificates
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

Save your changes and close the file.

Step 8: restart postfix service

root@kmaster-rj:/etc/postfix/sasl# systemctl restart postfix

Step 9: Testing Postfix

Lets test whether our SMTP server can send emails to an external gmail account using sendmail command. Postfix logs can help as well.

root@kmaster-rj:/etc/postfix/sasl# sendmail youremailaddress@gmail.com
From: root@kmaster-rj.example.com
Subject: Test mail
This is a test email
.

Change body and subject line accordingly and in place of email address use valid email id.

Step 10: Send CPU alerts

Lets send some interesting CPU usage data to our email address.
It will trigger an email when your system reaches 4% CPU utilization.

Its very less threshhold btw :) just to show you the usage I’ve taken this. You can do a stress test to increase the load average.

root@kmaster-rj:~# cat /proc/loadavg | awk '{print $1}' | awk '{ if($1 > 4) printf("Current CPU Utilization is: %.2f%\n"), $0;}' | mail -s "Alert! High CPU usage alert from Kubernetes Master" youremailaddress@gmail.com

Note: Please change the email id and CPU utilization threshold value (which is 4 here) as per your requirement.

Verify on your email inbox (don’t forget to check in spam folder if not found in primary mailbox)

Note: You can configure the SMTP with different providers as well for e.g mandrill , sendgrid etc. You just need to update the sasl password. Everything else will remain same.

Troubleshooting

How to fix postfix/smtp Network unreachable error:

When trying to send email to a gmail account through postfix you can see an error like this in the postfix logs /var/log/maillog :

Sep 28 17:49:54 solver postfix/smtp[10045]: connect to gmail-smtp-in.l.google.com[2a00:1450:400c:c05::1b]:25: Network is unreachable

Solution for IPv4

If you want to use IPv4 instead, then you should edit the Postfix configuration file and change inet_protocols = all to inet_protocols = ipv4 and restart or reload Postfix:

root@kmaster-rj:~# cat /etc/postfix/main.cf | grep -i ^inet_protocolsinet_protocols = ipv4
root@kmaster-rj:~# /etc/init.d/postfix reload

and flush the Postfix queue or just wait and mail will start to send.:

root@kmaster-rj:~# postfix flush

Mail queue operations

To see mail queue, enter:
# mailq

To remove all mail from the queue, enter:
# postsuper -d ALL

To remove all mails in the deferred queue, enter:
# postsuper -d ALL deferred

Sending Mail

1. Send Full Mail using the following command:

mail -s "Hello World" youremailaddress@gmail.com

OR you can also send mail to multiple recipients:

mail -s "Hello World" youremailaddress@gmail.com,youremailaddress@yahoo.com

it asks for cc: and mail body

# mail -s "Hello World" youremailaddress@gmail.com  
Cc: youremailaddress@yahoo.com
Hi Test user
How are you
This is Test Mail
<Ctrl+D>

Press Ctrl+D for send mail

2. Mail in a Single Line

mail -s "subject" youremailaddressl@gmail.com <<< 'mail body'

Thats all!

Hope you like the tutorial. Please let me know your feedback in the response section.

Thanks. Happy learning!

--

--

Rakesh Jain
Rakesh Jain

Written by Rakesh Jain

DevOps Professional | Technical writer

Responses (1)