mail 2.4.4 → 2.5.5

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 (82) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.rdoc +140 -1
  3. data/CONTRIBUTING.md +4 -4
  4. data/Gemfile +14 -8
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +24 -23
  7. data/Rakefile +3 -22
  8. data/lib/VERSION +2 -2
  9. data/lib/load_parsers.rb +35 -0
  10. data/lib/mail/attachments_list.rb +2 -2
  11. data/lib/mail/body.rb +5 -5
  12. data/lib/mail/check_delivery_params.rb +57 -0
  13. data/lib/mail/configuration.rb +1 -1
  14. data/lib/mail/core_extensions/nil.rb +4 -2
  15. data/lib/mail/core_extensions/object.rb +8 -8
  16. data/lib/mail/core_extensions/smtp.rb +12 -13
  17. data/lib/mail/core_extensions/string.rb +4 -4
  18. data/lib/mail/elements/address.rb +13 -5
  19. data/lib/mail/elements/envelope_from_element.rb +15 -2
  20. data/lib/mail/elements.rb +12 -12
  21. data/lib/mail/encodings/quoted_printable.rb +4 -3
  22. data/lib/mail/encodings.rb +66 -35
  23. data/lib/mail/field.rb +76 -99
  24. data/lib/mail/fields/bcc_field.rb +2 -2
  25. data/lib/mail/fields/cc_field.rb +2 -2
  26. data/lib/mail/fields/comments_field.rb +1 -1
  27. data/lib/mail/fields/common/common_address.rb +19 -4
  28. data/lib/mail/fields/common/common_field.rb +8 -2
  29. data/lib/mail/fields/common/common_message_id.rb +9 -5
  30. data/lib/mail/fields/content_disposition_field.rb +1 -0
  31. data/lib/mail/fields/content_id_field.rb +1 -2
  32. data/lib/mail/fields/content_transfer_encoding_field.rb +2 -2
  33. data/lib/mail/fields/content_type_field.rb +5 -2
  34. data/lib/mail/fields/date_field.rb +14 -14
  35. data/lib/mail/fields/from_field.rb +2 -2
  36. data/lib/mail/fields/in_reply_to_field.rb +2 -1
  37. data/lib/mail/fields/keywords_field.rb +1 -1
  38. data/lib/mail/fields/message_id_field.rb +2 -3
  39. data/lib/mail/fields/references_field.rb +2 -1
  40. data/lib/mail/fields/reply_to_field.rb +2 -2
  41. data/lib/mail/fields/resent_bcc_field.rb +2 -2
  42. data/lib/mail/fields/resent_cc_field.rb +2 -2
  43. data/lib/mail/fields/resent_from_field.rb +2 -2
  44. data/lib/mail/fields/resent_sender_field.rb +2 -2
  45. data/lib/mail/fields/resent_to_field.rb +2 -2
  46. data/lib/mail/fields/sender_field.rb +7 -7
  47. data/lib/mail/fields/to_field.rb +2 -2
  48. data/lib/mail/fields/unstructured_field.rb +34 -27
  49. data/lib/mail/fields.rb +32 -32
  50. data/lib/mail/header.rb +37 -14
  51. data/lib/mail/message.rb +140 -45
  52. data/lib/mail/multibyte/chars.rb +4 -4
  53. data/lib/mail/multibyte/unicode.rb +8 -0
  54. data/lib/mail/network/delivery_methods/exim.rb +6 -11
  55. data/lib/mail/network/delivery_methods/file_delivery.rb +7 -6
  56. data/lib/mail/network/delivery_methods/sendmail.rb +40 -11
  57. data/lib/mail/network/delivery_methods/smtp.rb +33 -47
  58. data/lib/mail/network/delivery_methods/smtp_connection.rb +7 -24
  59. data/lib/mail/network/delivery_methods/test_mailer.rb +9 -8
  60. data/lib/mail/network/retriever_methods/imap.rb +14 -6
  61. data/lib/mail/network/retriever_methods/pop3.rb +2 -2
  62. data/lib/mail/network/retriever_methods/test_retriever.rb +11 -15
  63. data/lib/mail/network.rb +9 -9
  64. data/lib/mail/parsers/content_transfer_encoding.rb +81 -42
  65. data/lib/mail/parsers/content_transfer_encoding.treetop +4 -6
  66. data/lib/mail/parsers/content_type.rb +16 -12
  67. data/lib/mail/parsers/content_type.treetop +2 -2
  68. data/lib/mail/parsers/rfc2045.rb +12 -55
  69. data/lib/mail/parsers/rfc2045.treetop +1 -2
  70. data/lib/mail/parsers/rfc2822.rb +127 -71
  71. data/lib/mail/parsers/rfc2822.treetop +22 -24
  72. data/lib/mail/part.rb +6 -2
  73. data/lib/mail/parts_list.rb +1 -1
  74. data/lib/mail/patterns.rb +1 -1
  75. data/lib/mail/utilities.rb +25 -17
  76. data/lib/mail/values/unicode_tables.dat +0 -0
  77. data/lib/mail/version_specific/ruby_1_8.rb +23 -2
  78. data/lib/mail/version_specific/ruby_1_9.rb +55 -21
  79. data/lib/mail.rb +18 -18
  80. metadata +89 -37
  81. data/Gemfile.lock +0 -36
  82. data/lib/mail/core_extensions/shell_escape.rb +0 -56
