vf-email-handler 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5d3dfd6e8bd814eb464375f2310eabcb1d2dbeb7
4
+ data.tar.gz: 35d8181ce32c6fe61c5a1959df0ee244512992a7
5
+ SHA512:
6
+ metadata.gz: 31d8c82a3921232dd1479af035159aa6a0e21a9ce921bcadc9ce5744dbac24193463b6fc7ff668dd67320ca64a0fda1ac7fcce10b28082d4f807b32ef97a513f
7
+ data.tar.gz: ac941615464f4665fced5f48a7c8e9befb7bf6d2c1647e001ba47c6b21fa2d8e5a02d41655f7f5f16fa64b584bdfad2a3b751c3405480976946fcfe029431e41
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Videofy
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,37 @@
1
+ Videofy Email Handler
2
+ ========
3
+
4
+ Logic that binds the Amazon SQS (Simple Queue Service) to the Amazon SES (Simple Email Service)
5
+
6
+ The handler will poll a specified SQS Queue and translate the messages to somethign that SES can understand and then push them to SES; effectively sending the emails.
7
+
8
+ ####Get up and running with the mail handler
9
+ To start with there are some dependencies that must be satisfied.
10
+ * Ruby ( >= 2.1.2) must be installed on the host computer
11
+ * Rubygems (>= 1.8) to install the gem
12
+
13
+ To install just type `gem install vf-email-handler` and you're set to go.
14
+
15
+ Then there is just the matter of writing the config, which of course the handler can do for you; at least get you started.
16
+ Type the following:
17
+
18
+ ```bash
19
+ Config create call here
20
+ ```
21
+
22
+ and it will generate a config-skeleton for you. Looking inside `default.h.cfg` we se this:
23
+
24
+ ```bash
25
+ Put sample config here
26
+ ```
27
+
28
+ Fill in the blanks and then start the handler by running.
29
+
30
+ ```bash
31
+ Put startup command here
32
+ ```
33
+
34
+ #####Daemonize
35
+ There is an init.d script in the opt folder of the repo.
36
+
37
+ Happy hacking!
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env ruby
2
+ require 'mailhandler'
3
+ require 'meta/console_strings'
4
+ require 'meta/version'
5
+ require 'initializers/aws'
6
+ require 'initializers/logger'
7
+ require 'aws/ses'
8
+ require 'aws/sqs'
9
+
10
+ include ConsoleStrings
11
+
12
+ def handle_path(path)
13
+ path[0] == '/' ? path : "#{Dir.pwd}/#{path}"
14
+ end
15
+
16
+ def start(settings)
17
+ MailHandler::AWS.setup settings
18
+ MailHandler::Logger.setup settings
19
+ MailHandler::Handler.begin_work_loop
20
+ end
21
+
22
+ def copy_config
23
+ FileUtils.copy(
24
+ File.expand_path('../../lib/meta/sample-config.yml', __FILE__),
25
+ "#{Dir.pwd}/mailer_config.yml"
26
+ )
27
+ end
28
+
29
+ if ARGV.empty?
30
+ puts WELCOME
31
+ elsif ARGV.include?('--version') || ARGV.include?('-v')
32
+ puts VERSION
33
+ elsif ARGV.include?('--help') || ARGV.include?('-h')
34
+ puts HELP
35
+ elsif ARGV[0] == 'create-config'
36
+ copy_config
37
+ puts CONFIG_COPY_COMPLETE
38
+ elsif ARGV[0] == 'run'
39
+ puts STARTING
40
+ if ARGV[1]
41
+ begin
42
+ start YAML.load_file(handle_path(ARGV[1]))
43
+ puts STARTED
44
+ rescue Errno::ENOENT
45
+ puts MISSING_CONFIG
46
+ rescue AWS::SES::ResponseError, AWS::SQS::Errors::IncompleteSignature
47
+ puts BAD_AWS_CREDENTIALS
48
+ rescue AWS::SQS::Errors::NonExistentQueue
49
+ puts NO_SUCH_QUEUE
50
+ rescue StandardError
51
+ puts BAD_CONFIG
52
+ rescue SystemExit, Interrupt
53
+ puts 'Exiting.. '
54
+ exit 1
55
+ end
56
+ else
57
+ puts MISSING_CONFIG
58
+ end
59
+ else
60
+ puts UNRECOGNIZED % ARGV.join(' ')
61
+ end
@@ -0,0 +1,14 @@
1
+ module MailHandler
2
+ # Initializes SES and SQS interfaces
3
+ module AWS
4
+ class << self
5
+ def setup(config)
6
+ require 'interfaces/sqs'
7
+ require 'interfaces/ses'
8
+
9
+ SES.setup config[:aws][:ses]
10
+ SQS.setup config[:aws][:sqs]
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module MailHandler
2
+ # Initializes the logger from config
3
+ module Logger
4
+ class << self
5
+ def setup(config)
6
+ require 'logger/logger'
7
+ Logger.setup config[:logger]
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,63 @@
1
+ require 'aws/ses'
2
+
3
+ module MailHandler
4
+ # Containing everything related to SES comunication
5
+ module SES
6
+ # Setup and cofig the SES
7
+ class << self
8
+ attr_reader :mailer
9
+
10
+ def setup(config)
11
+ @mailer = Mailer.new config
12
+ end
13
+ end
14
+
15
+ # Yields an interface to SES
16
+ class Mailer
17
+ def initialize(config)
18
+ @ses = ::AWS::SES::Base.new(
19
+ access_key_id: config[:access_key_id],
20
+ secret_access_key: config[:secret_access_key],
21
+ server: config[:ses_server]
22
+ )
23
+ check_connection
24
+ end
25
+
26
+ def send_mail(email)
27
+ response = @ses.send_email email.to_h
28
+ log email, response
29
+ response
30
+ end
31
+
32
+ private
33
+
34
+ def log(email, response)
35
+ if response.error?
36
+ log_failure email, response
37
+ else
38
+ log_success email
39
+ end
40
+ end
41
+
42
+ def log_failure(email, response)
43
+ Logger.error(
44
+ subject: email,
45
+ error_code: response.code,
46
+ error_type: 'SES ERROR',
47
+ trace: response.error.to_s
48
+ )
49
+ end
50
+
51
+ def log_success(email)
52
+ Logger.success(
53
+ subject: email,
54
+ message: 'successfully sent'
55
+ )
56
+ end
57
+
58
+ def check_connection
59
+ @ses.quota
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,42 @@
1
+ require 'aws-sdk'
2
+
3
+ module MailHandler
4
+ # Contains everything rellated to SQS communication
5
+ module SQS
6
+ # Setup and cofig the sqs queue
7
+ class << self
8
+ attr_reader :client
9
+
10
+ def setup(config)
11
+ @client = Client.new config
12
+ end
13
+ end
14
+
15
+ # Yields an interface to a specific sqs queue
16
+ class Client
17
+ attr_accessor :queues
18
+
19
+ def initialize(config)
20
+ all_queues = ::AWS::SQS.new(
21
+ access_key_id: config[:access_key_id],
22
+ secret_access_key: config[:secret_access_key],
23
+ region: config[:aws_region]
24
+ ).queues
25
+
26
+ @queues = config[:sqs_queues].map do |queue_name|
27
+ all_queues.named queue_name
28
+ end
29
+
30
+ @batch_size = config[:batch_size] || 1
31
+ end
32
+
33
+ def fetch_messages
34
+ [
35
+ @queues.map do |queue|
36
+ queue.receive_messages(limit: @batch_size)
37
+ end
38
+ ].flatten.compact
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,32 @@
1
+ module MailHandler
2
+ # Custom logger that handles loging through STOUT
3
+ # or to a specified logfile
4
+ module Logger
5
+ # Setup and config the Logger
6
+ class << self
7
+ def setup(config)
8
+ if config
9
+ @logfile = File.open(config[:log_file], 'a') if config[:log_file]
10
+ end
11
+ end
12
+
13
+ def success(args)
14
+ #log "SUCCESS: #{args[:subject]}"
15
+ end
16
+
17
+ def error(args)
18
+ str = "\n"
19
+ str << "ERROR: #{args[:error_type]}\n--\n" if args[:error_type]
20
+ str << "Error code: #{args[:error_code]}\n--\n" if args[:error_code]
21
+ str << "Subject: #{args[:subject]}\n--\n" if args[:subject]
22
+ str << "Trace: #{args[:trace]}\n--\n" if args[:trace]
23
+ str << "==\n"
24
+ log str
25
+ end
26
+
27
+ def log(string)
28
+ @logfile ? @logfile.puts(string) : puts(string)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,56 @@
1
+ require 'workers/threaded_worker'
2
+ require 'models/email'
3
+
4
+ module MailHandler
5
+ # Base handler that does it all
6
+ class Handler
7
+ def self.begin_work_loop
8
+ loop do
9
+ begin
10
+ new.do_work
11
+ rescue StandardError => e
12
+ Logger.error(
13
+ subject: 'Main loop',
14
+ error_type: e.class.to_s,
15
+ trace: e.to_s
16
+ )
17
+ raise e
18
+ end
19
+ end
20
+ end
21
+
22
+ def do_work
23
+ if messages.any?
24
+ worker = ThreadedWorker.new(messages)
25
+ worker.do_work do |message|
26
+ unless send(email_from(message)).error?
27
+ message.delete
28
+ end
29
+ end
30
+ wait_for worker
31
+ else
32
+ sleep 1
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def messages
39
+ @messages ||= SQS.client.fetch_messages
40
+ end
41
+
42
+ def email_from(message)
43
+ MailHandler::Models::Email.new(
44
+ JSON.parse(message.body, symbolize_names: true)
45
+ )
46
+ end
47
+
48
+ def send(email)
49
+ SES.mailer.send_mail email
50
+ end
51
+
52
+ def wait_for(worker)
53
+ sleep(0.01) until worker.done?
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,58 @@
1
+ require 'meta/version'
2
+
3
+ # Strings used by the console executable
4
+ # gathered in one place for less clutter
5
+ module ConsoleStrings
6
+ HELP = 'Usage: mail-handler [-v] [-h] [<args>]
7
+
8
+ -v, --version Print the version and exit.
9
+ -h, --help Print this help.
10
+
11
+ If no flags are specified <args> should be one of the following:
12
+
13
+ create-config Generates a config boilerplate
14
+ in current folder.
15
+
16
+ run [config-file] Run the handler, suplement path
17
+ to the config file.
18
+
19
+ '
20
+ WELCOME = 'Welcome to the Videofy email handeler!
21
+
22
+ One instance of the mail-handler will poll AWS SQS for messages
23
+ and then forward them to AWS SES.
24
+
25
+ Append -h flag for usage information.
26
+
27
+ '
28
+ VERSION = "Version : #{MailHandler::VERSION}"
29
+
30
+ UNRECOGNIZED = 'Did not understand argument: "%s"
31
+ Run me with -h to see what you can do.
32
+ '
33
+
34
+ STARTING = '
35
+ Handler is starting...
36
+ '
37
+
38
+ STARTED = 'Started
39
+ '
40
+
41
+ BAD_CONFIG = 'Something went wrong when parsing the config provided.
42
+ Make sure the config is valid YAML.
43
+
44
+ Run with --help for more information
45
+ '
46
+
47
+ NO_SUCH_QUEUE= ' One or more queues in your config could not be found.
48
+ '
49
+
50
+ MISSING_CONFIG = HELP
51
+
52
+ CONFIG_COPY_COMPLETE = '
53
+ mailer_config.yml generated in current folder.
54
+ '
55
+ BAD_AWS_CREDENTIALS = '
56
+ Could not connect to AWS, please ensure that your credentials are valid.
57
+ '
58
+ end
@@ -0,0 +1,14 @@
1
+ :aws:
2
+ :ses:
3
+ :access_key_id: <YOUR AWS ACCESS_KEY_ID>
4
+ :secret_access_key: <YOUR AWS SECRET_ACCESS_KEY>
5
+ :ses_server: email.eu-west-1.amazonaws.com
6
+ :sqs:
7
+ :access_key_id: <YOUR AWS ACCESS_KEY_ID>
8
+ :secret_access_key: <YOUR AWS SECRET_ACCESS_KEY>
9
+ :sqs_queues: [<NAMES OF YOUR AWS SQS QUEUES>]
10
+ :aws_region: eu-west-1
11
+ :batch_size: <OPTIONAL DEFAULT 1 MAX 10>
12
+
13
+ :logger:
14
+ :log_file: <PATH TO LOGFILE HERE; Null if STOUT>
@@ -0,0 +1,4 @@
1
+ # Current version of the handler
2
+ module MailHandler
3
+ VERSION = '0.0.1'
4
+ end
@@ -0,0 +1,44 @@
1
+ module MailHandler
2
+ module Models
3
+ # PORO for mutating email information
4
+ class Email
5
+ attr_reader :from, :to, :cc, :bcc, :subject, :html,
6
+ :text, :reply_to, :bounce_to
7
+
8
+ def initialize(email_hash = {})
9
+ @from = email_hash[:from]
10
+
11
+ @to = email_hash[:to]
12
+ @cc = email_hash[:cc]
13
+ @bcc = email_hash[:bcc]
14
+
15
+ @subject = email_hash[:subject]
16
+ @text = email_hash[:text]
17
+ @html = email_hash[:html]
18
+
19
+ @reply_to = email_hash[:reply_to]
20
+ @bounce_to = email_hash[:bounce_to]
21
+ end
22
+
23
+ def to_h
24
+ { from: from,
25
+ to: to,
26
+ cc: cc,
27
+ bcc: bcc,
28
+ subject: subject,
29
+ html_body: html,
30
+ text_body: text,
31
+ return_path: bounce_to,
32
+ reply: reply_to }.delete_if { |_, v| v.nil? }
33
+ end
34
+
35
+ def to_s
36
+ {
37
+ from: from,
38
+ to: to,
39
+ subject: subject
40
+ }.to_s
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,31 @@
1
+ module MailHandler
2
+ # Generic threaded worker
3
+ class ThreadedWorker
4
+ WORKER_SIZE = 10
5
+
6
+ def initialize(task_list)
7
+ @tasks = Queue.new
8
+ populate_que task_list
9
+ end
10
+
11
+ def do_work
12
+ WORKER_SIZE.times do
13
+ Thread.new do
14
+ while (task = @tasks.pop)
15
+ yield task
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ def done?
22
+ @tasks.size.zero?
23
+ end
24
+
25
+ private
26
+
27
+ def populate_que(task_list)
28
+ task_list.each { |task| @tasks << task }
29
+ end
30
+ end
31
+ end
File without changes
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+ require 'interfaces/ses'
3
+ require 'models/email'
4
+ require 'logger/logger'
5
+
6
+ describe 'SES' do
7
+
8
+ let(:email) { MailHandler::Models::Email.new({}) }
9
+
10
+ before :each do
11
+ @ses = double
12
+
13
+ allow(AWS::SES::Base).to receive(:new).and_return(@ses)
14
+ allow(@ses).to receive(:quota).and_return(true)
15
+
16
+ MailHandler::SES.setup({})
17
+ end
18
+
19
+ describe '#send_mail' do
20
+ subject { MailHandler::SES.mailer }
21
+
22
+ let(:success) { double(error?: false) }
23
+
24
+ let(:failure) { double(error?: true, error: 'Error String', code: 400) }
25
+
26
+ it 'handles successfully sent mail' do
27
+ allow(@ses).to receive(:send_email)
28
+ .with(email.to_h).and_return(success)
29
+
30
+ expect(MailHandler::Logger).to receive(:success).once
31
+ expect(subject.send_mail(email).error?).to eq false
32
+ end
33
+
34
+ it 'handles failures while sending mail' do
35
+ allow(@ses).to receive(:send_email)
36
+ .with(email.to_h).and_return(failure)
37
+
38
+ expect(MailHandler::Logger).to receive(:error).once
39
+ expect(subject.send_mail(email).error?).to eq true
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+ require 'interfaces/sqs'
3
+
4
+ describe 'SQS', :sqs do
5
+
6
+ SQS_CONFIG = {
7
+ access_key_id: 'fake access key',
8
+ secret_access_key: 'fake secret key',
9
+ sqs_queues: %w(q1 q2),
10
+ batch_size: 3
11
+ }
12
+
13
+ before :all do
14
+ @sqs = AWS::SQS.new(SQS_CONFIG)
15
+
16
+ @q1 = @sqs.queues.create('q1')
17
+ @q2 = @sqs.queues.create('q2')
18
+
19
+ MailHandler::SQS.setup(SQS_CONFIG)
20
+ end
21
+
22
+ let(:email) do
23
+ {
24
+ from: 'email@email.com',
25
+ to: 'email2@email.com',
26
+ subject: 'testing',
27
+ text: 'testing text',
28
+ reply_to: 'noreply@email.com'
29
+ }
30
+ end
31
+
32
+ describe '#fetch_messages' do
33
+ subject do
34
+ MailHandler::SQS.client.fetch_messages.map do |msg|
35
+ JSON.parse(msg.body, symbolize_names: true)
36
+ end
37
+ end
38
+
39
+ context 'when no messages' do
40
+ it { is_expected.to be_empty }
41
+ end
42
+
43
+ context 'when one message' do
44
+ describe 'from one queue' do
45
+ before { @q1.send_message(JSON.dump(email)) }
46
+
47
+ it { is_expected.to eq [email] }
48
+ end
49
+
50
+ describe 'from multiple queues' do
51
+ before { [@q1, @q2].each { |q| q.send_message(JSON.dump email) } }
52
+
53
+ it { is_expected.to eq [email, email] }
54
+ end
55
+ end
56
+
57
+ context 'when multiple messages' do
58
+ describe 'from one queue' do
59
+ before { 4.times { @q1.send_message(JSON.dump email) } }
60
+
61
+ it { is_expected.to eq 3.times.map { email } }
62
+ end
63
+
64
+ describe 'from multiple queues' do
65
+ before do
66
+ [@q1, @q2].each { |q| 4.times { q.send_message(JSON.dump email) } }
67
+ end
68
+
69
+ it { is_expected.to eq 6.times.map { email } }
70
+ end
71
+ end
72
+ end
73
+
74
+ describe 'deleting messages' do
75
+ subject { MailHandler::SQS.client.fetch_messages }
76
+
77
+ before { @q1.send_message(JSON.dump email) }
78
+
79
+ context 'when not yet deleted' do
80
+ it { is_expected.not_to be_empty }
81
+ end
82
+
83
+ context 'when deleted' do
84
+ before { MailHandler::SQS.client.fetch_messages.first.delete }
85
+
86
+ it { is_expected.to be_empty }
87
+ end
88
+
89
+ end
90
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+ require 'mailhandler'
3
+
4
+ describe 'MailHandler' do
5
+ before { @handler = MailHandler::Handler.new }
6
+
7
+ describe '#do_work' do
8
+ context 'when no messages' do
9
+ before(:each) { allow(@handler).to receive(:messages) { [] } }
10
+
11
+ it 'should go straight for sleep' do
12
+ expect(@handler).to receive(:sleep).with(1) { true }
13
+ @handler.do_work
14
+ end
15
+ end
16
+
17
+ context 'when messages' do
18
+ let(:message) { double }
19
+ let(:email) { double }
20
+
21
+ before(:each) do
22
+ allow(@handler).to receive(:messages) { [message] }
23
+ allow(@handler).to receive(:email_from).with(message) { email }
24
+ end
25
+
26
+ it 'should try to send the messages' do
27
+ expect(@handler).to receive(:send).with(email)
28
+ @handler.do_work
29
+ end
30
+
31
+ it 'should delete the messages unless errors' do
32
+ expect(@handler).to receive(:send) { double(:error? => false) }
33
+ expect(message).to receive(:delete)
34
+ @handler.do_work
35
+ end
36
+
37
+ it 'should not delete the messages if errors' do
38
+ expect(@handler).to receive(:send) { double(:error? => true) }
39
+ expect(message).not_to receive(:delete)
40
+ @handler.do_work
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,20 @@
1
+ require 'aws-sdk'
2
+ require 'fake_sqs/test_integration'
3
+
4
+ AWS.config(
5
+ use_ssl: false,
6
+ sqs_endpoint: 'localhost',
7
+ sqs_port: 4568,
8
+ access_key_id: 'fake access key',
9
+ secret_access_key: 'fake secret key'
10
+ )
11
+
12
+ RSpec.configure do |config|
13
+ config.before(:suite) do
14
+ FAKE_SQS = FakeSQS::TestIntegration.new(database: ':memory:')
15
+ end
16
+
17
+ config.before(:all, :sqs) { FAKE_SQS.start }
18
+
19
+ config.after(:all, :sqs) { FAKE_SQS.stop }
20
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ require 'meta/version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = 'vf-email-handler'
9
+ s.version = MailHandler::VERSION
10
+ s.date = Date.today.to_s
11
+ s.authors = ['Videofy', 'Karl Litterfeldt']
12
+ s.email = 'karl.litterfeldt@videofy.me'
13
+ s.license = 'MIT-LICENSE'
14
+
15
+ s.required_ruby_version = '>=2.1.2'
16
+
17
+ s.homepage = 'http://www.videofy.me'
18
+
19
+ s.summary = 'Integrates AWS SQS with SES letting you' \
20
+ 'seemlessly queue emails for sending'
21
+
22
+ s.description = 'Use this handler when you want to be able' \
23
+ 'to queue up emails via Amazons Simple Queue' \
24
+ 'Service, enabeling you to generate' \
25
+ 'tons of emails and send them as fast as Amazons' \
26
+ 'Simple Email Service will let you. Check out the' \
27
+ 'readme on Github for more information.'
28
+
29
+ s.files = Dir.glob('lib/**/*') +
30
+ Dir.glob('bin/**/*') +
31
+ %w(vf-email-handler.gemspec LICENSE README.md)
32
+
33
+ s.test_files = Dir.glob('spec/**/*')
34
+ s.executables = %w(vf-email-handler)
35
+ s.require_paths = ['lib']
36
+
37
+ s.add_dependency 'aws-ses', '~> 0.5'
38
+ s.add_dependency 'aws-sdk', '~> 1.49.0'
39
+
40
+ s.add_development_dependency 'rspec', '~> 3'
41
+ s.add_development_dependency 'cane', '~> 2.6'
42
+ s.add_development_dependency 'fake_sqs', '~> 0.1'
43
+ end
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vf-email-handler
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Videofy
8
+ - Karl Litterfeldt
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-08-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: aws-ses
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '0.5'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '0.5'
28
+ - !ruby/object:Gem::Dependency
29
+ name: aws-sdk
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 1.49.0
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 1.49.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '3'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '3'
56
+ - !ruby/object:Gem::Dependency
57
+ name: cane
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '2.6'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '2.6'
70
+ - !ruby/object:Gem::Dependency
71
+ name: fake_sqs
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '0.1'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '0.1'
84
+ description: Use this handler when you want to be ableto queue up emails via Amazons
85
+ Simple QueueService, enabeling you to generatetons of emails and send them as fast
86
+ as AmazonsSimple Email Service will let you. Check out thereadme on Github for more
87
+ information.
88
+ email: karl.litterfeldt@videofy.me
89
+ executables:
90
+ - vf-email-handler
91
+ extensions: []
92
+ extra_rdoc_files: []
93
+ files:
94
+ - LICENSE
95
+ - README.md
96
+ - bin/vf-email-handler
97
+ - lib/initializers/aws.rb
98
+ - lib/initializers/logger.rb
99
+ - lib/interfaces/ses.rb
100
+ - lib/interfaces/sqs.rb
101
+ - lib/logger/logger.rb
102
+ - lib/mailhandler.rb
103
+ - lib/meta/console_strings.rb
104
+ - lib/meta/sample-config.yml
105
+ - lib/meta/version.rb
106
+ - lib/models/email.rb
107
+ - lib/workers/threaded_worker.rb
108
+ - spec/integration_spec.rb
109
+ - spec/interfaces/ses_spec.rb
110
+ - spec/interfaces/sqs_spec.rb
111
+ - spec/mail_handler_spec.rb
112
+ - spec/spec_helper.rb
113
+ - vf-email-handler.gemspec
114
+ homepage: http://www.videofy.me
115
+ licenses:
116
+ - MIT-LICENSE
117
+ metadata: {}
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 2.1.2
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubyforge_project:
134
+ rubygems_version: 2.2.2
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: Integrates AWS SQS with SES letting youseemlessly queue emails for sending
138
+ test_files:
139
+ - spec/integration_spec.rb
140
+ - spec/interfaces/ses_spec.rb
141
+ - spec/interfaces/sqs_spec.rb
142
+ - spec/mail_handler_spec.rb
143
+ - spec/spec_helper.rb