actionmailbox-imap 0.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: cce84e603505d4bdcb54d4935e5378acd69e3c0426dad9cbf3d3195801260862
4
+ data.tar.gz: f9a75e4fe6651894c49c3784f8a068ad015b3d54c1621bb33cbeb3887e03c1c4
5
+ SHA512:
6
+ metadata.gz: e7d9ab1a7b2c4b8a16ffe2c0fd97f5b85885ad607160985ea77db290f1aa095db72ea64d81ff59d68e9271a58adc6fe7edced957aa6eba5ad0514017ceb3773f
7
+ data.tar.gz: 8fa950ea432d4ec17a5f32b3e0ac253dd16a7bae2d8ab34bcbb2b0c5fcbc7e6b7c1014eec4f0248bd5f0d32bf023a71dfacfd23a8d410c4ff4e94811bf489338
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2019 Ethan Knowlton
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,82 @@
1
+ # Actionmailbox::IMAP
2
+ [![CircleCI](https://circleci.com/gh/kimmelsg/actionmailbox-imap.svg?style=svg)](https://circleci.com/gh/kimmelsg/actionmailbox-imap)
3
+
4
+ A IMAP relay for ActionMailbox.
5
+
6
+ This is a very simple gem that provides a rake task which will connect to an IMAP server, grab some (`take`) emails, attempt to relay them to ActionMailbox.
7
+
8
+ If the rake task successfully relays a message to ActionMailbox then it will flag the message as "Deleted" on the IMAP server, and continue to the next message.
9
+
10
+ If the rake task fails to relay a message to ActionMailbox then it will ignore it and move on to the next message leaving the message on the IMAP server.
11
+
12
+ ### Why it was created
13
+
14
+ It seems that there is no plans to create some sort of IMAP implementation relay in ActionMailbox.
15
+ https://github.com/rails/actionmailbox/issues/14
16
+
17
+ There is probably a reason for this. We did not want to setup or maintain a mailserver which would probably be the route to go for a robust inboud email application.
18
+
19
+ ## Usage
20
+
21
+ ### Install ActionMailbox
22
+
23
+ Per [ActionMailbox documentation](https://edgeguides.rubyonrails.org/action_mailbox_basics.html)
24
+
25
+ ```bash
26
+ $ rails action_mailbox:install
27
+ $ rails db:migrate
28
+ ```
29
+
30
+ ```ruby
31
+ # config/environments/production.rb
32
+ config.action_mailbox.ingress = :relay
33
+ ```
34
+
35
+ ```bash
36
+ $ rails credentials:edit
37
+ ```
38
+
39
+ ```yaml
40
+ action_mailbox:
41
+ ingress_password: "YourIngressPassword"
42
+ ```
43
+
44
+
45
+ ### Install ActionMailbox::IMAP
46
+
47
+ ```bash
48
+ $ rails g imap:install
49
+ ```
50
+
51
+ Prepare your IMAP server and account by ensuring/creating the mailboxes for `ingress_mailbox`, ex: "INBOX".
52
+
53
+ Update the `config/imap.yml` that was generated to include server and credentials information, `ingress_mailbox` and an appropriate `take` amount ( the amount of emails to grab in a single run ).
54
+
55
+ Run or schedule `rails action_mailbox:ingress:imap URL="http://localhost/rails/action_mailbox/inbound_email" INGRESS_PASSWORD="YourIngressPassword"` to run at a selected interval.
56
+
57
+ The command behaves much like that of the other `action_mailbox:ingress:...` commands in that it relays the message the same way. Although messages should be piped to the other ingress commands and `rails action_mailbox:ingress:imap ...` needs to be scheduled appropriately.
58
+
59
+ ## Installation
60
+ Add this line to your application's Gemfile:
61
+ ( Gem is not published to rubygems.org currently, you can point to this github url though )
62
+
63
+ ```ruby
64
+ gem 'actionmailbox-imap'
65
+ ```
66
+
67
+ And then execute:
68
+ ```bash
69
+ $ bundle
70
+ ```
71
+
72
+ Or install it yourself as:
73
+ ```bash
74
+ $ gem install actionmailbox-imap
75
+ ```
76
+
77
+ ## Contributing
78
+
79
+ Want to contribute? Please do. PR's and passing tests (lint, test) will be required.
80
+
81
+ ## License
82
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,27 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Actionmailbox::Imap'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ require 'bundler/gem_tasks'
18
+
19
+ require 'rake/testtask'
20
+
21
+ Rake::TestTask.new(:test) do |t|
22
+ t.libs << 'test'
23
+ t.pattern = 'test/**/*_test.rb'
24
+ t.verbose = false
25
+ end
26
+
27
+ task default: :test
@@ -0,0 +1,29 @@
1
+ require "actionmailbox/imap/railtie"
2
+ require "actionmailbox/imap/mailbox"
3
+
4
+ module ActionMailbox
5
+ module IMAP
6
+ class Base
7
+ def initialize(adapter:)
8
+ @adapter = adapter
9
+ end
10
+
11
+ def login(username:, password:)
12
+ adapter.login(username: username, password: password)
13
+ end
14
+
15
+ def select_mailbox(mailbox)
16
+ adapter.select_mailbox(mailbox)
17
+ Mailbox.new(adapter: adapter, mailbox: mailbox)
18
+ end
19
+
20
+ def disconnect
21
+ adapter.disconnect
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :adapter
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,47 @@
1
+ require "net/imap"
2
+
3
+ module ActionMailbox
4
+ module IMAP
5
+ module Adapters
6
+ class NetImap
7
+ def initialize(server:, port: 993, usessl: true)
8
+ @imap = Net::IMAP.new(server, port, usessl)
9
+ end
10
+
11
+ def login(username:, password:)
12
+ imap.login(username, password)
13
+ end
14
+
15
+ def select_mailbox(mailbox)
16
+ imap.select(mailbox)
17
+ end
18
+
19
+ def disconnect
20
+ imap.expunge
21
+ imap.disconnect
22
+ end
23
+
24
+ def messages_not_deleted
25
+ imap.search(["NOT", "DELETED"])
26
+ end
27
+
28
+ def delete_message(id)
29
+ move_message_to(id, "TRASH")
30
+ end
31
+
32
+ def move_message_to(id, mailbox)
33
+ imap.copy(id, mailbox)
34
+ imap.store(id, "+FLAGS", [:Deleted])
35
+ end
36
+
37
+ def fetch_message_attr(id, attr)
38
+ imap.fetch(id, attr).first.attr[attr]
39
+ end
40
+
41
+ private
42
+
43
+ attr_reader :imap
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,21 @@
1
+ require "actionmailbox/imap/messages"
2
+
3
+ module ActionMailbox
4
+ module IMAP
5
+ class Mailbox
6
+ def initialize(adapter:, mailbox:)
7
+ @adapter = adapter
8
+ @mailbox = mailbox
9
+ end
10
+
11
+ def not_deleted
12
+ result = adapter.messages_not_deleted
13
+ Messages.new(adapter: adapter, message_ids: result)
14
+ end
15
+
16
+ private
17
+
18
+ attr_reader :adapter, :mailbox
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,28 @@
1
+ module ActionMailbox
2
+ module IMAP
3
+ class Message
4
+ RFC822 = "RFC822".freeze
5
+
6
+ def initialize(adapter:, id:)
7
+ @adapter = adapter
8
+ @id = id
9
+ end
10
+
11
+ def rfc822
12
+ adapter.fetch_message_attr(id, RFC822)
13
+ end
14
+
15
+ def delete
16
+ adapter.delete_message(id)
17
+ end
18
+
19
+ def move_to(mailbox)
20
+ adapter.move_message_to(id, mailbox)
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :adapter, :id
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ require "actionmailbox/imap/message"
2
+
3
+ module ActionMailbox
4
+ module IMAP
5
+ class Messages
6
+ def initialize(adapter:, message_ids:)
7
+ @adapter = adapter
8
+ @message_ids = message_ids
9
+ end
10
+
11
+ def take(n)
12
+ taken_ids = message_ids.take(n)
13
+ Messages.new(adapter: adapter, message_ids: taken_ids)
14
+ end
15
+
16
+ def length
17
+ message_ids.length
18
+ end
19
+
20
+ def each
21
+ return unless block_given? # @TODO Need to test this branch
22
+
23
+ message_ids.each do |id|
24
+ yield Message.new(adapter: adapter, id: id)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ attr_reader :adapter, :message_ids
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,10 @@
1
+ module Actionmailbox
2
+ module Imap
3
+ class Railtie < ::Rails::Railtie
4
+ rake_tasks do
5
+ path = File.expand_path("../tasks/actionmailbox/ingress.rake", File.dirname(__dir__))
6
+ load path
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ module Actionmailbox
2
+ module Imap
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ class Imap::InstallGenerator < Rails::Generators::Base
2
+ source_root File.expand_path("templates", __dir__)
3
+
4
+ def copy_imap_config_file
5
+ copy_file "config.yml", "config/actionmailbox_imap.yml"
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ default: &default
2
+ server: <%= ENV.fetch("IMAP_SERVER") { "" } %>
3
+ port: <%= ENV.fetch("IMAP_PORT") { 993 } %>
4
+ usessl: <%= ENV.fetch("IMAP_USE_SSL") { true } %>
5
+ username: <%= ENV.fetch("IMAP_ACCOUNT_USERNAME") { "" } %>
6
+ password: <%= ENV.fetch("IMAP_ACCOUNT_PASSWORD") { "" } %>
7
+ ingress_mailbox: "INBOX"
8
+ take: <%= ENV.fetch("IMAP_TAKE") { 100 } %>
9
+
10
+ development:
11
+ <<: *default
12
+
13
+ production:
14
+ <<: *default
@@ -0,0 +1,39 @@
1
+ require "actionmailbox/imap/adapters/net_imap"
2
+
3
+ namespace :action_mailbox do
4
+ namespace :ingress do
5
+ task :environment do
6
+ require "active_support"
7
+ require "active_support/core_ext/object/blank"
8
+ require "action_mailbox/relayer"
9
+ end
10
+
11
+ desc "Relays inbound IMAP email to Action Mailbox (URL and INGRESS_PASSWORD required)"
12
+ task imap: "action_mailbox:ingress:environment" do
13
+ url, password = ENV.values_at("URL", "INGRESS_PASSWORD")
14
+
15
+ config = Rails.application.config_for(:actionmailbox_imap)
16
+
17
+ adapter = ActionMailbox::IMAP::Adapters::NetImap.new(
18
+ server: config[:server],
19
+ port: config[:port],
20
+ usessl: config[:usessl]
21
+ )
22
+
23
+ imap = ActionMailbox::IMAP::Base.new(adapter: adapter)
24
+
25
+ imap.login(username: config[:username], password: config[:password])
26
+
27
+ mailbox = imap.select_mailbox(config[:ingress_mailbox])
28
+
29
+ mailbox.not_deleted.take(config[:take]).each do |message|
30
+ ActionMailbox::Relayer.new(url: url, password: password).relay(message.rfc822).tap do |result|
31
+ message.delete if result.success?
32
+ message.move_to(config[:retry_mailbox]) unless result.success?
33
+ end
34
+ end
35
+
36
+ imap.disconnect
37
+ end
38
+ end
39
+ end
metadata ADDED
@@ -0,0 +1,113 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: actionmailbox-imap
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ethan Knowlton
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-08-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 6.0.0.rc2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 6.0.0.rc2
27
+ - !ruby/object:Gem::Dependency
28
+ name: sqlite3
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest-stub-const
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: standard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Relay IMAP messages to ActionMailbox
70
+ email:
71
+ - eknowlton@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - MIT-LICENSE
77
+ - README.md
78
+ - Rakefile
79
+ - lib/actionmailbox/imap.rb
80
+ - lib/actionmailbox/imap/adapters/net_imap.rb
81
+ - lib/actionmailbox/imap/mailbox.rb
82
+ - lib/actionmailbox/imap/message.rb
83
+ - lib/actionmailbox/imap/messages.rb
84
+ - lib/actionmailbox/imap/railtie.rb
85
+ - lib/actionmailbox/imap/version.rb
86
+ - lib/generators/imap/install_generator.rb
87
+ - lib/generators/imap/templates/config.yml
88
+ - lib/tasks/actionmailbox/ingress.rake
89
+ homepage: https://github.com/kimmelsg
90
+ licenses:
91
+ - MIT
92
+ metadata:
93
+ allowed_push_host: https://rubygems.org
94
+ post_install_message:
95
+ rdoc_options: []
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubygems_version: 3.0.1
110
+ signing_key:
111
+ specification_version: 4
112
+ summary: Relay IMAP messages to ActionMailbox
113
+ test_files: []