dmail 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +52 -0
- data/Rakefile +14 -0
- data/bin/dmail +10 -0
- data/lib/dmail.rb +2 -0
- data/lib/dmail/cli.rb +47 -0
- data/lib/dmail/impl.rb +79 -0
- data/lib/dmail/utils.rb +61 -0
- data/lib/dmail/version.rb +4 -0
- metadata +123 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d5f2d2e3bb5cb137ca9438d21e36fcbfd19b7443
|
4
|
+
data.tar.gz: 6358fb1c7b1b9cf269c90f719ab95cac1c0c4104
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3a2672eb406365b0edeeb3b0acca1f5075da987ff839c6e7ca51b8ee073a1efe44530eea50c9c894a442d41a7322c196b72922af56a46e9579c73f8cbd9dc8d4
|
7
|
+
data.tar.gz: a53e8a5c963fe80e0614fa9439c04c96d655189d79230c3fcbaef57defd08b6db315b474494f488aa3a5082bef0915e8d28ef60b686579728f00fb04699bde28
|
data/README.md
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# dmail
|
2
|
+
|
3
|
+
Command-line email client.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
$ gem install dmail
|
8
|
+
|
9
|
+
## Setup
|
10
|
+
|
11
|
+
dmail reads settings firstly from ``.dmailrc.yaml`` and fallbacks to ``~/.dmailrc.yaml``.
|
12
|
+
|
13
|
+
Gmail setup:
|
14
|
+
|
15
|
+
``` yaml
|
16
|
+
dmail:
|
17
|
+
reading:
|
18
|
+
method: imap
|
19
|
+
address: imap.gmail.com
|
20
|
+
port: 993
|
21
|
+
enable_ssl: true
|
22
|
+
user_name: me@gmail.com
|
23
|
+
password: myp4ssw0rd
|
24
|
+
```
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
Listing emails:
|
29
|
+
|
30
|
+
``` bash
|
31
|
+
$ dmail list
|
32
|
+
```
|
33
|
+
|
34
|
+
Viewing emails:
|
35
|
+
|
36
|
+
``` bash
|
37
|
+
$ dmail show CAC0GtHcR13bnhLju=DymZm0fr778LALHw3HwWUVXrM81c4Hc+Q@mail.gmail.com
|
38
|
+
```
|
39
|
+
|
40
|
+
## Contributing
|
41
|
+
|
42
|
+
You're encouraged to submit issues, PRs and weigh in your opinion anywhere. If you want to get started,
|
43
|
+
feel free to contact the authors either directly or through a new issue. We also love documentation so
|
44
|
+
feel free to extend this README.
|
45
|
+
|
46
|
+
## License
|
47
|
+
|
48
|
+
MIT License. See LICENSE for details.
|
49
|
+
|
50
|
+
## Copyright
|
51
|
+
|
52
|
+
Copyright (c) 2014 André Dieb Martins
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'bundler/setup'
|
5
|
+
rescue LoadError
|
6
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'bundler/gem_tasks'
|
10
|
+
|
11
|
+
require 'rspec/core'
|
12
|
+
require 'rspec/core/rake_task'
|
13
|
+
|
14
|
+
task default: :spec
|
data/bin/dmail
ADDED
data/lib/dmail.rb
ADDED
data/lib/dmail/cli.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'mail'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
require File.join(File.dirname(__FILE__), 'impl')
|
5
|
+
|
6
|
+
module Dmail
|
7
|
+
class CLI
|
8
|
+
include Impl
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@action = ARGV.first.gsub('--', '')
|
12
|
+
@coloring = true
|
13
|
+
load_settings
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
send(@action)
|
18
|
+
rescue NoMethodError
|
19
|
+
puts "dmail: '#{ARGV[0]}' is not a valid dmail command. See 'dmail help'."
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def load_settings
|
25
|
+
preferences ||= if File.exists?('.dmailrc.yaml')
|
26
|
+
YAML.load(IO.read('.dmailrc.yaml'))
|
27
|
+
elsif File.exists?('~/.dmailrc.yaml')
|
28
|
+
YAML.load(IO.read('~/.dmailrc.yaml'))
|
29
|
+
else
|
30
|
+
fail('dmail: could not find .dmailrc.yaml here or on your home directory.')
|
31
|
+
end
|
32
|
+
|
33
|
+
retriever_preferences = preferences['dmail']['reading']
|
34
|
+
|
35
|
+
Mail.defaults do
|
36
|
+
retriever_method(
|
37
|
+
retriever_preferences['method'].to_sym,
|
38
|
+
address: retriever_preferences['address'],
|
39
|
+
port: retriever_preferences['port'],
|
40
|
+
user_name: retriever_preferences['user_name'],
|
41
|
+
password: retriever_preferences['password'],
|
42
|
+
enable_ssl: retriever_preferences['enable_ssl']
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/dmail/impl.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'mail'
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), 'utils')
|
4
|
+
|
5
|
+
module Dmail
|
6
|
+
module Impl
|
7
|
+
include Utils
|
8
|
+
include Term::ANSIColor
|
9
|
+
|
10
|
+
DOCS_PATH = File.join(File.dirname(__FILE__), '..', '..', 'doc')
|
11
|
+
|
12
|
+
def help
|
13
|
+
doc = ARGV[1].nil? ? 'main.txt' : "dmail-#{ARGV[1]}.txt"
|
14
|
+
puts IO.read(File.join(DOCS_PATH, doc))
|
15
|
+
end
|
16
|
+
|
17
|
+
def list
|
18
|
+
params = get_params(
|
19
|
+
:mailbox,
|
20
|
+
count: %w(-c --count),
|
21
|
+
unread: %w(-u --unread)
|
22
|
+
)
|
23
|
+
query = { read_only: true, order: :asc, what: :first }
|
24
|
+
query[:mailbox] = params[:mailbox] || 'INBOX'
|
25
|
+
query[:count] = params[:count].nil? ? 10 : params[:count].to_i
|
26
|
+
query[:keys] = 'UNSEEN' if params[:unread]
|
27
|
+
|
28
|
+
setup_pager!
|
29
|
+
Mail.find(query).each { |email| print_email_header(email) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def show
|
33
|
+
params = get_params(
|
34
|
+
:mailbox,
|
35
|
+
leave_unread: %w(-m --leave-unread)
|
36
|
+
)
|
37
|
+
query = {}
|
38
|
+
query[:mailbox] = params[:mailbox] || 'INBOX'
|
39
|
+
query[:read_only] = true if params[:leave_unread]
|
40
|
+
|
41
|
+
message_id = ARGV[1]
|
42
|
+
if message_id then
|
43
|
+
query[:keys] = "HEADER Message-id #{message_id}"
|
44
|
+
else
|
45
|
+
query[:what] = :last
|
46
|
+
query[:count] = 1
|
47
|
+
end
|
48
|
+
|
49
|
+
setup_pager!
|
50
|
+
[Mail.find(query)].flatten.each do |email|
|
51
|
+
print_email_header(email)
|
52
|
+
puts
|
53
|
+
puts email.text_part.decoded.strip
|
54
|
+
puts
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def status
|
59
|
+
params = get_params(:mailbox)
|
60
|
+
query = { keys: 'UNSEEN', read_only: true }
|
61
|
+
query[:mailbox] = params[:mailbox] || 'INBOX'
|
62
|
+
query[:count] = 1000 # Hack to read all unreads and not only 10
|
63
|
+
unseen = Mail.find(query).count
|
64
|
+
puts "Unread: #{unseen}"
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def print_email_header(email)
|
70
|
+
puts yellow { "id #{email.message_id}" }
|
71
|
+
puts "From: #{email.from.first}"
|
72
|
+
puts "Date: #{email.date.rfc2822}"
|
73
|
+
puts "Message ID: #{email.message_id}" if @all
|
74
|
+
puts
|
75
|
+
puts " #{email.subject}"
|
76
|
+
puts
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/lib/dmail/utils.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'pager'
|
2
|
+
require 'term/ansicolor'
|
3
|
+
|
4
|
+
module Dmail
|
5
|
+
module Utils
|
6
|
+
include Pager
|
7
|
+
|
8
|
+
# I like this naming better :)
|
9
|
+
def setup_pager!
|
10
|
+
page
|
11
|
+
end
|
12
|
+
|
13
|
+
# Converts arguments() to a pretty-named hash. Considers naming
|
14
|
+
# substitutes when doing so.
|
15
|
+
def get_params(keys, mappings)
|
16
|
+
params = {}
|
17
|
+
[keys].flatten.each do |key|
|
18
|
+
value = arguments[key.to_s]
|
19
|
+
params[key] = value if value
|
20
|
+
end
|
21
|
+
mappings.each do |final_name, substitutes|
|
22
|
+
value = substitutes.map { |s| arguments[s] }.find { |el| el }
|
23
|
+
params[final_name] = value if value
|
24
|
+
end
|
25
|
+
params
|
26
|
+
end
|
27
|
+
|
28
|
+
# Parsing command-line arguments. Understands things like '-d',
|
29
|
+
# '-c', '-c 5', '--count=5', '--count 5'.
|
30
|
+
# Non-valued args like '-d' get mapped to true to indicate presence.
|
31
|
+
def arguments
|
32
|
+
@args ||= {}
|
33
|
+
unless @args.size > 0
|
34
|
+
ARGV.each_with_index do |arg, index|
|
35
|
+
if arg.start_with?('-')
|
36
|
+
if index + 1 < ARGV.size
|
37
|
+
next_arg = ARGV[index + 1]
|
38
|
+
if next_arg.start_with?('-') then
|
39
|
+
@args.update(argument_present_or_direct(arg))
|
40
|
+
else
|
41
|
+
@args.update(arg => next_arg)
|
42
|
+
end
|
43
|
+
else
|
44
|
+
@args.update(argument_present_or_direct(arg))
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
@args
|
50
|
+
end
|
51
|
+
|
52
|
+
def argument_present_or_direct(arg)
|
53
|
+
arg, value = if arg.include?('=') then
|
54
|
+
arg.split('=')
|
55
|
+
else
|
56
|
+
[arg, true]
|
57
|
+
end
|
58
|
+
{ arg => value }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
metadata
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dmail
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andre Dieb Martins
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-12-29 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '10.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '10.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: mail
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.6'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.6'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: term-ansicolor
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.3'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.3'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pager
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.0'
|
83
|
+
description: Command-line email client
|
84
|
+
email:
|
85
|
+
- andre.dieb@gmail.com
|
86
|
+
executables:
|
87
|
+
- dmail
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- README.md
|
92
|
+
- Rakefile
|
93
|
+
- bin/dmail
|
94
|
+
- lib/dmail.rb
|
95
|
+
- lib/dmail/cli.rb
|
96
|
+
- lib/dmail/impl.rb
|
97
|
+
- lib/dmail/utils.rb
|
98
|
+
- lib/dmail/version.rb
|
99
|
+
homepage: https://github.com/dieb/dmail
|
100
|
+
licenses:
|
101
|
+
- MIT
|
102
|
+
metadata: {}
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options: []
|
105
|
+
require_paths:
|
106
|
+
- lib
|
107
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
requirements: []
|
118
|
+
rubyforge_project:
|
119
|
+
rubygems_version: 2.4.3
|
120
|
+
signing_key:
|
121
|
+
specification_version: 4
|
122
|
+
summary: Command-line email client
|
123
|
+
test_files: []
|