email_sender 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/README.rdoc +12 -11
  2. data/VERSION +1 -1
  3. data/lib/email_sender.rb +152 -136
  4. metadata +8 -6
data/README.rdoc CHANGED
@@ -1,11 +1,12 @@
1
1
  = EmailSender Library
2
2
 
3
- EmailSender is an easy to use library to send email through SMTP server based on Net::SMTP library.
3
+ EmailSender is an easy to use library to send email based on Net::SMTP.
4
+ It supports the well-known encryption and authentication methods, and you can use it very easily with Gmail account.
4
5
 
5
6
  require 'email_sender'
6
7
 
7
8
  mailer = EmailSender.new(server: "smtp.mail.com", from: "sender@mail.com")
8
- mailer.send(to: "receiver@mail.com", subject: "Test mail!", content: "This is a test mail!")
9
+ mailer.send(to: "receiver@mail.com", subject: "Test mail", content: "This is a test mail.")
9
10
 
10
11
  == Usage
11
12
 
@@ -15,7 +16,7 @@ You need specified the connection parameters to SMTP server on initialization:
15
16
  mailer = EmailSender.new(server: "smtp.mail.com", from: "Sender Name <sender@mail.com>")
16
17
 
17
18
  # encripted and authenticated connection
18
- mailer = EmailSender.new(server: "smtp.mail.com", port: 465, from: "Sender Name <sender@mail.com>",
19
+ mailer = EmailSender.new(server: "smtp.mail.com", from: "Sender Name <sender@mail.com>",
19
20
  enctype: :ssl_tls, authtype: :plain, username: "user.name", password: "secret")
20
21
 
21
22
  Easier way to using Gmail account:
@@ -27,7 +28,7 @@ Easier way to using Gmail account:
27
28
  # with full sender name
28
29
  mailer = EmailSender.new_gmail(from: "Sender Name <user.name@gmail.com>", password: "secret")
29
30
 
30
- # with another sender email address and another domain (non gmail.com) account
31
+ # with another sender email address and another domain (not gmail.com) account
31
32
  mailer = EmailSender.new_gmail(from: "Sender Name <sender@othermail.com>",
32
33
  username: "user.name@company.com", password: "secret")
33
34
 
@@ -43,8 +44,8 @@ You can modify easily the parameters of mailer object:
43
44
 
44
45
  Send the mail to the +:to+, +:cc+ and +:bcc+ addresses with attachment:
45
46
 
46
- mailer.send(to: "Receiver Name <receiver@mail.com>", subject: "Test mail!",
47
- content: "This is a test mail!", attachment: "/path/to/file")
47
+ mailer.send(to: "Receiver Name <receiver@mail.com>", subject: "Test mail",
48
+ content: "This is a test mail.", attachment: "/path/to/file")
48
49
 
49
50
  The +:to+, +:cc+ and +:bcc+ keys accept an email address array so you can send the message to many receivers.
50
51
  And the +:attachment+ key accepts also file path array so you can attach more file:
@@ -52,7 +53,7 @@ And the +:attachment+ key accepts also file path array so you can attach more fi
52
53
  mailer.send(to: ["Receiver Name 1 <receiver1@mail.com>", "Receiver Name 2 <receiver2@mail.com>"],
53
54
  cc: ["Receiver Name 3 <receiver3@mail.com>", "Receiver Name 4 <receiver4@mail.com>"],
54
55
  bcc: [receiver5@mail.com, "receiver6@mail.com", "receiver7@mail.com"],
55
- subject: "Test mail!", content: "This is a test mail!",
56
+ subject: "Test mail", content: "This is a test mail.",
56
57
  attachment: ["/path/to/file1", "/path/to/file2", "/path/to/file3"])
57
58
 
58
59
  If there are not specified the +:to+, +:cc+ and +:bcc+ addresses on sending use the initialized default addresses:
@@ -63,7 +64,7 @@ If there are not specified the +:to+, +:cc+ and +:bcc+ addresses on sending use
63
64
  cc: ["Receiver Name 2 <receiver2@mail.com>", "Receiver Name 3 <receiver3@mail.com>"])
64
65
 
65
66
  # send email to the default addresses
66
- mailer.send(subject: "Test mail!", content: "This is a test mail!")
67
+ mailer.send(subject: "Test mail", content: "This is a test mail.")
67
68
 
68
69
  You can specify the content type which is +'text/plain'+ by default:
