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.
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ unless $LOAD_PATH.include?(File.dirname(__FILE__) + '/../lib/')
4
+ $LOAD_PATH << File.dirname(__FILE__) + '/../lib'
5
+ end
6
+
7
+ require 'dmail/cli'
8
+
9
+ cli = Dmail::CLI.new
10
+ cli.run
@@ -0,0 +1,2 @@
1
+ module Dmail
2
+ end
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,4 @@
1
+ module Dmail
2
+ VERSION = '0.0.1'
3
+ end
4
+
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: []