Send templated email and SMS to a CSV contact list, safely, from your terminal.
Write one message with {{placeholders}}, point messengerr at a CSV, and it validates the contacts, shows you exactly what will go out, sends through your provider, and keeps a record of every result.
Documentation: jalappeno-apps.github.io/messengerr
Requires Ruby 3.2 or newer.
gem install messengerrmessengerr credentials setup postmark # or clicksend; keys are verified live, then stored encrypted
messengerr send --dry-run # walk the wizard and preview, sending nothing
messengerr send # preview, confirm, sendEvery wizard question also has a flag, so a send can be one command. Preview it anywhere with --dry-run, then run the same command without it in a terminal:
messengerr send --method email --csv contacts.csv --contact email --map name=name \
--message "Hi {{name}}, your invoice is ready." --subject "Invoice for {{name}}" --dry-runA real send is refused unless a person is at a terminal (so an automated shell can prepare and preview, but not send).
Given a CSV like
name,email,plan
Ann,ann@example.com,Pro
Bob,bob@example.com,Team
and the message Hi {{name}}, your {{plan}} invoice is ready., the preview shows:
--- Preview (2 messages) ---
To: ann@example.com
Subject: Invoice for Ann
Body: Hi Ann, your Pro invoice is ready.
...
- Preview first. You see the count and the first rendered messages, then confirm.
--dry-runsends nothing. - Bad data is surfaced, not sent. Invalid contacts are listed by row. A malformed or empty placeholder aborts the run instead of going out as literal text.
- See the real thing. HTML emails (
--html letter.html) are written to a preview file you can open in a browser before you confirm. Values from the CSV are HTML-escaped. - A record of every result. Each outcome is appended to a ledger as it happens, so a crash or Ctrl-C never loses track of who was messaged.
- Resume without guessing.
--resumeskips recipients already sent. Failures that might already have been delivered are marked uncertain and flagged before you retry.
| Integration | Delivers |
|---|---|
| Postmark | |
| ClickSend | SMS |
New providers follow a small contract. See Writing an integration.
messengerr sends plain-text messages (typed as one line, or multi-line from a file) and HTML email from a file, with no attachments, and does not track delivery. It adds no unsubscribe links and does not check consent: laws such as CAN-SPAM, GDPR/PECR and the TCPA are the sender's responsibility. Credentials are stored in an encrypted file under ~/.config/messengerr, with the key beside it by default, and gem uninstall does not remove them. Read Limitations and Credentials before a large send.
Bug reports and pull requests are welcome. Start with CONTRIBUTING.md and STYLE.md.
Released under the MIT License.
Maintained by Daiwick. Questions and enquiries: developers@daiwick.com. Bugs and feature requests: GitHub issues. Security reports: see SECURITY.md.