69
70
 
@@ -71,15 +72,15 @@ You can specify the content type which is +'text/plain'+ by default:
71
72
  content: "<img src='http://upload.wikimedia.org/wikipedia/commons/7/73/Ruby_logo.svg'/>",
72
73
  conttype: "text/html")
73
74
 
74
- The library has implemented threadsafe and support the character encoded strings of Ruby.
75
+ The library has implemented threadsafe and support the character encoded messages.
75
76
 
76
77
  == Installation
77
78
 
78
- sudo gem install email_sender
79
+ gem install email_sender
79
80
 
80
81
  == Requirements
81
82
 
82
- ruby1.9.1
83
+ ruby1.9.1 or greater
83
84
 
84
85
  == License
85
86
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.2
1
+ 1.1.0
data/lib/email_sender.rb CHANGED
@@ -15,10 +15,8 @@
15
15
  # <http://www.gnu.org/licenses/>.
16
16
 
17
17
 
18
- require 'openssl'
19
18
  require 'net/smtp'
20
19
 
21
-
22
20
  # == Usage
23
21
  # mailer = EmailSender.new(server: "smtp.mail.com", from: "sender@mail.com")
24
22
  # mailer = EmailSender.new(server: "smtp.mail.com", port: 465, from: Sender Name <"sender@mail.com">,
@@ -27,17 +25,17 @@ require 'net/smtp'
27
25
  # mailer = EmailSender.new_gmail(username: "user.name", password: "secret")
28
26
  # mailer = EmailSender.new_gmail(from: "Sender Name <user.name@gmail.com>", password: "secret")
29
27
  #
30
- # mailer.send(to: "receiver@mail.com", subject: "Test mail!", content: "This is a test mail!")
28
+ # mailer.send(to: "receiver@mail.com", subject: "Test mail", content: "This is a test mail.")
31
29
  # mailer.send(to: "Receiver Name 1 <receiver1@mail.com>", cc: "Receiver Name 2 <receiver2@mail.com>",
32
- # subject: "Test mail!", content: "This is a test mail!", attachment: "/path/to/file")
30
+ # subject: "Test mail", content: "This is a test mail.", attachment: "/path/to/file")
33
31
  # See the README for more useful examples!
34
32
  class EmailSender
35
33
  # Major version number
36
34
  VERSION_MAJOR = 1
37
35
  # Minor version number
38
- VERSION_MINOR = 0
36
+ VERSION_MINOR = 1
39
37
  # Tiny version number
40
- VERSION_TINY = 2
38
+ VERSION_TINY = 0
41
39
  # Version number