@@ -51,9 +51,9 @@ module Mail
51
51
  def Ruby19.b_value_decode(str)
52
52
  match = str.match(/\=\?(.+)?\?[Bb]\?(.+)?\?\=/m)
53
53
  if match
54
- encoding = match[1]
54
+ charset = match[1]
55
55
  str = Ruby19.decode_base64(match[2])
56
- str.force_encoding(fix_encoding(encoding))
56
+ str.force_encoding(pick_encoding(charset))
57
57
  end
58
58
  decoded = str.encode("utf-8", :invalid => :replace, :replace => "")
59
59
  decoded.valid_encoding? ? decoded : decoded.encode("utf-16le", :invalid => :replace, :replace => "").encode("utf-8")
@@ -67,12 +67,20 @@ module Mail
67
67
  def Ruby19.q_value_decode(str)
68
68
  match = str.match(/\=\?(.+)?\?[Qq]\?(.+)?\?\=/m)
69
69
  if match
70
- encoding = match[1]
71
- str = Encodings::QuotedPrintable.decode(match[2].gsub(/_/, '=20'))
72
- str.force_encoding(fix_encoding(encoding))
70
+ charset = match[1]
71
+ string = match[2].gsub(/_/, '=20')
72
+ # Remove trailing = if it exists in a Q encoding
73
+ string = string.sub(/\=$/, '')
74
+ str = Encodings::QuotedPrintable.decode(string)
75
+ str.force_encoding(pick_encoding(charset))
76
+ # We assume that binary strings hold utf-8 directly to work around
77
+ # jruby/jruby#829 which subtly changes String#encode semantics.
78
+ str.force_encoding('utf-8') if str.encoding == Encoding::ASCII_8BIT
73
79
  end
74
80
  decoded = str.encode("utf-8", :invalid => :replace, :replace => "")
75
81
  decoded.valid_encoding? ? decoded : decoded.encode("utf-16le", :invalid => :replace, :replace => "").encode("utf-8")
82
+ rescue Encoding::UndefinedConversionError
83
+ str.dup.force_encoding("utf-8")
76
84
  end
77
85
 
78
86
  def Ruby19.param_decode(str, encoding)
@@ -91,22 +99,48 @@ module Mail
91
99
  @uri_parser ||= URI::Parser.new
92
100
  end
93
101
 
