Ubuntu E-mail

Hi, I have a newbie question about running Ubuntu 16.04 LTS on a VPS. What is the simplest/most effective way for sending e-mail from the command line, The reason I ask is because I want my VPS to be able to install updates automatically and e-mail me what was updated. Thanks for your advice.

I made a Python script a while back to send notifications to my gmail account when things happen on my servers.

I mostly just pipe commands to it like this:

sudo apt-get dist-upgrade | ./sendmail.py --subject Updates --mime plain

Which sends me this:

Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.

Or run something like this on a cronjob:

cat /var/log/dpkg.log | grep $(date +"%Y-%m-%d") | grep "\ install\ " | ./sendmail.py -s Updates

This will send a list of all the packages that have been installed on the current day and will output something like this:

2016-09-24 02:18:37 install php7.0-sqlite3:amd64 <none> 7.0.8-0ubuntu0.16.04.2
2016-09-24 02:19:28 install libdbi1:amd64 <none> 0.9.0-4
2016-09-24 02:19:28 install libdbd-sqlite3:amd64 <none> 0.9.0-3ubuntu2
2016-09-24 02:19:56 install libsqlite3-dev:amd64 <none> 3.11.0-1ubuntu1
2016-09-24 02:23:31 install cmake-qt-gui:amd64 <none> 3.5.1-1ubuntu2
2016-09-24 02:25:03 install libqt5quickparticles5:amd64 <none> 5.5.1-2ubuntu6
2016-09-24 02:25:03 install qtdeclarative5-dev:amd64 <none> 5.5.1-2ubuntu6
2016-09-24 02:25:03 install libqt5webkit5-dev:amd64 <none> 5.5.1+dfsg-2ubuntu1
2016-09-24 02:26:05 install qt5keychain-dev:amd64 <none> 0.7.0-9.1

So to set this up in a cronjob first run crontab -e and add the following to the file:

30 23 * * * cat /var/log/dpkg.log | grep $(date +"%Y-%m-%d") | grep "\ install\ " | /path/to/script/sendmail.py -s Updates

This will send the message every day at 11:30PM and if packages were install any time before 11:30PM on the same day they will show up in the message.

The script is below:

You'll have to change some values for this to work with your email account such as the SMTP server, sender address, email password, and destination. I set it up with smtp.google.com and used my gmail address for both the sender and destination addresses so I'm effectively e-emailing myself the message.

#!/usr/bin/env python3

from smtplib import SMTP_SSL as SMTP
from email.mime.text import MIMEText
from optparse import OptionParser
import sys

class Mail(object):

    SMTPserver = 'smtp.example.com'
    sender, destination, password = '[email protected]', '[email protected]', 'password'
    opts = None

    def __init__(self):
        parser = OptionParser()
        parser.add_option("-s", "--subject", dest="subject", default="Message")
        parser.add_option("-m", "--mime", dest="mime", default="plain")
        (self.opts, args) = parser.parse_args()

    def get_message(self):
        input_stream = sys.stdin
        msg = MIMEText(input_stream.read(), self.opts.mime)
        msg['Subject'] = self.opts.subject
        msg['From'] = self.sender
        msg['To'] = self.destination
        return msg

    def send(self, msg):
        try:
            with SMTP(self.SMTPserver) as smtp:
                smtp.login(self.sender, self.password)
                smtp.sendmail(self.sender, self.destination, msg.as_string())
            print("done")
        except(Exception) as e:
            print(e.__class__.__name__, e)
            sys.exit(0)

m = Mail()
m.send(m.get_message())

I also uploaded it to gist here: https://gist.github.com/michaellindman/c1bc3a2b8e5f12a0055c65e55b230b64

3 Likes

Thanks for the script, I'll give it a try.

If you have any problems let me know and I'll see if I can help. The script was something I quickly throw together because I had a need for it and thus isn't very robust but it should be fairly easy to understand.

It works with my gmail account. Thanks again.

1 Like

Well I'm using your request words "easiest".

Mail -s "Subject You want in Email" [email protected] < /location/of/file/with/message

If that does not work you don't have basic email packages installed and they should be if its a default install.

It may be the easiest but it has many issues. Most email services would flag messages sent like this as spam and it doesn't encrypt the message and given the potentially sensitive nature of whats being sent encryption is essential.

1 Like

No where does the OP list security, or did he send you a PM?

I have hundreds of systems sending me such emails and I send everyone I work with such emails and unless I send bogus links or huge attachments none have gone to spam, my vendors also keeps sending me product so I think they're getting to them.

Mail is the classic Unix mail, if it doesn't work you have major issues with your system.

The OP doesn't mention security but it is an important factor especially if you are sending yourself system logs.

Also, on an unconfigured system messages would be sent by user@hostname which isn't a domain and cannot be verified by DNS meaning most mail services would classify this message as spam because of that reason.