42
40
  VERSION_CODE = (VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | VERSION_TINY
43
41
  # Version string
@@ -48,7 +46,7 @@ class EmailSender
48
46
  Settings = Struct.new(:server, :port, :domain, :esmtp, :enctype, :authtype,
49
47
  :username, :password, :from_addr, :to_addrs, :cc_addrs, :bcc_addrs) #:nodoc:
50
48
 
51
- # Create a new mailer object and initialize connection parameters to SMTP server.
49
+ # Create a new object and initialize connection parameters.
52
50
  # +-----------------------------------------------------------------------------------+
53
51
  # | Initialization Parameters |
54
52
  # +------------+-------------------------------------------+--------------------------+
@@ -67,39 +65,44 @@ class EmailSender
67
65
  # |:cc |<string>, <array of string> |[] |
68
66
  # |:bcc |<string>, <array of string> |[] |
69
67
  # +------------+-------------------------------------------+--------------------------+
70
- def initialize(params)
68
+ # If you do not give any parameters, the instance does not initialize, and the #send() method will do nothing
69
+ # and return with a nil. You can set and modify the parameters later with the #renew() or #renew_gmail() methods.
70
+ def initialize(params={})
71
71
  renew(params)
72
72
  end
73
73
 
74
- # Update the connection parameters to SMTP server.
75
- # See the ::new method for initialization parameters.
76
- def renew(params)
77
- settings = Settings.new
78
- settings.from_addr = parse_addr(params[:from])
79
- settings.to_addrs = parse_addrs(*params[:to])
80
- settings.cc_addrs = parse_addrs(*params[:cc])
81
- settings.bcc_addrs = parse_addrs(*params[:bcc])
82
- settings.domain = params[:domain] || settings.from_addr.last.split('@').last
83
- settings.esmtp = params[:esmtp] != :disabled and params[:esmtp] != false
84
- settings.enctype = params[:enctype]
85
- authtype = params[:authtype]
86
- username = params[:username]
87
- password = params[:password]
88
- if password and username and authtype and authtype != :none
89
- settings.authtype = authtype
90
- settings.username = username.encode(Encoding::UTF_8)
91
- settings.password = password.encode(Encoding::UTF_8)
92
- end
93
- settings.server = params[:server].encode(Encoding::UTF_8)
94
- settings.port = params[:port] || case settings.enctype
95
- when :starttls then Net::SMTP.default_submission_port
96
- when :ssl_tls then Net::SMTP.default_tls_port
97
- else Net::SMTP.default_port
74
+ # Update the connection parameters.
75
+ # See the ::new() method for initialization parameters.
76
+ def renew(params={})
77
+ server, from = params[:server], params[:from]
78
+ if server and from
79
+ settings = Settings.new
80
+ settings.from_addr = parse_addr(from)
81
+ settings.to_addrs = parse_addrs(*params[:to])
82
+ settings.cc_addrs = parse_addrs(*params[:cc])
83
+ settings.bcc_addrs = parse_addrs(*params[:bcc])
84
+ settings.domain = params[:domain] || settings.from_addr.first.split('@').last
85
+ settings.esmtp = params[:esmtp] != :disabled and params[:esmtp] != false
86
+ settings.enctype = params[:enctype]
87
+ authtype, username, password = params[:authtype], params[:username], params[:password]
88
+ if password and username and authtype and authtype != :none
89
+ settings.authtype = authtype
90
+ settings.username = username.encode(Encoding::UTF_8)
91
+ settings.password = password.encode(Encoding::UTF_8)
92
+ end
93
+ settings.server = server.encode(Encoding::UTF_8)
94
+ settings.port = params[:port] || case settings.enctype
95
+ when :starttls then Net::SMTP.default_submission_port
96
+ when :ssl_tls then Net::SMTP.default_tls_port
97
+ else Net::SMTP.default_port
98
+ end
99
+ @settings = settings
100
+ else
101
+ @settings = nil
98
102
  end
99
- @settings = settings
100
103
  end
101
104
 
102
- # Create a new mailer object and initialize connection parameters to Gmail server.
105
+ # Create a new object and initialize connection parameters to Gmail server.
103
106
  # +-----------------------------------------------------------------------------------+
104
107
  # | Gmail Initialization Parameters |
105
108
  # +------------+-------------------------------------------+--------------------------+
@@ -112,38 +115,43 @@ class EmailSender
112
115
  # |:cc |<string>, <array of string> |[] |
113
116
  # |:bcc |<string>, <array of string> |[] |
114
117
  # +------------+-------------------------------------------+--------------------------+
115
- def self.new_gmail(params)
118
+ # If you do not give any parameters, the instance does not initialize, and the #send() method will do nothing
119
+ # and return with a nil. You can set and modify the parameters later with the #renew() or #renew_gmail() methods.
120
+ def self.new_gmail(params={})
116
121
  instance = allocate()
117
122
  instance.renew_gmail(params)
118
123
  instance
119
124
  end
120
125
 
121
126
  # Update the connection parameters to Gmail server.
122
- # See the ::new_gmail method for Gmail initialization parameters.
123
- def renew_gmail(params)
124
- params = params.dup
125
- params[:server] = 'smtp.gmail.com'
126
- params[:port] = 465
127
- params[:domain] = 'gmail.com'
128
- params[:esmtp] = :enabled
129
- params[:enctype] = :ssl_tls
130
- params[:authtype] = :plain
131
- username = params[:username]
132
- from = params[:from]
133
- if username
134
- username = username.encode(Encoding::UTF_8)
135
- params[:username] = username << '@gmail.com' unless username.include?('@')
136
- params[:from] = username unless from
137
- end
138
- if from
139
- from_name, from_addr = parse_addr(from)
140
- unless from_addr.include?('@')
141
- from_addr << '@gmail.com'
142
- params[:from] = from_name ? "#{from_name} <#{from_addr}>" : from_addr
127
+ # See the ::new_gmail() method for Gmail initialization parameters.
128
+ def renew_gmail(params={})
129
+ username, password, from = params[:username], params[:password], params[:from]
130
+ if password and (username or from)
131
+ params = params.dup
132
+ params[:server] = 'smtp.gmail.com'
133
+ params[:port] = 465
134
+ params[:domain] = 'gmail.com'
135
+ params[:esmtp] = :enabled
136
+ params[:enctype] = :ssl_tls
137
+ params[:authtype] = :plain
138
+ if username
139
+ username = username.encode(Encoding::UTF_8)
140
+ params[:username] = username << '@gmail.com' unless username.include?('@')
141
+ params[:from] = username unless from
143
142
  end
144
- params[:username] = from_addr unless username
143
+ if from
144
+ from_addr, from_name = parse_addr(from)
145
+ unless from_addr.include?('@')
146
+ from_addr << '@gmail.com'
147
+ params[:from] = from_name ? "#{from_name} <#{from_addr}>" : from_addr
148
+ end
149
+ params[:username] = from_addr unless username
150
+ end
151
+ renew(params)
152
+ else
153
+ renew()
145
154
  end
146
- renew(params)
147
155
  end
148
156
 
149
157
  # Send an email with the specified parameters.
@@ -160,103 +168,111 @@ class EmailSender
160
168
  # |:conttype |<string> |'text/plain' |
161
169
  # |:attachment |<string>, <array of string> |[] |
162
170
  # +------------+-------------------------------------------+--------------------------+
171
+ # After a successful email sending it returns with a truth value (not nil and not false).
172
+ # If there is not any valid recipient email address or the object is not initialized, then it does nothing
173
+ # and returns with a nil. Anyway if any error occured during the sending, the Net::SMTP library throw an exception.
174
+ #
163
175
  # See the README for more information!
164
176
  def send(params={})
165
177
  settings = @settings
166
- subject = params[:subject] || ''
167
- content = params[:content] || subject
168
- conttype = params[:conttype] || 'text/plain'
169
- attachment = *params[:attachment]
170
- to = *params[:to]
171
- cc = *params[:cc]
172
- bcc = *params[:bcc]
173
- if to.empty? and cc.empty? and bcc.empty?
174
- to_addrs = settings.to_addrs
175
- cc_addrs = settings.cc_addrs
176
- bcc_addrs = settings.bcc_addrs
177
- else
178
- to_addrs = parse_addrs(*to)
179
- cc_addrs = parse_addrs(*cc)
180
- bcc_addrs = parse_addrs(*bcc)
181
- end
182
- unless to_addrs.empty?
183
- subject = subject.encode(Encoding::UTF_8)
184
- content = content.encode(Encoding::UTF_8)
185
- smtp = Net::SMTP.new(settings.server, settings.port)
186
- smtp.disable_starttls
187
- smtp.disable_tls
188
- case settings.enctype
189
- when :starttls_auto then smtp.enable_starttls_auto
190
- when :starttls then smtp.enable_starttls
191
- when :ssl_tls then smtp.enable_tls
178
+ if settings
179
+ subject = params[:subject] || ''
180
+ content = params[:content] || subject
181
+ conttype = params[:conttype] || 'text/plain'
182
+ attachment = *params[:attachment]
183
+ to = *params[:to]
184
+ cc = *params[:cc]
185
+ bcc = *params[:bcc]
186
+ if to.empty? and cc.empty? and bcc.empty?
187
+ to_addrs = settings.to_addrs
188
+ cc_addrs = settings.cc_addrs
189
+ bcc_addrs = settings.bcc_addrs
190
+ else
191
+ to_addrs = parse_addrs(*to)
192
+ cc_addrs = parse_addrs(*cc)
193
+ bcc_addrs = parse_addrs(*bcc)
192
194
  end
193
- smtp.esmtp = settings.esmtp
194
- message_id = nil
195
- smtp.start(settings.domain, settings.username, settings.password, settings.authtype) do
196
- from_name, from_addr = settings.from_addr
197
- smtp.open_message_stream(from_addr, *to_addrs.keys, *cc_addrs.keys, *bcc_addrs.keys) do |stream|
198
- now = Time.now
199
- random_id = '%04x%04x.%08x.%08x.%08x' % [Process.pid & 0xFFFF, Thread.current.object_id & 0xFFFF,
200
- now.tv_sec & 0xFFFF_FFFF, now.tv_nsec, rand(0x1_0000_0000)]
201
- message_id = "#{random_id}@#{settings.domain}"
202
- boundary = "boundary0_#{random_id}"
203
- stream.puts("Message-ID: <#{message_id}>")
204
- stream.puts(now.strftime('Date: %a, %d %b %Y %H:%M:%S %z'))
205
- stream.puts("From: " << (from_name ? (from_name.ascii_only? ? "#{from_name} <#{from_addr}>" :
206
- "=?utf-8?B?#{[from_name].pack('m0')}?= <#{from_addr}>") : from_addr))
207
- to_str = ''
208
- to_addrs.each do |addr, name|
209
- to = name ? "#{name.ascii_only? ? name : "=?utf-8?B?#{[name].pack('m0')}?="} <#{addr}>" : addr
210
- to_str << (to_str.empty? ? "To: #{to}" : ",\n\t#{to}")
211
- end
212
- stream.puts(to_str) unless to_str.empty?
213
- cc_str = ''
214
- cc_addrs.each do |addr, name|
215
- cc = name ? "#{name.ascii_only? ? name : "=?utf-8?B?#{[name].pack('m0')}?="} <#{addr}>" : addr
216
- cc_str << (cc_str.empty? ? "CC: #{cc}" : ",\n\t#{cc}")
217
- end
218
- stream.puts(cc_str) unless cc_str.empty?
219
- stream.puts("Subject: " << (subject.ascii_only? ? subject : "=?utf-8?B?#{[subject].pack('m0')}?="))
220
- stream.puts("MIME-Version: 1.0")
221
- unless attachment.empty?
222
- stream.puts("Content-Type: multipart/mixed; boundary=\"#{boundary}\"")
223
- stream.puts
224
- stream.puts("This is a multi-part message in MIME format.")
225
- stream.puts("--#{boundary}")
226
- end
227
- stream.puts("Content-Type: #{conttype}; charset=#{content.ascii_only? ? 'us-ascii' : 'utf-8'}")
228
- stream.puts("Content-Transfer-Encoding: base64")
229
- stream.puts
230
- stream.print([content].pack('m57'))
231
- unless attachment.empty?
232
- attachment.each do |file|
233
- file = file.encode(Encoding::UTF_8)
234
- basename = File.basename(file)
235
- filename = basename.ascii_only? ? basename : "=?utf-8?B?#{[basename].pack('m0')}?="
236
- stream.puts("--#{boundary}")
237
- stream.puts("Content-Type: application/octet-stream; name=\"#{filename}\"")
238
- stream.puts("Content-Transfer-Encoding: base64")
239
- stream.puts("Content-Disposition: attachment; filename=\"#{filename}\"")
195
+ unless to_addrs.empty? and cc_addrs.empty? and bcc_addrs.empty?
196
+ subject = subject.encode(Encoding::UTF_8)
197
+ content = content.encode(Encoding::UTF_8)
198
+ smtp = Net::SMTP.new(settings.server, settings.port)
199
+ smtp.disable_starttls
200
+ smtp.disable_tls
201
+ case settings.enctype
202
+ when :starttls_auto then smtp.enable_starttls_auto
203
+ when :starttls then smtp.enable_starttls
204
+ when :ssl_tls then smtp.enable_tls
205
+ end
206
+ smtp.esmtp = settings.esmtp
207
+ message_id = nil
208
+ smtp.start(settings.domain, settings.username, settings.password, settings.authtype) do
209
+ from_addr, from_name = settings.from_addr
210
+ smtp.open_message_stream(from_addr, *to_addrs.keys, *cc_addrs.keys, *bcc_addrs.keys) do |stream|
211
+ now = Time.now
212
+ random_id = '%04x%04x.%08x.%08x.%08x' % [Process.pid & 0xFFFF, Thread.current.object_id & 0xFFFF,
213
+ now.tv_sec & 0xFFFF_FFFF, now.tv_nsec, rand(0x1_0000_0000)]
214
+ message_id = "#{random_id}@#{settings.domain}"
215
+ boundary = "boundary0_#{random_id}"
216
+ stream.puts("Message-ID: <#{message_id}>")
217
+ stream.puts(now.strftime('Date: %a, %d %b %Y %H:%M:%S %z'))
218
+ stream.puts("From: " << (from_name ? (from_name.ascii_only? ? "#{from_name} <#{from_addr}>" :
219
+ "=?utf-8?B?#{[from_name].pack('m0')}?= <#{from_addr}>") : from_addr))
220
+ to_str = ''
221
+ to_addrs.each do |addr, name|
222
+ to = name ? "#{name.ascii_only? ? name : "=?utf-8?B?#{[name].pack('m0')}?="} <#{addr}>" : addr
223
+ to_str << (to_str.empty? ? "To: #{to}" : ",\n\t#{to}")
224
+ end
225
+ stream.puts(to_str) unless to_str.empty?
226
+ cc_str = ''
227
+ cc_addrs.each do |addr, name|
228
+ cc = name ? "#{name.ascii_only? ? name : "=?utf-8?B?#{[name].pack('m0')}?="} <#{addr}>" : addr
229
+ cc_str << (cc_str.empty? ? "CC: #{cc}" : ",\n\t#{cc}")
230
+ end
231
+ stream.puts(cc_str) unless cc_str.empty?
232
+ stream.puts("Subject: " << (subject.ascii_only? ? subject : "=?utf-8?B?#{[subject].pack('m0')}?="))
233
+ stream.puts("MIME-Version: 1.0")
234
+ unless attachment.empty?
235
+ stream.puts("Content-Type: multipart/mixed; boundary=\"#{boundary}\"")
240
236
  stream.puts
241
- File.open(file) { |io| stream.print([io.read(ATTACHMENT_READ_CACHE)].pack('m57')) until io.eof? }
237
+ stream.puts("This is a multi-part message in MIME format.")
238
+ stream.puts("--#{boundary}")
239
+ end
240
+ stream.puts("Content-Type: #{conttype}; charset=#{content.ascii_only? ? 'us-ascii' : 'utf-8'}")
241
+ stream.puts("Content-Transfer-Encoding: base64")
242
+ stream.puts
243
+ stream.print([content].pack('m57'))
244
+ unless attachment.empty?
245
+ attachment.each do |file|
246
+ file = file.encode(Encoding::UTF_8)
247
+ basename = File.basename(file)
248
+ filename = basename.ascii_only? ? basename : "=?utf-8?B?#{[basename].pack('m0')}?="
249
+ stream.puts("--#{boundary}")
250
+ stream.puts("Content-Type: application/octet-stream; name=\"#{filename}\"")
251
+ stream.puts("Content-Transfer-Encoding: base64")
252
+ stream.puts("Content-Disposition: attachment; filename=\"#{filename}\"")
253
+ stream.puts
254
+ File.open(file) { |io| stream.print([io.read(ATTACHMENT_READ_CACHE)].pack('m57')) until io.eof? }
255
+ end
256
+ stream.puts("--#{boundary}--")
242
257
  end
243
- stream.puts("--#{boundary}--")
244
258
  end
245
259
  end
260
+ message_id
246
261
  end
247
- message_id
248
262
  end
249
263
  end
250
264
 
251
265
  private
252
266
  def parse_addr(str)
253
267
  str = str.encode(Encoding::UTF_8)
254
- str.scan(/\A\s*(.*?)\s*<([^<]*?)>\s*\z/).first || [nil, (str.strip!; str)]
268
+ str.strip!
269
+ addr = str.scan(/\A(.*?)\s*<([^<]*?)>\z/).first
270
+ addr ? addr.reverse! : [str, nil]
255
271
  end
256
272
  def parse_addrs(*strs)
257
273
  addrs = {}
258
274
  strs.each do |str|
259
- name, addr = parse_addr(str)
275
+ addr, name = parse_addr(str)
260
276
  addrs[addr] = name
261
277
  end
262
278
  addrs
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: email_sender
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,10 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-19 00:00:00.000000000 Z
12
+ date: 2012-12-27 00:00:00.000000000 Z
13
13
  dependencies: []
14
- description: EmailSender is a easy to use library to send email through SMTP server
15
- based on Net::SMTP library.
14
+ description: ! 'EmailSender is an easy to use library to send email based on Net::SMTP.
15
+
16
+ It supports the well-known encryption and authentication methods, and you can use
17
+ it very easily with GMail account.'
16
18
  email: bakonyi.peter@gmail.com
17
19
  executables: []
18
20
  extensions: []
@@ -44,8 +46,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
44
46
  version: '0'
45
47
  requirements: []
46
48
  rubyforge_project:
47
- rubygems_version: 1.8.11
49
+ rubygems_version: 1.8.23
48
50
  signing_key:
49
51
  specification_version: 3
50
- summary: Easy to use library to send email through any SMTP server.
52
+ summary: EmailSender is an easy to use library to send email.
51
53
  test_files: []