94
- # mails somtimes includes invalid encodings like iso885915 or utf8 so we transform them to iso885915 or utf8
95
- # TODO: add this as a test somewhere
96
- # Encoding.list.map{|e| [e.to_s.upcase==fix_encoding(e.to_s.downcase.gsub("-", "")), e.to_s] }.select {|a,b| !b}
97
- # Encoding.list.map{|e| [e.to_s==fix_encoding(e.to_s), e.to_s] }.select {|a,b| !b}
98
- def Ruby19.fix_encoding(encoding)
99
- case encoding
100
- # ISO-8859-15, ISO-2022-JP and alike
101
- when /iso-?(\d{4})-?(\w{1,2})/i then return "ISO-#{$1}-#{$2}"
102
- # "ISO-2022-JP-KDDI" and alike
103
- when /iso-?(\d{4})-?(\w{1,2})-?(\w*)/i then return "ISO-#{$1}-#{$2}-#{$3}"
104
- # UTF-8, UTF-32BE and alike
105
- when /utf-?(\d{1,2})?(\w{1,2})/i then return "UTF-#{$1}#{$2}".gsub(/\A(UTF-(?:16|32))\z/, '\\1BE')
106
- # Windows-1252 and alike
107
- when /Windows-?(.*)/i then return "Windows-#{$1}"
108
- #more aliases to be added if needed
109
- else return encoding
102
+ # Pick a Ruby encoding corresponding to the message charset. Most
103
+ # charsets have a Ruby encoding, but some need manual aliasing here.
104
+ #
105
+ # TODO: add this as a test somewhere:
106
+ # Encoding.list.map { |e| [e.to_s.upcase == pick_encoding(e.to_s.downcase.gsub("-", "")), e.to_s] }.select {|a,b| !b}
107
+ # Encoding.list.map { |e| [e.to_s == pick_encoding(e.to_s), e.to_s] }.select {|a,b| !b}
108
+ def Ruby19.pick_encoding(charset)
109
+ case charset
110
+
111
+ # ISO-8859-15, ISO-2022-JP and alike
112
+ when /iso-?(\d{4})-?(\w{1,2})/i
113
+ "ISO-#{$1}-#{$2}"
114
+
115
+ # "ISO-2022-JP-KDDI" and alike
116
+ when /iso-?(\d{4})-?(\w{1,2})-?(\w*)/i
117
+ "ISO-#{$1}-#{$2}-#{$3}"
118
+
119
+ # UTF-8, UTF-32BE and alike
120
+ when /utf-?(\d{1,2})?(\w{1,2})/i
121
+ "UTF-#{$1}#{$2}".gsub(/\A(UTF-(?:16|32))\z/, '\\1BE')
122
+
123
+ # Windows-1252 and alike
124
+ when /Windows-?(.*)/i
125
+ "Windows-#{$1}"
126
+
127
+ when /^8bit$/
128
+ Encoding::ASCII_8BIT
129
+
130
+ # Microsoft-specific alias for CP949 (Korean)
131
+ when 'ks_c_5601-1987'
132
+ Encoding::CP949
133
+
134
+ # Wrongly written Shift_JIS (Japanese)
135
+ when 'shift-jis'
136
+ Encoding::Shift_JIS
137
+
138
+ # GB2312 (Chinese charset) is a subset of GB18030 (its replacement)
139
+ when /gb2312/i
140
+ Encoding::GB18030
141
+
142
+ else
143
+ charset
110
144
  end
111
145
  end
112
146
  end
data/lib/mail.rb CHANGED
@@ -29,7 +29,6 @@ module Mail # :doc:
29
29
  require 'mail/core_extensions/nil'
30
30
  require 'mail/core_extensions/object'
31
31
  require 'mail/core_extensions/string'
32
- require 'mail/core_extensions/shell_escape'
33
32
  require 'mail/core_extensions/smtp' if RUBY_VERSION < '1.9.3'
34
33
  require 'mail/indifferent_hash'
35
34
 
@@ -46,6 +45,23 @@ module Mail # :doc:
46
45
  require 'mail/utilities'
47
46
  require 'mail/configuration'
48
47
 
