• Stars
    star
    185
  • Rank 208,271 (Top 5 %)
  • Language
    Perl
  • Created about 13 years ago
  • Updated over 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

The ultimate command line SMTP client

smtp-cli β€” command line SMTP client

smtp-cli is a powerful SMTP command line client with a support for advanced features, such as STARTTLS, SMTP-AUTH, or IPv6 and with a scriptable message composition capabilities supporting anything from simple plain-text messages right up to building complex HTML emails with alternative plain-text part, attachments and inline images. The MIME-Type of the attachments can either be guessed automatically or alternatively set on the command line, separately for each attachment if required.

It's also a convenient tool for testing and debugging SMTP servers setups. Even the hardcore mail admins used to typing the SMTP protocol over telnet need a specialised tool when it comes to verifying encryption settings of their TLS enabled server with a subsequent user authentication. Such things are pretty hard to type into a telnet session by hand :-)

The name smtp-cli stands for:

  1. smtp-client
  2. Smtp-command Line Interface

Use smtp-cli if you want to:

  1. check mail server capabilities
  2. test the server setup
  3. create and send complex emails from scripts or cron-jobs

The smtp-cli usage is intuitive, everything is scriptable and can run in a completely non-interactive mode from various scripts or cron jobs. It is also ideal for shipping log files from remote machines, running periodical mail delivery test loops, etc. Also if you ever needed to send a complex email with attachments from a command line, this script is all you need.

Installation

Download the latest release from smtp-cli on GitHub and make it executable:

~ $ wget -o smtp-cli https://github.com/mludvig/smtp-cli/releases/{LATEST_RELEASE}
~ $ chmod +x smtp-cli

Optional dependencies

Some features of smtp-cli are optional and available only when the appropriate perl modules are installed:

  • RedHat Enterprise (RHEL), Fedora, Oracle Linux and CentOS users may want to install the following packages:

    $ sudo yum install  perl-IO-Socket-SSL  perl-Digest-HMAC  perl-TermReadKey  \
                          perl-MIME-Lite  perl-File-LibMagic  perl-IO-Socket-INET6

    If yum can't find them all try to enable EPEL repository.

  • openSUSE and SUSE Enterprise (SLES) users should install these packages:

    $ sudo zypper install  perl-IO-Socket-SSL  perl-Digest-HMAC  perl-TermReadKey  \
                             perl-MIME-Lite  perl-File-LibMagic  perl-IO-Socket-INET6
  • Users of Debian, Ubuntu and derivates should install these packages:

    $ sudo apt install  libio-socket-ssl-perl  libdigest-hmac-perl  libterm-readkey-perl \
                          libmime-lite-perl libfile-libmagic-perl libio-socket-inet6-perl

Users of other Linux distributions will have to find the appropriate packages by themselves, or install the modules directly from CPAN.

Donate please :)

Please consider donating, even if it's just enough for a coffee.

Donate with PayPal

Usage examples

These examples are for testing and verifying mail servers configurations:

Example 1 - Test your localhost

The simplest example - it will not actually send anything. Only connect to a server, do some SMTP chatting and disconnect.

$ ./smtp-cli --verbose --server localhost
[220] 'localhost ESMTP Postfix'
> EHLO localhost
[250] 'localhost'
[250] 'PIPELINING'
[250] 'SIZE 20480000'
[250] 'ETRN'
[250] '8BITMIME'
> QUIT
[221] 'Bye'

Example 2 - Send an e-mail through a host which requires encryption and authentication

Things are getting more interesting. We will use --server smtp.example.com:587 to connect to port 587 that is usually used by email clients (port 25 is usually for server-to-server communication). Port 587 also usually requires authentication.

For that we'll supply --user test and optional --password ... to supply the credentials. If the password is not supplied we will be asked interactively.

To actually send something we will also supply --from and --to parameters and also --data message.txt.

Note tat this message.txt must contain both the headers and the message body. If you don't want to bother with creating the message headers yourself use --body instead, see the next example for details.

