fast-mailer 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.
data/LICENCE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Erik Hansson
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,70 @@
1
+ FastMailer
2
+ ==========
3
+
4
+ FastMailer is a collection of helpers that aims to help with sending email.
5
+ Specifically, it allows for convenient configuration and better throughput
6
+ when sending multiple mails.
7
+
8
+
9
+ Configuration
10
+ -------------
11
+
12
+ The FastMailer senders are configured with a regular options hash, pretty
13
+ much what you'd expect:
14
+
15
+ FastMailer::SMTP.new({
16
+ :host => 'mail.authsmtp.com',
17
+ :port => 2525,
18
+ :authentication => :cram_md5,
19
+ :domain => 'mydomain.com',
20
+ :username => 'username',
21
+ :password => 'password'
22
+ })
23
+
24
+ Something I've found very convenient, however, is to let the gem read the
25
+ default configuration from your home directory. For instance, let's assume
26
+ we put:
27
+
28
+ {
29
+ :host => 'mail.authsmtp.com',
30
+ :port => 2525,
31
+ :authentication => :cram_md5,
32
+ :domain => 'mydomain.com',
33
+ :username => 'username',
34
+ :password => 'password'
35
+ }
36
+
37
+ into **~/.config/smtp.rb**, you could then achieve the same result by simply
38
+ not providing any options at all. This makes it really easy to write small
39
+ scripts that send email without having to worry about configuration.
40
+
41
+
42
+ Sending mail
43
+ ------------
44
+
45
+ When sending a lot of mail, every second counts - especially if you don't
46
+ have your SMTP server close by. To reduce the time it takes to send a lot of
47
+ email, we can send multiple emails using a single connection.
48
+
49
+ mail = build_mail_somehow # mail is a Mail instance (as from the mail gem)
50
+
51
+ FastMailer::SMTP.new.open do |smtp|
52
+ smtp.deliver mail
53
+ mail.to = 'another@recipient.com'
54
+ smtp.deliver mail
55
+ end
56
+
57
+
58
+ Coming features
59
+ ---------------
60
+
61
+ * Parallelisation: given a list of mails, or a mail generator, we can spin a number
62
+ of threads up and let them send mail simultaneously. As most of the time is spent
63
+ waiting for the network, this speeds the process up significantly.
64
+
65
+ * Logging: When sending large batches, sometimes things go wrong. If we keep track
66
+ of which mails have been sent and which have failed, we reduce the risk of finding
67
+ ourselves wondering which of our users have received the message and which we need
68
+ to send to.
69
+
70
+ * Blacklisting: block addresses so they cannot be sent to.
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,5 @@
1
+
2
+ require 'mail'
3
+
4
+ require 'fast-mailer/configuration'
5
+ require 'fast-mailer/smtp'
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ module FastMailer
4
+ class Configuration
5
+
6
+ TEST_CONFIGURATION = {
7
+ :something => :useful
8
+ }
9
+
10
+ def self.enable_testing!
11
+ def self.smtp_configuration(options = nil)
12
+ TEST_CONFIGURATION
13
+ end
14
+ end
15
+
16
+ def self.disable_testing!
17
+ def self.smtp_configuration(options = nil)
18
+ if options.is_a? Hash
19
+ options
20
+ else
21
+ eval(File.read(options || File.expand_path("~/.config/smtp.rb")))
22
+ end
23
+ end
24
+ end
25
+
26
+ disable_testing!
27
+
28
+ end
29
+ end
@@ -0,0 +1,79 @@
1
+
2
+ module FastMailer
3
+
4
+ # Sends messages using an SMTP server. The SMTP options is passed through
5
+ # FastMailer::Configuration, so you can set your system up to automatically
6
+ # use your SMTP configuration. Also, FastMailer::SMTP supports that you send
7
+ # multiple emails over a single connection, allowing for faster delivery
8
+ # of multiple emails.
9
+ #
10
+ # Note that if an error is raised by Net::SMTP, the connection may not be
11
+ # reliable. As a best practice, always discard the current connection and
12
+ # reopen a new one in case you encounter an error. Do not attempt to continue
13
+ # sending mail on the same connection.
14
+ class SMTP
15
+
16
+ attr_accessor :configuration
17
+
18
+ def initialize(options = nil)
19
+ @configuration = FastMailer::Configuration.smtp_configuration options
20
+ end
21
+
22
+ def open
23
+ @opened = true
24
+
25
+ configuration[:host] ||= configuration[:address]
26
+ configuration[:username] ||= configuration[:user_name]
27
+
28
+ @smtp = Net::SMTP.new(configuration[:host], configuration[:port])
29
+ if configuration[:enable_starttls_auto]
30
+ smtp.enable_starttls_auto if smtp.respond_to?(:enable_starttls_auto)
31
+ end
32
+
33
+ @smtp.start(configuration[:domain], configuration[:username], configuration[:password], configuration[:authentication]) do |smtp|
34
+ yield self
35
+ end
36
+ ensure
37
+ @smtp = nil
38
+ @opened = false
39
+ end
40
+
41
+ def deliver(mail)
42
+ if @opened
43
+ perform_delivery(mail)
44
+ else
45
+ open do
46
+ deliver mail
47
+ end
48
+ end
49
+ end
50
+
51
+ private
52
+ def perform_delivery(mail)
53
+
54
+ # Set the envelope from to be either the return-path, the sender or the first from address
55
+ envelope_from = mail.return_path || mail.sender || mail.from_addrs.first
56
+ if envelope_from.blank?
57
+ raise ArgumentError.new('A sender (Return-Path, Sender or From) required to send a message')
58
+ end
59
+
60
+ destinations ||= mail.destinations if mail.respond_to?(:destinations) && mail.destinations
61
+ if destinations.blank?
62
+ raise ArgumentError.new('At least one recipient (To, Cc or Bcc) is required to send a message')
63
+ end
64
+
65
+ message ||= mail.encoded if mail.respond_to?(:encoded)
66
+ if message.blank?
67
+ raise ArgumentError.new('A encoded content is required to send a message')
68
+ end
69
+
70
+ begin
71
+ @smtp.sendmail(message, envelope_from, destinations)
72
+ rescue e
73
+ @smtp = nil
74
+ raise e
75
+ end
76
+ end
77
+
78
+ end
79
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fast-mailer
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Erik Hansson
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-09-29 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: mail
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 2
30
+ - 2
31
+ - 5
32
+ version: 2.2.5
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: i18n
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :runtime
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: bundler
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ~>
55
+ - !ruby/object:Gem::Version
56
+ segments:
57
+ - 1
58
+ - 0
59
+ - 0
60
+ version: 1.0.0
61
+ type: :development
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ name: rspec
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ~>
70
+ - !ruby/object:Gem::Version
71
+ segments:
72
+ - 2
73
+ - 0
74
+ - 0
75
+ - beta
76
+ - 22
77
+ version: 2.0.0.beta.22
78
+ type: :development
79
+ version_requirements: *id004
80
+ - !ruby/object:Gem::Dependency
81
+ name: rake
82
+ prerelease: false
83
+ requirement: &id005 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ segments:
89
+ - 0
90
+ - 8
91
+ - 7
92
+ version: 0.8.7
93
+ type: :development
94
+ version_requirements: *id005
95
+ - !ruby/object:Gem::Dependency
96
+ name: autotest
97
+ prerelease: false
98
+ requirement: &id006 !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ segments:
104
+ - 0
105
+ version: "0"
106
+ type: :development
107
+ version_requirements: *id006
108
+ description: Helps with sending emails fast, and with convenient configuration.
109
+ email:
110
+ - erik@bits2life.com
111
+ executables: []
112
+
113
+ extensions: []
114
+
115
+ extra_rdoc_files: []
116
+
117
+ files:
118
+ - lib/fast-mailer/configuration.rb
119
+ - lib/fast-mailer/smtp.rb
120
+ - lib/fast-mailer.rb
121
+ - LICENCE
122
+ - VERSION
123
+ - README.md
124
+ has_rdoc: true
125
+ homepage: http://github.com/erikhansson/fast-mailer
126
+ licenses: []
127
+
128
+ post_install_message:
129
+ rdoc_options: []
130
+
131
+ require_paths:
132
+ - lib
133
+ required_ruby_version: !ruby/object:Gem::Requirement
134
+ none: false
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ segments:
139
+ - 0
140
+ version: "0"
141
+ required_rubygems_version: !ruby/object:Gem::Requirement
142
+ none: false
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ segments:
147
+ - 1
148
+ - 3
149
+ - 6
150
+ version: 1.3.6
151
+ requirements: []
152
+
153
+ rubyforge_project: nowarning
154
+ rubygems_version: 1.3.7
155
+ signing_key:
156
+ specification_version: 3
157
+ summary: Help with sending emails.
158
+ test_files: []
159
+