48
+ @@autoloads = {}
49
+ def self.register_autoload(name, path)
50
+ @@autoloads[name] = path
51
+ autoload(name, path)
52
+ end
53
+
54
+ # This runs through the autoload list and explictly requires them for you.
55
+ # Useful when running mail in a threaded process.
56
+ #
57
+ # Usage:
58
+ #
59
+ # require 'mail'
60
+ # Mail.eager_autoload!
61
+ def self.eager_autoload!
62
+ @@autoloads.each { |_,path| require(path) }
63
+ end
64
+
49
65
  # Autoload mail send and receive classes.
50
66
  require 'mail/network'
51
67
 
@@ -60,23 +76,7 @@ module Mail # :doc:
60
76
 
61
77
  require 'mail/envelope'
62
78
 
63
- parsers = %w[ rfc2822_obsolete rfc2822 address_lists phrase_lists
64
- date_time received message_ids envelope_from rfc2045
65
- mime_version content_type content_disposition
66
- content_transfer_encoding content_location ]
67
-
68
- parsers.each do |parser|
69
- begin
70
- # Try requiring the pre-compiled ruby version first
71
- require 'treetop/runtime'
72
- require "mail/parsers/#{parser}"
73
- rescue LoadError
74
- # Otherwise, get treetop to compile and load it
75
- require 'treetop/runtime'
76
- require 'treetop/compiler'
77
- Treetop.load(File.join(File.dirname(__FILE__)) + "/mail/parsers/#{parser}")
78
- end
79
- end
79
+ require 'load_parsers'
80
80
 
81
81
  # Autoload header field elements and transfer encodings.
82
82
  require 'mail/elements'
metadata CHANGED
@@ -1,49 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mail
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.4
5
- prerelease:
4
+ version: 2.5.5
6
5
  platform: ruby
7
6
  authors:
8
7
  - Mikel Lindsaar
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-03-14 00:00:00.000000000Z
11
+ date: 2017-06-09 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: mime-types
16
- requirement: &70305676450460 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '1.16'
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *70305676450460
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: treetop
27
- requirement: &70305676449980 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - ~>
31
+ - - "~>"
31
32
  - !ruby/object:Gem::Version
32
33
  version: 1.4.8
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *70305676449980
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.4.8
36
41
  - !ruby/object:Gem::Dependency
37
- name: i18n
38
- requirement: &70305676449520 !ruby/object:Gem::Requirement
39
- none: false
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
40
44
  requirements:
41
- - - ! '>='
45
+ - - ">="
42
46
  - !ruby/object:Gem::Version
43
- version: 0.4.0
44
- type: :runtime
47
+ version: 1.0.3
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.8.7
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.8.7
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 2.12.0
76
+ type: :development
45
77
  prerelease: false
46
- version_requirements: *70305676449520
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.12.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rdoc
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
47
97
  description: A really Ruby Mail handler.
48
98
  email: raasdnil@gmail.com
49
99
  executables: []
@@ -54,24 +104,28 @@ extra_rdoc_files:
54
104
  - CHANGELOG.rdoc
55
105
  - TODO.rdoc
56
106
  files:
57
- - README.md
58
- - CONTRIBUTING.md
59
107
  - CHANGELOG.rdoc
108
+ - CONTRIBUTING.md
60
109
  - Dependencies.txt
61
110
  - Gemfile
62
- - Gemfile.lock
111
+ - MIT-LICENSE
112
+ - README.md
63
113
  - Rakefile
64
114
  - TODO.rdoc
115
+ - lib/VERSION
116
+ - lib/load_parsers.rb
117
+ - lib/mail.rb
65
118
  - lib/mail/attachments_list.rb
66
119
  - lib/mail/body.rb
120
+ - lib/mail/check_delivery_params.rb
67
121
  - lib/mail/configuration.rb
68
122
  - lib/mail/core_extensions/nil.rb
69
123
  - lib/mail/core_extensions/object.rb
70
- - lib/mail/core_extensions/shell_escape.rb
71
124
  - lib/mail/core_extensions/smtp.rb
