email_sender 1.1.0 → 1.2.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.
Files changed (4) hide show
  1. data/README.rdoc +2 -2
  2. data/VERSION +1 -1
  3. data/lib/email_sender.rb +23 -10
  4. metadata +3 -3
@@ -10,9 +10,9 @@ It supports the well-known encryption and authentication methods, and you can us
10
10
 
11
11
  == Usage
12
12
 
13
- You need specified the connection parameters to SMTP server on initialization:
13
+ You can specify the connection parameters to SMTP server at initialization:
14
14
 
15
- # simple unsafe connection
15
+ # simple connection
16
16
  mailer = EmailSender.new(server: "smtp.mail.com", from: "Sender Name <sender@mail.com>")
17
17
 
18
18
  # encripted and authenticated connection
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -33,7 +33,7 @@ class EmailSender
33
33
  # Major version number
34
34
  VERSION_MAJOR = 1
35
35
  # Minor version number
36
- VERSION_MINOR = 1
36
+ VERSION_MINOR = 2
37
37
  # Tiny version number
38
38
  VERSION_TINY = 0
39
39
  # Version number
@@ -44,7 +44,7 @@ class EmailSender
44
44
  ATTACHMENT_READ_CACHE = 116736 # multiple to 57 #:nodoc:
45
45
 
46
46
  Settings = Struct.new(:server, :port, :domain, :esmtp, :enctype, :authtype,
47
- :username, :password, :from_addr, :to_addrs, :cc_addrs, :bcc_addrs) #:nodoc:
47
+ :username, :password, :from_addr, :reply_addr, :to_addrs, :cc_addrs, :bcc_addrs) #:nodoc:
48
48
 
49
49
  # Create a new object and initialize connection parameters.
50
50
  # +-----------------------------------------------------------------------------------+
@@ -61,6 +61,7 @@ class EmailSender
61
61
  # |:username |<string> |nil |
62
62
  # |:password |<string> |nil |
63
63
  # |:from |<string> | |
64
+ # |:reply |<string> |nil |
64
65
  # |:to |<string>, <array of string> |[] |
65
66
  # |:cc |<string>, <array of string> |[] |
66
67
  # |:bcc |<string>, <array of string> |[] |
@@ -74,10 +75,11 @@ class EmailSender
74
75
  # Update the connection parameters.
75
76
  # See the ::new() method for initialization parameters.
76
77
  def renew(params={})
77
- server, from = params[:server], params[:from]
78
+ server, from, reply = params[:server], params[:from], params[:reply]
78
79
  if server and from
79
80
  settings = Settings.new
80
81
  settings.from_addr = parse_addr(from)
82
+ settings.reply_addr = parse_addr(reply) if reply
81
83
  settings.to_addrs = parse_addrs(*params[:to])
82
84
  settings.cc_addrs = parse_addrs(*params[:cc])
83
85
  settings.bcc_addrs = parse_addrs(*params[:bcc])
@@ -111,6 +113,7 @@ class EmailSender
111
113
  # |:username |<string> |-> from address |
112
114
  # |:password |<string> | |
113
115
  # |:from |<string> |-> username parameter |
116
+ # |:reply |<string> |nil |
114
117
  # |:to |<string>, <array of string> |[] |
115
118
  # |:cc |<string>, <array of string> |[] |
116
119
  # |:bcc |<string>, <array of string> |[] |
@@ -215,21 +218,26 @@ class EmailSender
215
218
  boundary = "boundary0_#{random_id}"
216
219
  stream.puts("Message-ID: <#{message_id}>")
217
220
  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))
221
+ stream.puts("From: #{from_name ? \
222
+ "=?#{check_charset(from_name)}?B?#{[from_name].pack('m0')}?= <#{from_addr}>" : from_addr}")
223
+ if settings.reply_addr
224
+ reply_addr, reply_name = settings.reply_addr
225
+ stream.puts("Reply-To: #{reply_name ? \
226
+ "=?#{check_charset(reply_name)}?B?#{[reply_name].pack('m0')}?= <#{reply_addr}>" : reply_addr}")
227
+ end
220
228
  to_str = ''
