Mail Format
mailfmt is a simple plain text email formatter. It's designed to ensure
consistent paragraph spacing while preserving markdown syntax, email
headers, sign-offs, and signature blocks.
By default, the command accepts its input on stdin and prints to
stdout. This makes it well suited for use as a formatter with a text
editor like Kakoune or Helix.
Features
- Wraps emails at specified columns.
- Automatically reflows paragraphs.
- Squashes consecutive paragraph breaks.
- Preserves:
- Any long word not broken by spaces (e.g. URLs, email addresses).
- Quoted lines.
- Indented lines.
- Lists.
- Markdown-style code blocks.
- Usenet-style signature block at EOF.
- Sign-offs.
- If specified, output can be made safe for passing to a Markdown
renderer.
- Use case: piping the output to
pandocto write atext/htmlmessage. See Markdown Safety.
- Use case: piping the output to
Installation
mailfmt is intended for use as a standaole tool. The package is
available on PyPI as mailfmt. I recommend using
uv or pipx to install it so the
mailfmt command is available on your path:
uv tool install mailfmt
Verify that the installation was successful:
mailfmt --help
Usage
usage: mailfmt [-h] [-w WIDTH] [-b] [--no-replace-whitespace] [--no-reflow]
[--no-signoff] [--no-signature] [--no-squash] [-m] [-i INPUT]
[-o OUTPUT]
Formatter for plain text email.
"--no-*" options are NOT passed by default.
options:
-h, --help show this help message and exit
-w, --width WIDTH Text width for wrapping. (default: 74)
-b, --break-long-words
Break long words while wrapping. (default: False)
--no-replace-whitespace
Don't normalize whitespace when wrapping.
--no-reflow Don't reflow lines.
--no-signoff Don't preserve signoff line breaks.
--no-signature Don't preserve signature block.
--no-squash Don't squash consecutive paragraph breaks.
-m, --markdown-safe Output format safe for Markdown rendering.
-i, --input INPUT Input file. (default: STDIN)
-o, --output OUTPUT Output file. (default: STDOUT)
Author : Daniel Fichtinger
Contact: daniel@ficd.sh
Output Example
Before:
Hey,
This is a really long paragraph with lots of words in it. However, my text editor uses soft-wrapping, so it ends up looking horrible when viewed without wrapping! Additionally,
if I manually add some line breaks, things start to look _super_ janky!
I can't just pipe this to `fmt` because it may break my beautiful
markdown
syntax. Markdown formatters are also problematic because they mess up
my signoff and signature blocks! What should I do?
Best wishes,
Daniel
--
Daniel
daniel@ficd.sh
After:
Hey,
This is a really long paragraph with lots of words in it. However, my text
editor uses soft-wrapping, so it ends up looking horrible when viewed
without wrapping! Additionally, if I manually add some line breaks, things
start to look _super_ janky!
I can't just pipe this to `fmt` because it may break my beautiful markdown
syntax. Markdown formatters are also problematic because they mess up my
signoff and signature blocks! What should I do?
Best wishes,
Daniel
--
Daniel
daniel@ficd.sh
Markdown Safety
In some cases, you may want to generate an HTML email. Ideally, you'd want the HTML to be generated directly from the plain text message, and for both versions to be legible and have the same semantics.
Although mailfmt was written with Markdown markup in mind, its intended
output is still the text/plain format. If you pass its output directly
to a Markdown renderer, line breaks in sign-offs and the signature block
won't be preserved.
If you invoke mailfmt --markdown-safe, then \ characters will be
appended to mark line breaks that would otherwise be squashed, making the
output suitable for conversion into HTML. Here's an example of one such
pipeline:
cat message.txt | mailfmt --markdown-safe | pandoc -f markdown -t html
--standalone > message.html
Here's the earlier example message with markdown safe output:
Hey,
This is a really long paragraph with lots of words in it. However, my text
editor uses soft-wrapping, so it ends up looking horrible when viewed
without wrapping! Additionally, if I manually add some line breaks, things
start to look _super_ janky!
I can't just pipe this to `fmt` because it may break my beautiful markdown
syntax. Markdown formatters are also problematic because they mess up my
signoff and signature blocks! What should I do?
Best wishes, \
Daniel \
-- \
Daniel \
daniel@ficd.sh \
Aerc Integration
For integration with aerc, consider adding the following to your
aerc.conf:
[multipart-converters]
text/html=mailfmt --markdown-safe | pandoc -f markdown -t html --standalone
When you're done writing your email, you can call the
:multipart text/html command to generate a multipart/alternative
message which includes both your original text/plain and the newly
generated text/html content.
Release files for mailfmt 1.0.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mailfmt-1.0.4.tar.gz | 6.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mailfmt-1.0.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size:12.8 kB
Release files / mailfmt-1.0.4.tar.gz
| Download URL | mailfmt-1.0.4.tar.gz |
|---|---|
| Size | 6.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ad979921f16f4aede37d1fbb5a90ecf12e10f54dfeb9638c9aaff297136cb4fe
|
|
BLAKE2b-256 checksum How to use checksums |
908cbf9e73b64fb7310d6875792094ab2f07f026467f060e3ff484410e5181ed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.7.9
|
Release files / mailfmt-1.0.4-py3-none-any.whl
| Download URL | mailfmt-1.0.4-py3-none-any.whl |
|---|---|
| Size | 5.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5d9943c53d8c993b38f82bc39edd1b80df50d978cfbe53caea4a0fc3b1fe969f
|
|
BLAKE2b-256 checksum How to use checksums |
eb09cbafb6a26bda67e5fcb22af07b2709aae39dcece98927fbf23f881420f4e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.7.9
|