Watches on an IMAP server using IDLE command and execute external command on new messages.
bundle install
bundle exec ruby lib/app.rb \
--server mail.example.org \
--tls \
--user me \
--password 12345 \
--inbox INBOX \
--command "jq --exit-status '.subject | contains(\"error\")' && mpv bell.wav"
Alternatively, you can store those parameters in ~/.config/imap-watcher/config.json
, or other files specified in --config
parameter.
Example:
{
"server": "mail.example.org",
"tls": true,
"user": "me",
"password": "12345",
"inbox": "INBOX",
"command": "jq --exit-status '.subject | contains(\"error\")' && mpv bell.wav"
}
Mails are passed to the standard input of the command in as a JSON object.
Example (pretty printed for the sake of readability):
{
"uid": 12345,
"timestamp": 1672531200,
"message_id": "0000000@example.org",
"from": ["test@example.org"],
"to": ["test@example.org"],
"cc": [],
"subject": "test",
"source": null
}
Keys:
uid
: IMAP UID of the mail. Not available for dead letters.timestamp
: The UNIX time of theDate
header.message_id
: TheMessage-ID
header without angle brackets.from
: An array of theFrom
header addresses without angle brackets.to
: An array of theTo
header addresses without angle brackets.cc
: An array of theCc
header addresses without angle brackets.subject
: The decodedSubject
header.source
: The entire RFC 5322 message. Available only if--fetch-source
is set.
-
--config
PATH
Path to configuration file.
Default: $XDG_CONFIG_HOME/imap-watcher/config.json.
The configuration file should contain JSON object.
Its keys are the command line option names. -
--server
SERVER
IMAP server name. -
--port
PORT
IMAP Port.
Default: 143 for unencrypted server. 993 for encrypted server -
--user
USER
User name. -
--password
PASSWORD
Password. -
--command
COMMAND
Command to execute on mails. Evalueated by the shell. -
--dead-letter-command
COMMAND
Command to execute on dead letters. Evalueated by the shell.
Default: command given by--command
-
--mailbox
MAILBOX
Mailbox to watch.
Default:INBOX
. -
--fetch-source
Fetch entire RFC 5322 message. -
--database
PATH
Path to database.
Default:$XDG_DATA_HOME/imap-watcher/mails.sqlite3
. -
--tls
Encrypt connection using TLS.
Sometimes called SSL. Not to be confused with--starttls
. -
--starttls
Encrypt connection using STARTTLS.
Not to be confused with--tls
. -
--[no-]verify
Verify server when--tls
or--starttls
is used.
Default: verify the server. -
--certificate
PATH
Path to CA certificate file/directory. -
--initial-fetch-count
COUNT
Number of mails to be fetched on the initial startup.
Default: 10.
Those mails are not passed to the executable. -
--dead-letter-retry-interval
COUNT
Interval between re-delivering dead letters, in seconds.
Default: 3600. -
--debug
Show communications between the IMAP server. -
-h
,--help
Prints the help.
imap-watcher
struggles to deliver massage at-least-once. If imap-watcher
exits abnormally, it will deliver the mail on the next time. Nevertheless, it may lose mails if mails are deleted on the server before delivered.
To be precise, If the command returns non-zero exit status, dead letter command given by --dead-letter-command
, default to the command given by --command
, is invoked, and if the command returns non-zero exit status again, the mail is queued to the dead letter queue. Then mails in the dead letter queue will be re-delivered at start up and at intervals of --dead-letter-retry-interval
seconds.
A SQLite3 database is created at ~/.local/share/imap-watcher/mails.sqlite3
or any path specified by --database
. It contains known message IDs, last known UID
and UIDVALIDITY
, and the dead letter queue.
# Run linters.
bundle exec rake lint
# Generate YARD documents.
bundle exec rake doc
MIT. See LICENSE.md for details. Copyright (c) 2023 taku0.