Skip to main content

A simple, self-hosted bulk mailing application with a web-based UI.

Project description

Bit by Mail Banner

Send personalized bulk emails from your own machine, using your own SMTP account. No subscriptions, no third-party servers, no data leaving your computer.


Why bit-by-mail

Most bulk email tools are SaaS platforms, where you upload your recipient list to someone else's server and pay a monthly fee for the privilege. bit-by-mail flips that: it's a lightweight local app that runs on your machine and sends through your own email provider. Your data stays yours, and there's nothing to pay for.

Features

  • Local and private — runs entirely on your machine; nothing is uploaded anywhere
  • Bring your own SMTP — works with Gmail, Outlook, Yahoo, or a custom domain; supports multiple accounts with a default sender fallback
  • Dynamic personalization — one template, personalized per recipient using variables from your CSV ({{FirstName}}, {{InvoiceAmount}}, etc.)
  • Personalized attachments — send different files to different recipients in the same campaign (certificates, invoices, reports)
  • Rich text or raw HTML — use the WYSIWYG editor, or drop into a Monaco-based HTML editor for full control
  • Preflight checks — simulates the send beforehand to catch missing variables, missing attachments, or invalid addresses
  • Reusable libraries — save recipient databases and templates so you're not rebuilding them every time
  • Live analytics — real-time dispatch logs, success/failure tracking, and exportable CSV delivery reports

Getting Started

Install

pip install bit-by-mail

Requires Python 3.9 or later.

Launch

bit-by-mail
# or, for short:
bbm

The app opens automatically in your browser at http://localhost:8888.

Connect your email account

  1. Go to Settings in the sidebar.
  2. Click Add Account and enter your SMTP details (e.g. smtp.gmail.com, port 587).
  3. Enter your email and password.

Using Gmail? Google blocks sign-ins with your regular password. Generate an App Password instead and use that.

Prepare your recipient list

Recipients are loaded from a CSV file with a header row.

Column Required Notes
Name Yes Used for personalization
Email Yes Recipient address
AttachmentFile No Separate multiple files with ;
anything else No Any extra column becomes a placeholder automatically

Example:

Name Email AttachmentFile TicketType
John Doe john@example.com john_pass.pdf VIP
Jane Smith jane@example.com jane_pass.pdf; map.png Standard

Run a campaign

  1. Campaigns → New Campaign
  2. Upload your CSV, or import a saved database
  3. Write your subject and body, using placeholders like {{Name}} or {{TicketType}}
  4. Check the Preview panel to confirm placeholders render correctly
  5. Run Preflight to catch problems before sending
  6. Click Start Sending

Advanced

Asset Library — store image URLs (including Google Drive links) and drop them into your templates without re-uploading each time.

Throttling — add a delay (in seconds) between sends in Campaign Settings to stay under provider rate limits and avoid spam filters.

Resume on failure — if a campaign is interrupted, bit-by-mail remembers who's already been sent to. Hit send again and it only processes the recipients still marked PENDING.

Troubleshooting

  • Emails aren't sending — double-check your SMTP host and port, and confirm you're using an app password rather than your account password if your provider requires one.
  • Placeholder shows up literally in the email (e.g. {{FirstName}}) — the column name in your CSV doesn't match the placeholder exactly; names are case-sensitive.
  • Attachment not found errors during Preflight — check that file paths in AttachmentFile are correct relative to where you're running the app, and that multiple files are separated by ; with no typos.


Rich Text/HTML Editor with Live Preview & Placeholders
Email Editor

Contributing

Issues and pull requests are welcome. If you run into a bug or have an idea for a feature, open an issue on GitHub.

License

See the LICENSE file for details.

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

bit_by_mail-2.2.0.tar.gz (3.8 MB view details)

Uploaded Source

Built Distribution

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

bit_by_mail-2.2.0-py3-none-any.whl (3.9 MB view details)

Uploaded Python 3

File details

Details for the file bit_by_mail-2.2.0.tar.gz.

File metadata

  • Download URL: bit_by_mail-2.2.0.tar.gz
  • Upload date:
  • Size: 3.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for bit_by_mail-2.2.0.tar.gz
Algorithm Hash digest
SHA256 ba1540b4e723dc0b04d05e47e1be326ae5998fcee34f1d1579acae18ae0b2121
MD5 98c27d067dc52676bfb1f273e7763a72
BLAKE2b-256 5b70d57ac8658068f140e62a013a31ae8df5483ea3d999f382c1764315af16e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for bit_by_mail-2.2.0.tar.gz:

Publisher: publish.yml on IOIT-ACM/bit-by-mail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bit_by_mail-2.2.0-py3-none-any.whl.

File metadata

  • Download URL: bit_by_mail-2.2.0-py3-none-any.whl
  • Upload date:
  • Size: 3.9 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for bit_by_mail-2.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 438aa264c2a5b4abf233076e1d82a061f0070a98d248779ad503fc3e906edcb3
MD5 7d50c1face5823c68094a0e305a6d1f8
BLAKE2b-256 ef62504db9b3f11b11d20b5408a43ca3861be22fd43beb27e28ceb2b9ed14a67

See more details on using hashes here.

Provenance

The following attestation bundles were made for bit_by_mail-2.2.0-py3-none-any.whl:

Publisher: publish.yml on IOIT-ACM/bit-by-mail

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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