$ ./smtp-cli --verbose --host smtp.example.com:587 --enable-auth --user test \
--from [email protected] --to [email protected] --data message.txt

[220] 'smtp.example.com ESMTP Postfix'
> EHLO localhost
[250] 'smtp.example.com'
[250] 'PIPELINING'
[250] 'SIZE 10240000'
[250] 'VRFY'
[250] 'ETRN'
[250] 'STARTTLS'
[250] 'XVERP'
[250] '8BITMIME'
Starting TLS...
> STARTTLS
[220] 'Ready to start TLS'
Using cipher: EDH-RSA-DES-CBC3-SHA
Subject Name: /C=XX/CN=smtp.example.com/[email protected]
Issuer  Name: /C=XX/CN=Example.COM Root CA/[email protected]
> EHLO localhost
[250] 'smtp.example.com'
[250] 'PIPELINING'
[250] 'SIZE 10240000'
[250] 'VRFY'
[250] 'ETRN'
[250] 'AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5'
[250] 'AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5'
[250] 'XVERP'
[250] '8BITMIME'
AUTH method (PLAIN LOGIN DIGEST-MD5 CRAM-MD5): using CRAM-MD5
> AUTH CRAM-MD5
[334] 'PDE0OTQyOTcxOC4yNjAwOTYwQHNlcnZlci5kb21haW4udG9wPg=='
> dGVzdCBmOTUyY2RkM2VlODBiMzk1YjYxNDI4NjBlYzg2Y2ExZnJvb3Q=
[235] 'Authentication successful'
Authentication of test@localhost succeeded
> MAIL FROM: <[email protected]>
[250] 'Ok'
> RCPT TO: <[email protected]>
[250] 'Ok'
> DATA
[354] 'End data with <CR><LF>.<CR><LF>'
[250] 'Ok: queued as C5C3A299D7'
> QUIT
[221] 'Bye'

Example 3 - Compose a plain text email with attachments

For composing emails you will need an optional MIME::Lite perl module. See the Optional dependencies section above for details.

$ ./smtp-cli [--server / --auth / --verbose flags] \
             --from [email protected] --to [email protected] \
             --subject "Simple test with attachments" \
             --body-plain "Log files are attached." \
             --attach /var/log/some.log@text/plain \
             --attach /var/log/other.log

This example composes a standard plain text email with two attachments. The interesting part is the syntax used for enforcing MIME-Type of the first attachment.

The syntax some.log@text/plain will make some.log attached as text/plain part, while the MIME-Type of other.log will be guessed by the script and eventually default to application/octet-stream.

Example 4 - Attachment as an email body

$ ./smtp-cli [--server / --auth / --verbose flags] \
             --from [email protected] --to [email protected] \
             --subject "Image as a mail body" \
             --attach /path/to/tux.png

If there is only one text or image file to be sent, the file itself could be the message body. At the same time it will be accessible as an attachment with a file name for easy saving. Best to show a screenshot I guess...

Attachment as an email body

There is no Text or HTML body part and the email is not multipart/mixed. All that is in the email is Tux the Penguin image. You can immediately see it in your mailer but also can easily save it with its provided name tux.png. The same way it works with text files (or files forced to be text/plain, to be precise).

Example 5 - Compose a multipart/alternative email with both HTML and Plain text part and inline images

Sending HTML emails is popular, especially among non-technical people. They like to change font colours, backgrounds, embed images and apply all sorts of other useless effects to their one short line of text. Indeed, me and you are more than happy with plain text and we both know that some mail readers can't even display colours and graphics at all (our office manager wouldn't believe!). Therefore it is a good practice for HTML messages to use multipart/alternative MIME format with both HTML and TEXT parts. In this example we're going to go wild and even embed an inlined image or two into the HTML part.