125
+ - lib/mail/core_extensions/string.rb
72
126
  - lib/mail/core_extensions/string/access.rb
73
127
  - lib/mail/core_extensions/string/multibyte.rb
74
- - lib/mail/core_extensions/string.rb
128
+ - lib/mail/elements.rb
75
129
  - lib/mail/elements/address.rb
76
130
  - lib/mail/elements/address_list.rb
77
131
  - lib/mail/elements/content_disposition_element.rb
@@ -84,17 +138,17 @@ files:
84
138
  - lib/mail/elements/mime_version_element.rb
85
139
  - lib/mail/elements/phrase_list.rb
86
140
  - lib/mail/elements/received_element.rb
87
- - lib/mail/elements.rb
141
+ - lib/mail/encodings.rb
88
142
  - lib/mail/encodings/7bit.rb
89
143
  - lib/mail/encodings/8bit.rb
90
144
  - lib/mail/encodings/base64.rb
91
145
  - lib/mail/encodings/binary.rb
92
146
  - lib/mail/encodings/quoted_printable.rb
93
147
  - lib/mail/encodings/transfer_encoding.rb
94
- - lib/mail/encodings.rb
95
148
  - lib/mail/envelope.rb
96
149
  - lib/mail/field.rb
97
150
  - lib/mail/field_list.rb
151
+ - lib/mail/fields.rb
98
152
  - lib/mail/fields/bcc_field.rb
99
153
  - lib/mail/fields/cc_field.rb
100
154
  - lib/mail/fields/comments_field.rb
@@ -133,17 +187,17 @@ files:
133
187
  - lib/mail/fields/subject_field.rb
134
188
  - lib/mail/fields/to_field.rb
135
189
  - lib/mail/fields/unstructured_field.rb
136
- - lib/mail/fields.rb
137
190
  - lib/mail/header.rb
138
191
  - lib/mail/indifferent_hash.rb
139
192
  - lib/mail/mail.rb
140
193
  - lib/mail/matchers/has_sent_mail.rb
141
194
  - lib/mail/message.rb
195
+ - lib/mail/multibyte.rb
142
196
  - lib/mail/multibyte/chars.rb
143
197
  - lib/mail/multibyte/exceptions.rb
144
198
  - lib/mail/multibyte/unicode.rb
145
199
  - lib/mail/multibyte/utils.rb
146
- - lib/mail/multibyte.rb
200
+ - lib/mail/network.rb
147
201
  - lib/mail/network/delivery_methods/exim.rb
148
202
  - lib/mail/network/delivery_methods/file_delivery.rb
149
203
  - lib/mail/network/delivery_methods/sendmail.rb
@@ -154,7 +208,6 @@ files:
154
208
  - lib/mail/network/retriever_methods/imap.rb
155
209
  - lib/mail/network/retriever_methods/pop3.rb
156
210
  - lib/mail/network/retriever_methods/test_retriever.rb
157
- - lib/mail/network.rb
158
211
  - lib/mail/parsers/address_lists.rb
159
212
  - lib/mail/parsers/address_lists.treetop
160
213
  - lib/mail/parsers/content_disposition.rb
@@ -187,35 +240,34 @@ files:
187
240
  - lib/mail/parts_list.rb
188
241
  - lib/mail/patterns.rb
189
242
  - lib/mail/utilities.rb
243
+ - lib/mail/values/unicode_tables.dat
190
244
  - lib/mail/version.rb
191
245
  - lib/mail/version_specific/ruby_1_8.rb
192
246
  - lib/mail/version_specific/ruby_1_9.rb
193
- - lib/mail.rb
194
247
  - lib/tasks/corpus.rake
195
248
  - lib/tasks/treetop.rake
196
- - lib/VERSION
197
249
  homepage: http://github.com/mikel/mail
198
- licenses: []
250
+ licenses:
251
+ - MIT
252
+ metadata: {}
199
253
  post_install_message:
200
254
  rdoc_options: []
201
255
  require_paths:
202
256
  - lib
203
257
  required_ruby_version: !ruby/object:Gem::Requirement
