Message Cat: an MUA tool to migrate emails between IMAP servers and manage emails using filters written in Ruby DSL.
Directory structure:
- Gemfile
- .sekrets.key
- config.yml.enc
- migration.yml
- migration.rb
$ gem install bundler
$ bundle init
Gemfile:
source 'https://rubygems.org'
gem 'message-cat', git: 'https://github.com/mh61503891/message-cat'
gem 'sekrets'
gem 'activesupport'
Install gems
$ bundle install
Create the config file for IMAP servers:
$ echo 'master-password' > .sekrets.key
$ bundle exec sekrets edit config.yml.enc
config.yml.enc:
servers:
src:
user: example
password: example
dst:
user: example
password: example
}
}
migration.yml:
servers:
src:
host: example.net
separator: .
dst:
host: example.com
separator: .
mailboxes:
- example.project_a
- example.project_b
- example.project_c
migration.rb:
require 'sekrets'
require 'yaml'
require 'active_support/core_ext/hash/keys'
require 'active_support/core_ext/hash/deep_merge'
require 'message-cat/migration'
# Load secret config
secret_config = Sekrets.settings_for('config.yml.enc').deep_symbolize_keys
# Load non-secret config
migration_config = YAML.load(File.read('migration.yml')).deep_symbolize_keys
# Merge configs
config = migration_config.deep_merge(secret_config)
# Run migration
MessageCat::Migration.run(config)
$ bundle exec ruby migration.rb
10000 migrate(example.project_a) Example message
10001 migrate(example.project_b) Example message
10002 migrate(example.project_c) Example message
...
Directory structure:
- Gemfile
- .sekrets.key
- config.yml.enc
- filters.yml
- filters.rb
- filters/
- example_filter_1.rb
- example_filter_2.rb
- example_filter_3.rb
- ...
- database.sqlite3
$ gem install bundler
$ bundle init
Gemfile:
source 'https://rubygems.org'
gem 'message-cat', git: 'https://github.com/mh61503891/message-cat'
gem 'sekrets'
gem 'activesupport'
Install gems
$ bundle install
Create the config file for IMAP servers:
$ echo 'master-password' > .sekrets.key
$ bundle exec sekrets edit config.yml.enc
config.yml.enc:
server:
user: example
password: example
filters.yml:
server:
host: example.net
separator: .
mailboxes:
- Inbox
filters_paths:
- ./filters
database_path: ./database.sqlite3
filters.rb:
require 'sekrets'
require 'yaml'
require 'active_support/core_ext/hash/keys'
require 'active_support/core_ext/hash/deep_merge'
require 'message-cat/filters'
# Load secret config
secret_config = Sekrets.settings_for('config.yml.enc').deep_symbolize_keys
# Load non-secret config
filters_config = YAML.load(File.read('filters.yml')).deep_symbolize_keys
# Merge configs
config = filters_config.deep_merge(secret_config)
# Run filters
MessageCat::Filters.run(config)
filters/example_filter_1.rb:
pattern('notification.example_net') {
from_addrs 'notify@example.net'
}
pattern('notification.example_com') {
from_addrs 'notify@example.com'
}
pattern('example') {
from_addrs [
'example@example.net',
/@(.*)example\.com$/,
]
subject /^Example/
message {
from_addrs.size == 1
to_addrs.size > 1
}
}
rule {
patterns [
'notification.example_net',
'notification.example_com',
]
actions {
move 'notification'
}
}
rule {
patterns 'example'
actions {
move 'example'
}
}
$ bundle exec ruby filters.rb
10000 move(notification.example_net) Notify message
10001 move(notification.example_com) Notify message
10002 move(example) Example message
...
MessageCat::Filters:
- Filter DSL API
- pattern
- from_addrs(patterns)
- to_addrs(patterns)
- cc_addrs(patterns)
- subject(patterns)
- message(&block)
- from_addrs
- to_addrs
- cc_addrs
- subject
- rule/patterns
- rule/actions
- move(mailbox)
- pass
- none
- pattern
- Support the database of emails for cacheing
- Support encryption of the database
The gem is available as open source under the terms of the MIT License.
Masayuki Higashino