Skip to main content

Send a formatted email from the command line

Project description

Send Mail Via Python (smvp)

PyPI version Python versions License Status PyPI downloads


smvp logo

The smvp utility reads a file, uses its contents as the body of an email, and sends it to a specified recipient. The input file can be a text file with ANSI color codes, HTML, or plain text. The resulting message is sent as a multipart MIME email that renders properly in both plain text and HTML. The --content-type option can auto-detect the input type or force it to be handled as plain text or HTML.

Note: The file itself is not sent as an attachment; instead, the contents of the file are put into the body of the email.

Use Case

There are probably several use cases, but I wrote smvp for two primary reasons:

  1. Configuring postfix and sendmail was more trouble than I wanted.
  2. I want my cron scripts to email me status information and the contents of various log files. Some of the files contain ANSI escape sequences for terminal colors. The smvp utility converts those ANSI escape sequences into styled HTML, so the emails I get are nicely formatted. You could set $MAILTO in your crontab, but you would not get proper handling of ANSI escape sequences, and you would still have the problem mentioned in item 1.

Installation

Use your preferred Python package installer for command line tools, for example:

pipx install smvp

or

uv tool install smvp

or

python3 -m venv .venv
source .venv/bin/activate
pip3 install smvp

Requirements

First

Make sure the following environment variables are set and exported in your current shell:

export SMVP_USER="<your email>"    # e.g. "myemail@gmail.com"
export SMVP_TOKEN="<your token>"   # e.g. "<gmail app password>"
export SMVP_SERVER="<smtp server>" # e.g. "smtp.gmail.com"

It is recommended that you add the lines above to your shell startup file (.bashrc, .zshrc, etc.) so they are available across multiple shell sessions and processes. To confirm that the environment variables are set correctly, run this in a terminal:

set | grep ^SMVP_

Note: If you make changes to your "rc" file, make sure to source it or open a new terminal window before running smvp again.


Tip: If you're using cron and sending mail with smvp from within a script, make sure to include the environment variables at the top of your crontab so your scripts will have access to them during execution. Also include a line in your script that exports the directory where your Python tool installer places executables. For example, if you're using uv on Ubuntu, you could put something like this near the top of your bash script:

# Setup PATH export so the script can find installed Python tools
export PATH="$PATH:/home/<yourhome>/.local/bin"

Second

The SMVP_SERVER you select must support secure TLS connections on port 587. Check the SMTP settings for your email provider. This is the default TLS port on Gmail, so if you are using your Gmail account to send email, this requirement is usually already satisfied.

Styling

smvp offers custom font and font size options for your email. The default font for formatted HTML email is Courier New, 12px. Beyond the default, you can choose any font size from 2px up to and including 100px, from the following font families:

"Andale Mono", "Arial", "Brush Script MT", "Comic Sans MS",
"Courier New", "Garamond", "Georgia", "Helvetica", "Impact",
"Luminari", "Monaco", "Tahoma", "Times New Roman", "Trebuchet MS",
"Verdana", "fantasy", "monospace", "sans-serif", "serif"

Note: Not every font will render properly on every device. When in doubt, fonts like: "monospace", "sans-serif", "fantasy", and "serif" are pretty safe. You may just have to try a few options to land on the right one for your use case.

Content Type

By default, smvp uses --content-type auto, which inspects the input and decides whether to treat it as plain text or HTML. You can override that behavior when needed:

auto  Auto-detect whether the input should be treated as text or HTML
text  Always treat the input as plain text, including HTML-like content
html  Always treat the input as HTML

This is useful when the input contains angle brackets that should be sent literally, or when you want to force HTML rendering for a file that would not otherwise be detected as HTML.

Usage

usage: smvp [-h] [-c {auto,text,html}] [-f FONT_FAMILY] [-s FONT_SIZE] [-v] recipient subject file

For example:

smvp friend@gmail.com "Hello, Friend" ~/logfile.txt -f "Trebuchet MS" -s 14

Force plain-text handling for HTML-like input:

smvp friend@gmail.com "Raw Markup" ./snippet.txt --content-type text

Force HTML handling:

smvp friend@gmail.com "Rendered Markup" ./fragment.txt --content-type html

For more details, run:

smvp -h

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

smvp-0.4.0.tar.gz (8.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

smvp-0.4.0-py3-none-any.whl (9.7 kB view details)

Uploaded Python 3

File details

Details for the file smvp-0.4.0.tar.gz.

File metadata

  • Download URL: smvp-0.4.0.tar.gz
  • Upload date:
  • Size: 8.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for smvp-0.4.0.tar.gz
Algorithm Hash digest
SHA256 f493112c1c7f50f29e85fed51baaec0a5d5e57dd8999b7a1acca6d62b7c22de4
MD5 d4c67db3bfa888b76f57d4118b51dcd1
BLAKE2b-256 8015c376a18da27ee5cddbd4887f04717a5a6f48770493863d32fd67069c514d

See more details on using hashes here.

File details

Details for the file smvp-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: smvp-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 9.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for smvp-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 374655ac5a609bb1f65be924e17c8ff6b34bc42358912f811ba40cae2c8df3b4
MD5 cf16c8f8675a022f7f464b4ec3e10e95
BLAKE2b-256 8c6ef50b2e12e6c2838f3b53fc22bca46a2ea38e216dc181c421ff8e01fbbf7d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page