204
- none: false
205
258
  requirements:
206
- - - ! '>='
259
+ - - ">="
207
260
  - !ruby/object:Gem::Version
208
261
  version: '0'
209
262
  required_rubygems_version: !ruby/object:Gem::Requirement
210
- none: false
211
263
  requirements:
212
- - - ! '>='
264
+ - - ">="
213
265
  - !ruby/object:Gem::Version
214
266
  version: '0'
215
267
  requirements: []
216
268
  rubyforge_project:
217
- rubygems_version: 1.8.15
269
+ rubygems_version: 2.6.11
218
270
  signing_key:
219
- specification_version: 3
271
+ specification_version: 4
220
272
  summary: Mail provides a nice Ruby DSL for making, sending and reading emails.
221
273
  test_files: []
data/Gemfile.lock DELETED
@@ -1,36 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- activesupport (3.0.6)
5
- bouncy-castle-java (1.5.0146.1)
6
- diff-lcs (1.1.3)
7
- i18n (0.5.0)
8
- jruby-openssl (0.7.4)
9
- bouncy-castle-java
10
- mime-types (1.16)
11
- polyglot (0.3.3)
12
- rake (0.9.2.2)
13
- rspec (2.8.0)
14
- rspec-core (~> 2.8.0)
15
- rspec-expectations (~> 2.8.0)
16
- rspec-mocks (~> 2.8.0)
17
- rspec-core (2.8.0)
18
- rspec-expectations (2.8.0)
19
- diff-lcs (~> 1.1.2)
20
- rspec-mocks (2.8.0)
21
- treetop (1.4.10)
22
- polyglot
23
- polyglot (>= 0.3.1)
24
-
25
- PLATFORMS
26
- java
27
- ruby
28
-
29
- DEPENDENCIES
30
- activesupport (>= 2.3.6)
31
- i18n (>= 0.4.0)
32
- jruby-openssl
33
- mime-types (~> 1.16)
34
- rake (> 0.8.7)
35
- rspec (~> 2.8.0)
36
- treetop (~> 1.4.10)
@@ -1,56 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # The following is an adaptation of ruby 1.9.2's shellwords.rb file,
4
- # it is modified to include '+' in the allowed list to allow for
5
- # sendmail to accept email addresses as the sender with a + in them
6
- #
7
- module Mail
8
- module ShellEscape
9
- # Escapes a string so that it can be safely used in a Bourne shell
10
- # command line.
11
- #
12
- # Note that a resulted string should be used unquoted and is not
13
- # intended for use in double quotes nor in single quotes.
14
- #
15
- # open("| grep #{Shellwords.escape(pattern)} file") { |pipe|
16
- # # ...
17
- # }
18
- #
19
- # +String#shellescape+ is a shorthand for this function.
20
- #
21
- # open("| grep #{pattern.shellescape} file") { |pipe|
22
- # # ...
23
- # }
24
- #
25
- def escape_for_shell(str)
26
- # An empty argument will be skipped, so return empty quotes.
27
- return "''" if str.empty?
28
-
29
- str = str.dup
30
-
31
- # Process as a single byte sequence because not all shell
32
- # implementations are multibyte aware.
33
- str.gsub!(/([^A-Za-z0-9_\s\+\-.,:\/@\n])/n, "\\\\\\1")
34
-
35
- # A LF cannot be escaped with a backslash because a backslash + LF
36
- # combo is regarded as line continuation and simply ignored.
37
- str.gsub!(/\n/, "'\n'")
38
-
39
- return str
40
- end
41
-
42
- module_function :escape_for_shell
43
- end
44
- end
45
-
46
- class String
47
- # call-seq:
48
- # str.shellescape => string
49
- #
50
- # Escapes +str+ so that it can be safely used in a Bourne shell
51
- # command line. See +Shellwords::shellescape+ for details.
52
- #
53
- def escape_for_shell
54
- Mail::ShellEscape.escape_for_shell(self)
55
- end
56
- end