How to Send Email from the Command Line with MSMTP and Mutt

Need Hosting? Try ours, it's fast, reliable and feature loaded with support you can depend on. View Plans

Overview

Sometimes you might need or want to send email from the command line. You might generate a report from a database or your application and want to send the generated report via email. Assuming that the report is generated manually via a scipt and invoked using crontab.

In this tutorial we'll learn how-to install MSMTP and Mutt. We'll use MSMTP to relay our email to Gmail. If you want to follow this tutorial using Gmail a email account please create a new email address to be used on your server and don't use your current gmail account, one of the reasons is that the password to the Gmail account will be stored in plain text by default. You can use pgp to store your password securely. Another reason is that the account that you will use to send email from the server might get locked due to the different location between you and the server.

If you find difficulties logging in from your server to Gmail, you might want to follow steps provided in Google Support Site.

We can use MSMTP to send email but unfortunately we cannot include atatchments, so We'll use Mutt to help us send email with attachments from the command line. We'll use Ubuntu 14.04 on this tutorial but any Ubuntu release and even Debian release should be able to follow this tutorial.

Updating Server

Before we install MSMTP and Mutt we'll update our server to the latest update. If you are installing MSMTP and Mutt on an existing server, make sure it's ok to update your server to the latest release.

$ sudo apt-get update $ sudo apt-get upgrade

Installing MSMTP

Now it's time to install MSMTP. You can use command below to install MSMTP.

$ sudo apt-get -y install msmtp

We need to have a file that contains Certificate Authority (CA) certificates so that we can connect using SSL / TLS to the email server. You can check whether your server already has a ca-certificates package installed or not using command below :

$ dpkg -l | grep ca-certificates ii ca-certificates 20141019ubuntu0.14.04.1 all Common CA certificates

If a ca-certificates package is already installed you will get output similar to above output similar to output above. If you get blank output it means that ca-certificates package is not installed, and you need to install it. You can install this package by running this command :

$ sudo apt-get -y install ca-certificates

Configuring MSMTP

Create an MSMTP configuration on /etc/msmtprc with the content below. You will have to enter your Gmail username and password on this file.

# Set default values for all following accounts. defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt logfile ~/.msmtp.log # Gmail account gmail host smtp.gmail.com port 587 from @gmail.com user @gmail.com password # Gmail account anotherprovider host smtp.anotherprovider.net port 587 from @anotherprovider.net user @anotherprovider.net password # Set a default account account default : gmail

This configuration assumes that you have more than mail configuration. That's why we use account gmail and also account default : gmail . If you use a different name make sure you set which account that you want to use as default.

Installing Mutt

To install Mutt, you can use command below.

$ sudo apt-get -y install mutt

Mutt installs Postfix as one of its dependencies. You will have to manually select the package configuration. You can select No configuration.

Configuring Mutt

We will create a local configuration for Mutt on ~/.muttrc . This file might not exist yet, you can create this file with the content below

set sendmail="/usr/bin/msmtp" set use_from=yes set realname="" set from=@gmail.com set envelope_from=yes

You need to change realname and from above. realname is shown as sender on recipient, while from is the email address that you'll use to send the email.

Sending Email Without Attachment

Now the fun part. To send the email using msmtp is really easy. The easiest syntax that you can use is :

$ echo "Hello this is sending email using msmtp" | msmtp recipent@domain.com

If you want to specify which configuration that you want to use, you can use -a option :

$ echo "Hello this is sending email using msmtp" | msmtp -a gmail recipent@domain.com

The command above will send email without a subject, and with body / content "Hello this is sending email using msmtp". If you want to send email with subject then you can use this command :

$ echo "Subject: Hello this is subject" | msmtp recipient@domain.com

The command above will send email with a Subject but without body or email content. What about a complete email? you can use command below:

$ printf "To: @domain.comnFrom: @gmail.comnSubject: Email Test Using MSMTPnnHello there. This is email test from MSMTP." | msmtp recipient@domain.com

Of course you don't have to put your email directly on command line. Another way to create complete email like what we just did earlier is to create a file with the contents below. Give the file name email.txt

To: @gmail.com From: @gmail.com Subject: Email Test using MSMTP from File Hi, This is an email test from file.

To send this email you can use command :

$ cat email.txt | msmtp -a default recipient@domain.com

Sending Email With an Attachment

So far you've learned how to send email using msmtp, now we will use mutt to send email with an attachment. You might be asking why do we need both msmtp and mutt? The answer is that msmtp is an Mail Transfer Agent (MTA) and only knows how to send email but it doesn't know how to create the attachment. Creating an email as MIME is more of Mail User Agent (MUA) function and that's why we use Mutt in this tutorial.

We will install logwatch to create report that we will attach on our sample. Actually logwatch has options that can send report directly to email. We only use logwatch report as an example on this tutorial.

Now, let's install logwatch first :

$ sudo apt-get -y install logwatch

Now we can generate the log using logwatch :

$ sudo logwatch --detail High --filename report.txt

the report.txt file might be owned by root. We'll change the ownership so our current user is the owner of the report.txt file.

$ sudo chown `whoami`:`whoami` report.txt

Now the report is ready. Let's send the attachement using Mutt.

$ mutt -a report.txt -s "Logwatch Report" -- recipient@domain.com recipient2@domain.com < /dev/null

The command above will send email with an attachment but with a blank body since we put the content from /dev/null . If you want to send complete email with subject, to, and body, create a file that contains the message that you want to put on the email body. Then you can change /dev/null with the filename. For example, if you put the body of the email in the email message.txt file you can use command below :

$ mutt -a report.txt -s "Logwatch Report" -- recipient@domain.com recipient2@domain.com < emailmessage.txt

Summary

In this tutorial we learned how-to send email from command line using MSMTP and Mutt. We learned how-to send email with and without attachments. You can use methods that we already learned on your scripts that require email sending functionality.

References