wafflesbot: Email auto reply bot for JMAP mailboxes
wafflesbot sends form replies to unreplied emails in a JMAP mailbox (such as Fastmail).
wafflesbot excels at automatically asking tech recruiters for compensation information.
Built on:
Installation and usage with Docker
A Docker container is provided which runs wafflesbot to reply to emails via JMAP server events. JMAP API authentication and reply details should be configured using environment variables.
Example docker-compose.yaml:
version: "3.7"
secrets:
jmap_api_token:
file: path/to/file/with/your/jmap_api_token
services:
waffles:
image: ghcr.io/smkent/waffles:latest
environment:
JMAP_HOST: jmap.example.com
JMAP_API_TOKEN: /run/secrets/jmap_api_token
WAFFLES_MAILBOX: folder-or-label-name
WAFFLES_REPLY_FILE: /autoreply.html
# WAFFLES_DRY_RUN: "true" # Uncomment to log actions but not send email
# WAFFLES_DEBUG: "true" # Uncomment to increase log verbosity
# Set TZ to your time zone. Often same as the contents of /etc/timezone.
TZ: PST8PDT
restart: unless-stopped
volumes:
- path/to/your/reply/content.html:/autoreply.html:ro
secrets:
- jmap_api_token
Start the container by running:
docker-compose up -d
Debugging information can be viewed in the container log:
docker-compose logs -f
Installation from PyPI
wafflesbot is available on PyPI:
pip install wafflesbot
Usage
wafflesbot provides the waffles command, which can either:
- Run as a service and reply to emails received via JMAP server events (the default)
- Run as a script to examine recent emails (such as interactively or via a cronjob)
Environment variables:
JMAP_HOST: JMAP server hostnameJMAP_API_TOKEN: JMAP account API token
Required arguments:
-m/--mailbox: Name of the folder to process-r/--reply-content: Path to file with an HTML reply message
Optional arguments:
-d/--debug: Enable debug logging-l/--limit: Maximum number of emails replies to send (only valid with-s/--script)-n/--days: Only process email received this many days ago or newer (only valid with-s/--script)-p/--pretend: Print messages to standard output instead of sending email-s/--script: Set to run as a script instead of an event-driven service
Invocation examples
Listen for new emails, and reply to unreplied messages that appear in the
"Recruiters" folder with the message in my-reply.html:
JMAP_HOST=jmap.example.com \
JMAP_API_TOKEN=ness__pk_fire \
waffles \
--mailbox "Recruiters" \
--reply-content my-reply.html
Run as a script and reply to unreplied messages in the "Recruiters" folder with
the message in my-reply.html:
JMAP_HOST=jmap.example.com \
JMAP_API_TOKEN=ness__pk_fire \
waffles \
--script \
--mailbox "Recruiters" \
--reply-content my-reply.html
Development
Poetry installation
Via pipx:
pip install pipx
pipx install poetry
pipx inject poetry poetry-pre-commit-plugin
Via pip:
pip install poetry
poetry self add poetry-pre-commit-plugin
Development tasks
- Setup:
poetry install - Run static checks:
poetry run poe lintorpoetry run pre-commit run --all-files - Run static checks and tests:
poetry run poe test
Created from smkent/cookie-python using cookiecutter
Metadata
Release files for wafflesbot 0.1.21
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| wafflesbot-0.1.21.tar.gz | 22.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| wafflesbot-0.1.21-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 44.6 kB
Release files / wafflesbot-0.1.21.tar.gz
| Download URL | wafflesbot-0.1.21.tar.gz |
|---|---|
| Size | 22.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f59097c9a2114f46393aab7006e4769c06e09484907b2999684404d2a5f3f12a
|
|
BLAKE2b-256 checksum How to use checksums |
e5678de50ca5857db8d11865b28ed3190130d71dd23b4f3892dc346ccb842239
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.0.1 CPython/3.12.8
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 15, 2025.
Transparency logRelease files / wafflesbot-0.1.21-py3-none-any.whl
| Download URL | wafflesbot-0.1.21-py3-none-any.whl |
|---|---|
| Size | 22.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a008595ceb7e52d626cf5971f0f2a425395b9ba5895f35d5e70d443872418933
|
|
BLAKE2b-256 checksum How to use checksums |
61f8555ce6e1d56438389dece2a6603f75570be59fe26c698f335c25677de9ea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.0.1 CPython/3.12.8
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 15, 2025.
Transparency log