First of all prepare the message body. Or bodies, actually. The HTML one is body.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head></head>
<body bgcolor="#ffffff" text="#000000">
<div align="center">
Here comes embedded <font color="#006600"><b>Mr Tux</b></font><br>
<img src="cid:tux.png"><br>
<i>Nice, isn't it?</i><br>
<img src="cid:smiley.png"><br>
</div>
</body>
</html>

Note the <img> tags with cid:filename.xyz source β€” that's the way to refer inlined attachments from inside the message. We will obviously have to inline-attach tux.png and smiley.png to the message to make it work.

The second body file is a plain text representation of the above, call it body.txt:

Here comes embedded Mr Tux
... actually it doesn't ... 
Not in a text-only mail reader.
Sorry

That's it. Here comes the magic command line that puts it all together:

$ ./smtp-cli --from [email protected] --to [email protected] \
             --subject "HTML with embedded image" \
             --body-html body.html --body-plain body.txt \
             --attach-inline tux.png --attach-inline smiley.png

And this is what we get:

Multipart HTML email with embedded image

Donate please :)

Please consider donating, even if it's just enough for a coffee.

Donate with PayPal

Author

Michael Ludvig - get in touch through the Issues section above.

More Repositories

1

aws-ethereum-miner

CloudFormation template for mining Ethereum crypto currency on AWS
Python
268
star
2

aws-ssm-tools

Handy tools for AWS Systems Manager - ssm-session, ecs-session, ssm-ssh and ssm-tunnel
Python
231
star
3

mini-printf

Minimal printf() implementation for embedded projects.
C
165
star
4

yubikey-ldap

LDAP schema and tools for Yubico YubiKey authentication
Python
58
star
5

aws-utils

Useful AWS scripts and utilities
Shell
50
star
6

sss_deobfuscate

Decode obfuscated ldap_default_authtok from sssd.conf
Python
22
star
7

aws-crypto-miner

CloudFormation template for mining Ravencoin (RVN), Ergo (ERG), Kaspa (KAS), and Ethereum Classic (ETC) altcoins on AWS GPU-enabled EC2 instances, with a support for payouts in Bitcoin (BTC)
Python
16
star
8

gcp-ethereum-miner

Mine ETH on Google Cloud Platform
Shell
15
star
9

amazon-textract-parser

Amazon "Textract Results Parser" (trp) module packaged and improved for ease of use.
Python
15
star
10

nagios-plugins

Useful set of Nagios plugins
Perl
13
star
11

amazon-textract-cloudformation

Automated solution for parsing PDF files using Amazon Textract. Complete solution with CloudFormation template, Step Function State Machine, Lambda functions, etc.
Python
9
star
12

aws-ipranges-updater

Update AWS RouteTable and/or SecurityGroup with selected AWS IP prefixes
Python
5
star
13

ipset-init

IPset "init script" for automatic loading and saving existing ipset tables.
5
star
14

aws-polly

Make Raspberry Pi talk with AWS Polly
Python
3
star
15

ddns-cli

Dynamic DNS updater
Python
3
star
16

aws-cloudwatch-logmailer

AWS CloudWatch Logs watcher and mailer.
Python
3
star
17

net-policy

Manage per-user network policy with LDAP, OpenVPN and Linux firewall
Python
2
star
18

sms-cli

Command line SMS sender
Python
2
star
19

aws-standard-templates

CloudFormation templates for creating some standard EC2 stacks.
Python
2
star
20

messagemedia-simple

Easy to use Python module for sending SMS and MMS messages through MessageMedia API.
Python
1
star
21

filebench

Filebench is a file system and storage benchmark that allows to generate a large variety of workloads using rich Workload Model Language (WML). See http://filebench.sourceforge.net for more info.
C
1
star
22

scan2pdf

Scan documents to PDF from Linux command line.
Shell
1
star
23

guess-number-gym

Guess a Number - simple OpenAI Gym for reinforcement learning
Python
1
star
24

zoneminder-filter

Filter ZoneMinder events using image recognition (AWS Rekognition)
Python
1
star
25

ec2-start-stop

Demo of AWS EC2 Instance Start/Stop scheduling
Python
1
star