221
229
  to_addrs.each do |addr, name|
222
- to = name ? "#{name.ascii_only? ? name : "=?utf-8?B?#{[name].pack('m0')}?="} <#{addr}>" : addr
230
+ to = name ? "=?#{check_charset(name)}?B?#{[name].pack('m0')}?= <#{addr}>" : addr
223
231
  to_str << (to_str.empty? ? "To: #{to}" : ",\n\t#{to}")
224
232
  end
225
233
  stream.puts(to_str) unless to_str.empty?
226
234
  cc_str = ''
227
235
  cc_addrs.each do |addr, name|
228
- cc = name ? "#{name.ascii_only? ? name : "=?utf-8?B?#{[name].pack('m0')}?="} <#{addr}>" : addr
236
+ cc = name ? "=?#{check_charset(name)}?B?#{[name].pack('m0')}?= <#{addr}>" : addr
229
237
  cc_str << (cc_str.empty? ? "CC: #{cc}" : ",\n\t#{cc}")
230
238
  end
231
239
  stream.puts(cc_str) unless cc_str.empty?
232
- stream.puts("Subject: " << (subject.ascii_only? ? subject : "=?utf-8?B?#{[subject].pack('m0')}?="))
240
+ stream.puts("Subject: =?#{check_charset(subject)}?B?#{[subject].pack('m0')}?=")
233
241
  stream.puts("MIME-Version: 1.0")
234
242
  unless attachment.empty?
235
243
  stream.puts("Content-Type: multipart/mixed; boundary=\"#{boundary}\"")
@@ -237,7 +245,7 @@ class EmailSender
237
245
  stream.puts("This is a multi-part message in MIME format.")
238
246
  stream.puts("--#{boundary}")
239
247
  end
240
- stream.puts("Content-Type: #{conttype}; charset=#{content.ascii_only? ? 'us-ascii' : 'utf-8'}")
248
+ stream.puts("Content-Type: #{conttype}; charset=#{check_charset(content)}")
241
249
  stream.puts("Content-Transfer-Encoding: base64")
242
250
  stream.puts
243
251
  stream.print([content].pack('m57'))
@@ -245,7 +253,7 @@ class EmailSender
245
253
  attachment.each do |file|
246
254
  file = file.encode(Encoding::UTF_8)
247
255
  basename = File.basename(file)
248
- filename = basename.ascii_only? ? basename : "=?utf-8?B?#{[basename].pack('m0')}?="
256
+ filename = "=?#{check_charset(basename)}?B?#{[basename].pack('m0')}?="
249
257
  stream.puts("--#{boundary}")
250
258
  stream.puts("Content-Type: application/octet-stream; name=\"#{filename}\"")
251
259
  stream.puts("Content-Transfer-Encoding: base64")
@@ -263,12 +271,17 @@ class EmailSender
263
271
  end
264
272
 
265
273
  private
274
+ def check_charset(str)
275
+ str.ascii_only? ? 'us-ascii' : 'utf-8'
276
+ end
277
+
266
278
  def parse_addr(str)
267
279
  str = str.encode(Encoding::UTF_8)
268
280
  str.strip!
269
281
  addr = str.scan(/\A(.*?)\s*<([^<]*?)>\z/).first
270
282
  addr ? addr.reverse! : [str, nil]
271
283
  end
284
+
272
285
  def parse_addrs(*strs)
273
286
  addrs = {}
274
287
  strs.each do |str|
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.1.0
4
+ version: 1.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-27 00:00:00.000000000 Z
12
+ date: 2013-04-15 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! 'EmailSender is an easy to use library to send email based on Net::SMTP.
15
15
 
16
16
  It supports the well-known encryption and authentication methods, and you can use
17
- it very easily with GMail account.'
17
+ it very easily with Gmail account.'
18
18
  email: bakonyi.peter@gmail.com
19
19
  executables: []
20
20
  extensions: []