mail 2.7.1 → 2.8.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 (122) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +45 -28
  3. data/lib/mail/attachments_list.rb +2 -5
  4. data/lib/mail/body.rb +24 -47
  5. data/lib/mail/check_delivery_params.rb +21 -16
  6. data/lib/mail/constants.rb +27 -5
  7. data/lib/mail/elements/address.rb +27 -27
  8. data/lib/mail/elements/address_list.rb +1 -1
  9. data/lib/mail/elements/content_disposition_element.rb +1 -1
  10. data/lib/mail/elements/content_location_element.rb +1 -1
  11. data/lib/mail/elements/content_transfer_encoding_element.rb +1 -1
  12. data/lib/mail/elements/content_type_element.rb +8 -4
  13. data/lib/mail/elements/date_time_element.rb +1 -1
  14. data/lib/mail/elements/envelope_from_element.rb +13 -7
  15. data/lib/mail/elements/message_ids_element.rb +14 -5
  16. data/lib/mail/elements/mime_version_element.rb +1 -1
  17. data/lib/mail/elements/phrase_list.rb +7 -2
  18. data/lib/mail/elements/received_element.rb +20 -6
  19. data/lib/mail/encodings/7bit.rb +5 -0
  20. data/lib/mail/encodings/base64.rb +2 -2
  21. data/lib/mail/encodings/quoted_printable.rb +2 -2
  22. data/lib/mail/encodings.rb +30 -59
  23. data/lib/mail/envelope.rb +11 -14
  24. data/lib/mail/field.rb +37 -53
  25. data/lib/mail/field_list.rb +60 -7
  26. data/lib/mail/fields/bcc_field.rb +34 -52
  27. data/lib/mail/fields/cc_field.rb +28 -49
  28. data/lib/mail/fields/comments_field.rb +27 -37
  29. data/lib/mail/fields/common_address_field.rb +170 -0
  30. data/lib/mail/fields/common_date_field.rb +58 -0
  31. data/lib/mail/fields/common_field.rb +77 -0
  32. data/lib/mail/fields/common_message_id_field.rb +42 -0
  33. data/lib/mail/fields/content_description_field.rb +7 -14
  34. data/lib/mail/fields/content_disposition_field.rb +13 -38
  35. data/lib/mail/fields/content_id_field.rb +24 -51
  36. data/lib/mail/fields/content_location_field.rb +11 -25
  37. data/lib/mail/fields/content_transfer_encoding_field.rb +31 -31
  38. data/lib/mail/fields/content_type_field.rb +46 -71
  39. data/lib/mail/fields/date_field.rb +23 -51
  40. data/lib/mail/fields/from_field.rb +28 -49
  41. data/lib/mail/fields/in_reply_to_field.rb +38 -49
  42. data/lib/mail/fields/keywords_field.rb +18 -31
  43. data/lib/mail/fields/message_id_field.rb +25 -71
  44. data/lib/mail/fields/mime_version_field.rb +19 -30
  45. data/lib/mail/fields/named_structured_field.rb +11 -0
  46. data/lib/mail/fields/named_unstructured_field.rb +11 -0
  47. data/lib/mail/fields/optional_field.rb +5 -6
  48. data/lib/mail/fields/{common/parameter_hash.rb → parameter_hash.rb} +12 -10
  49. data/lib/mail/fields/received_field.rb +43 -57
  50. data/lib/mail/fields/references_field.rb +35 -49
  51. data/lib/mail/fields/reply_to_field.rb +28 -49
  52. data/lib/mail/fields/resent_bcc_field.rb +28 -49
  53. data/lib/mail/fields/resent_cc_field.rb +28 -49
  54. data/lib/mail/fields/resent_date_field.rb +5 -29
  55. data/lib/mail/fields/resent_from_field.rb +28 -49
  56. data/lib/mail/fields/resent_message_id_field.rb +5 -29
  57. data/lib/mail/fields/resent_sender_field.rb +27 -56
  58. data/lib/mail/fields/resent_to_field.rb +28 -49
  59. data/lib/mail/fields/return_path_field.rb +50 -54
  60. data/lib/mail/fields/sender_field.rb +34 -55
  61. data/lib/mail/fields/structured_field.rb +3 -30
  62. data/lib/mail/fields/subject_field.rb +9 -11
  63. data/lib/mail/fields/to_field.rb +28 -49
  64. data/lib/mail/fields/unstructured_field.rb +16 -48
  65. data/lib/mail/header.rb +69 -110
  66. data/lib/mail/matchers/attachment_matchers.rb +15 -0
  67. data/lib/mail/message.rb +52 -66
  68. data/lib/mail/multibyte/chars.rb +8 -166
  69. data/lib/mail/multibyte/utils.rb +26 -43
  70. data/lib/mail/multibyte.rb +1 -11
  71. data/lib/mail/network/delivery_methods/exim.rb +5 -4
  72. data/lib/mail/network/delivery_methods/file_delivery.rb +11 -10
  73. data/lib/mail/network/delivery_methods/logger_delivery.rb +2 -5
  74. data/lib/mail/network/delivery_methods/sendmail.rb +27 -35
  75. data/lib/mail/network/delivery_methods/smtp.rb +25 -9
  76. data/lib/mail/network/delivery_methods/smtp_connection.rb +3 -12
  77. data/lib/mail/network/delivery_methods/test_mailer.rb +4 -2
  78. data/lib/mail/network/retriever_methods/base.rb +8 -8
  79. data/lib/mail/network/retriever_methods/imap.rb +2 -2
  80. data/lib/mail/network/retriever_methods/pop3.rb +2 -2
  81. data/lib/mail/network/retriever_methods/test_retriever.rb +2 -1
  82. data/lib/mail/parsers/address_lists_parser.rb +33070 -33064
  83. data/lib/mail/parsers/address_lists_parser.rl +7 -0
  84. data/lib/mail/parsers/content_disposition_parser.rb +833 -827
  85. data/lib/mail/parsers/content_disposition_parser.rl +7 -0
  86. data/lib/mail/parsers/content_location_parser.rb +770 -764
  87. data/lib/mail/parsers/content_location_parser.rl +7 -0
  88. data/lib/mail/parsers/content_transfer_encoding_parser.rb +474 -468
  89. data/lib/mail/parsers/content_transfer_encoding_parser.rl +7 -0
  90. data/lib/mail/parsers/content_type_parser.rb +971 -965
  91. data/lib/mail/parsers/content_type_parser.rl +7 -0
  92. data/lib/mail/parsers/date_time_parser.rb +838 -832
  93. data/lib/mail/parsers/date_time_parser.rl +7 -0
  94. data/lib/mail/parsers/envelope_from_parser.rb +3623 -3529
  95. data/lib/mail/parsers/envelope_from_parser.rl +7 -0
  96. data/lib/mail/parsers/message_ids_parser.rb +5107 -2800
  97. data/lib/mail/parsers/message_ids_parser.rl +12 -1
  98. data/lib/mail/parsers/mime_version_parser.rb +463 -457
  99. data/lib/mail/parsers/mime_version_parser.rl +7 -0
  100. data/lib/mail/parsers/phrase_lists_parser.rb +836 -830
  101. data/lib/mail/parsers/phrase_lists_parser.rl +8 -1
  102. data/lib/mail/parsers/received_parser.rb +8688 -8682
  103. data/lib/mail/parsers/received_parser.rl +7 -0
  104. data/lib/mail/parsers/rfc5322.rl +28 -13
  105. data/lib/mail/parsers.rb +11 -17
  106. data/lib/mail/part.rb +5 -9
  107. data/lib/mail/parts_list.rb +57 -0
  108. data/lib/mail/smtp_envelope.rb +57 -0
  109. data/lib/mail/utilities.rb +307 -69
  110. data/lib/mail/version.rb +2 -2
  111. data/lib/mail/yaml.rb +30 -0
  112. data/lib/mail.rb +3 -20
  113. metadata +72 -18
  114. data/lib/mail/core_extensions/smtp.rb +0 -28
  115. data/lib/mail/core_extensions/string.rb +0 -17
  116. data/lib/mail/fields/common/address_container.rb +0 -17
  117. data/lib/mail/fields/common/common_address.rb +0 -161
  118. data/lib/mail/fields/common/common_date.rb +0 -36
  119. data/lib/mail/fields/common/common_field.rb +0 -52
  120. data/lib/mail/fields/common/common_message_id.rb +0 -49
  121. data/lib/mail/version_specific/ruby_1_8.rb +0 -163
  122. data/lib/mail/version_specific/ruby_1_9.rb +0 -278
@@ -1,65 +1,61 @@
1
1
  # encoding: utf-8
2
2
  # frozen_string_literal: true
3
- #
4
- # 4.4.3. REPLY-TO / RESENT-REPLY-TO
5
- #
6
- # Note: The "Return-Path" field is added by the mail transport
7
- # service, at the time of final deliver. It is intended
8
- # to identify a path back to the orginator of the mes-
9
- # sage. The "Reply-To" field is added by the message
10
- # originator and is intended to direct replies.
11
- #
12
- # trace = [return]
13
- # 1*received
14
- #
15
- # return = "Return-Path:" path CRLF
16
- #
17
- # path = ([CFWS] "<" ([CFWS] / addr-spec) ">" [CFWS]) /
18
- # obs-path
19
- #
20
- # received = "Received:" name-val-list ";" date-time CRLF
21
- #
22
- # name-val-list = [CFWS] [name-val-pair *(CFWS name-val-pair)]
23
- #
24
- # name-val-pair = item-name CFWS item-value
25
- #
26
- # item-name = ALPHA *(["-"] (ALPHA / DIGIT))
27
- #
28
- # item-value = 1*angle-addr / addr-spec /
29
- # atom / domain / msg-id
30
- #
31
- require 'mail/fields/common/common_address'
3
+ require 'mail/fields/common_address_field'
32
4
 
33
5
  module Mail
34
- class ReturnPathField < StructuredField
35
-
36
- include Mail::CommonAddress
37
-
38
- FIELD_NAME = 'return-path'
39
- CAPITALIZED_FIELD = 'Return-Path'
40
-
41
- def initialize(value = nil, charset = 'utf-8')
42
- value = nil if value == '<>'
43
- self.charset = charset
44
- super(CAPITALIZED_FIELD, value, charset)
45
- self
46
- end
47
-
48
- def encoded
49
- "#{CAPITALIZED_FIELD}: <#{address}>\r\n"
50
- end
51
-
52
- def decoded
53
- do_decode
6
+ # 4.4.3. REPLY-TO / RESENT-REPLY-TO
7
+ #
8
+ # Note: The "Return-Path" field is added by the mail transport
9
+ # service, at the time of final deliver. It is intended
10
+ # to identify a path back to the orginator of the mes-
11
+ # sage. The "Reply-To" field is added by the message
12
+ # originator and is intended to direct replies.
13
+ #
14
+ # trace = [return]
15
+ # 1*received
16
+ #
17
+ # return = "Return-Path:" path CRLF
18
+ #
19
+ # path = ([CFWS] "<" ([CFWS] / addr-spec) ">" [CFWS]) /
20
+ # obs-path
21
+ #
22
+ # received = "Received:" name-val-list ";" date-time CRLF
23
+ #
24
+ # name-val-list = [CFWS] [name-val-pair *(CFWS name-val-pair)]
25
+ #
26
+ # name-val-pair = item-name CFWS item-value
27
+ #
28
+ # item-name = ALPHA *(["-"] (ALPHA / DIGIT))
29
+ #
30
+ # item-value = 1*angle-addr / addr-spec /
31
+ # atom / domain / msg-id
32
+ #
33
+ class ReturnPathField < CommonAddressField #:nodoc:
34
+ NAME = 'Return-Path'
35
+
36
+ def self.singular?
37
+ true
54
38
  end
55
-
56
- def address
57
- addresses.first
39
+
40
+ def initialize(value = nil, charset = nil)
41
+ if value == '<>'
42
+ super nil, charset
43
+ else
44
+ super
45
+ end
58
46
  end
59
-
47
+
60
48
  def default
61
49
  address
62
50
  end
63
-
51
+
52
+ private
53
+ def do_encode
54
+ "#{name}: <#{address}>\r\n"
55
+ end
56
+
57
+ def do_decode
58
+ address
59
+ end
64
60
  end
65
61
  end
@@ -1,67 +1,46 @@
1
1
  # encoding: utf-8
2
2
  # frozen_string_literal: true
3
- #
4
- # = Sender Field
5
- #
6
- # The Sender field inherits sender StructuredField and handles the Sender: header
7
- # field in the email.
8
- #
9
- # Sending sender to a mail message will instantiate a Mail::Field object that
10
- # has a SenderField as its field type. This includes all Mail::CommonAddress
11
- # module instance metods.
12
- #
13
- # Only one Sender field can appear in a header, though it can have multiple
14
- # addresses and groups of addresses.
15
- #
16
- # == Examples:
17
- #
18
- # mail = Mail.new
19
- # mail.sender = 'Mikel Lindsaar <mikel@test.lindsaar.net>'
20
- # mail.sender #=> 'mikel@test.lindsaar.net'
21
- # mail[:sender] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::SenderField:0x180e1c4
22
- # mail['sender'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::SenderField:0x180e1c4
23
- # mail['Sender'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::SenderField:0x180e1c4
24
- #
25
- # mail[:sender].encoded #=> "Sender: Mikel Lindsaar <mikel@test.lindsaar.net>\r\n"
26
- # mail[:sender].decoded #=> 'Mikel Lindsaar <mikel@test.lindsaar.net>'
27
- # mail[:sender].addresses #=> ['mikel@test.lindsaar.net']
28
- # mail[:sender].formatted #=> ['Mikel Lindsaar <mikel@test.lindsaar.net>']
29
- #
30
- require 'mail/fields/common/common_address'
3
+ require 'mail/fields/common_address_field'
31
4
 
32
5
  module Mail
33
- class SenderField < StructuredField
34
-
35
- include Mail::CommonAddress
36
-
37
- FIELD_NAME = 'sender'
38
- CAPITALIZED_FIELD = 'Sender'
6
+ # = Sender Field
7
+ #
8
+ # The Sender field inherits sender StructuredField and handles the Sender: header
9
+ # field in the email.
10
+ #
11
+ # Sending sender to a mail message will instantiate a Mail::Field object that
12
+ # has a SenderField as its field type. This includes all Mail::CommonAddress
13
+ # module instance metods.
14
+ #
15
+ # Only one Sender field can appear in a header, though it can have multiple
16
+ # addresses and groups of addresses.
17
+ #
18
+ # == Examples:
19
+ #
20
+ # mail = Mail.new
21
+ # mail.sender = 'Mikel Lindsaar <mikel@test.lindsaar.net>'
22
+ # mail.sender #=> 'mikel@test.lindsaar.net'
23
+ # mail[:sender] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::SenderField:0x180e1c4
24
+ # mail['sender'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::SenderField:0x180e1c4
25
+ # mail['Sender'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::SenderField:0x180e1c4
26
+ #
27
+ # mail[:sender].encoded #=> "Sender: Mikel Lindsaar <mikel@test.lindsaar.net>\r\n"
28
+ # mail[:sender].decoded #=> 'Mikel Lindsaar <mikel@test.lindsaar.net>'
29
+ # mail[:sender].addresses #=> ['mikel@test.lindsaar.net']
30
+ # mail[:sender].formatted #=> ['Mikel Lindsaar <mikel@test.lindsaar.net>']
31
+ class SenderField < CommonAddressField #:nodoc:
32
+ NAME = 'Sender'
39
33
 
40
- def initialize(value = nil, charset = 'utf-8')
41
- self.charset = charset
42
- super(CAPITALIZED_FIELD, value, charset)
43
- self
34
+ def self.singular?
35
+ true
44
36
  end
45
37
 
46
- def addresses
47
- [address.address]
38
+ def default
39
+ address
48
40
  end
49
41
 
50
- def address
51
- address_list.addresses.first
52
- end
53
-
54
- def encoded
55
- do_encode(CAPITALIZED_FIELD)
56
- end
57
-
58
- def decoded
59
- do_decode
60
- end
61
-
62
- def default
63
- address.address
42
+ def addresses
43
+ Array(super.first)
64
44
  end
65
-
66
45
  end
67
46
  end
@@ -1,13 +1,13 @@
1
1
  # encoding: utf-8
2
2
  # frozen_string_literal: true
3
- require 'mail/fields/common/common_field'
3
+ require 'mail/fields/common_field'
4
4
 
5
5
  module Mail
6
6
  # Provides access to a structured header field
7
7
  #
8
8
  # ===Per RFC 2822:
9
9
  # 2.2.2. Structured Header Field Bodies
10
- #
10
+ #
11
11
  # Some field bodies in this standard have specific syntactical
12
12
  # structure more restrictive than the unstructured field bodies
13
13
  # described above. These are referred to as "structured" field bodies.
@@ -20,33 +20,6 @@ module Mail
20
20
  # characters are subject to header "folding" and "unfolding" as
21
21
  # described in section 2.2.3. Semantic analysis of structured field
22
22
  # bodies is given along with their syntax.
23
- class StructuredField
24
-
25
- include Mail::CommonField
26
- include Mail::Utilities
27
-
28
- def initialize(name = nil, value = nil, charset = nil)
29
- self.name = name
30
- self.value = value
31
- self.charset = charset
32
- self
33
- end
34
-
35
- def charset
36
- @charset
37
- end
38
-
39
- def charset=(val)
40
- @charset = val
41
- end
42
-
43
- def default
44
- decoded
45
- end
46
-
47
- def errors
48
- []
49
- end
50
-
23
+ class StructuredField < CommonField #:nodoc:
51
24
  end
52
25
  end
@@ -1,17 +1,15 @@
1
1
  # encoding: utf-8
2
2
  # frozen_string_literal: true
3
- #
4
- # subject = "Subject:" unstructured CRLF
3
+ require 'mail/fields/named_unstructured_field'
4
+
5
5
  module Mail
6
- class SubjectField < UnstructuredField
7
-
8
- FIELD_NAME = 'subject'
9
- CAPITALIZED_FIELD = "Subject"
10
-
11
- def initialize(value = nil, charset = 'utf-8')
12
- self.charset = charset
13
- super(CAPITALIZED_FIELD, value, charset)
6
+ #
7
+ # subject = "Subject:" unstructured CRLF
8
+ class SubjectField < NamedUnstructuredField #:nodoc:
9
+ NAME = 'Subject'
10
+
11
+ def self.singular?
12
+ true
14
13
  end
15
-
16
14
  end
17
15
  end
@@ -1,55 +1,34 @@
1
1
  # encoding: utf-8
2
2
  # frozen_string_literal: true
3
- #
4
- # = To Field
5
- #
6
- # The To field inherits to StructuredField and handles the To: header
7
- # field in the email.
8
- #
9
- # Sending to to a mail message will instantiate a Mail::Field object that
10
- # has a ToField as its field type. This includes all Mail::CommonAddress
11
- # module instance metods.
12
- #
13
- # Only one To field can appear in a header, though it can have multiple
14
- # addresses and groups of addresses.
15
- #
16
- # == Examples:
17
- #
18
- # mail = Mail.new
19
- # mail.to = 'Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net'
20
- # mail.to #=> ['mikel@test.lindsaar.net', 'ada@test.lindsaar.net']
21
- # mail[:to] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::ToField:0x180e1c4
22
- # mail['to'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::ToField:0x180e1c4
23
- # mail['To'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::ToField:0x180e1c4
24
- #
25
- # mail[:to].encoded #=> 'To: Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net\r\n'
26
- # mail[:to].decoded #=> 'Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net'
27
- # mail[:to].addresses #=> ['mikel@test.lindsaar.net', 'ada@test.lindsaar.net']
28
- # mail[:to].formatted #=> ['Mikel Lindsaar <mikel@test.lindsaar.net>', 'ada@test.lindsaar.net']
29
- #
30
- require 'mail/fields/common/common_address'
3
+ require 'mail/fields/common_address_field'
31
4
 
32
5
  module Mail
33
- class ToField < StructuredField
34
-
35
- include Mail::CommonAddress
36
-
37
- FIELD_NAME = 'to'
38
- CAPITALIZED_FIELD = 'To'
39
-
40
- def initialize(value = nil, charset = 'utf-8')
41
- self.charset = charset
42
- super(CAPITALIZED_FIELD, value, charset)
43
- self
44
- end
45
-
46
- def encoded
47
- do_encode(CAPITALIZED_FIELD)
48
- end
49
-
50
- def decoded
51
- do_decode
52
- end
53
-
6
+ # = To Field
7
+ #
8
+ # The To field inherits to StructuredField and handles the To: header
9
+ # field in the email.
10
+ #
11
+ # Sending to to a mail message will instantiate a Mail::Field object that
12
+ # has a ToField as its field type. This includes all Mail::CommonAddress
13
+ # module instance metods.
14
+ #
15
+ # Only one To field can appear in a header, though it can have multiple
16
+ # addresses and groups of addresses.
17
+ #
18
+ # == Examples:
19
+ #
20
+ # mail = Mail.new
21
+ # mail.to = 'Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net'
22
+ # mail.to #=> ['mikel@test.lindsaar.net', 'ada@test.lindsaar.net']
23
+ # mail[:to] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::ToField:0x180e1c4
24
+ # mail['to'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::ToField:0x180e1c4
25
+ # mail['To'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::ToField:0x180e1c4
26
+ #
27
+ # mail[:to].encoded #=> 'To: Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net\r\n'
28
+ # mail[:to].decoded #=> 'Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net'
29
+ # mail[:to].addresses #=> ['mikel@test.lindsaar.net', 'ada@test.lindsaar.net']
30
+ # mail[:to].formatted #=> ['Mikel Lindsaar <mikel@test.lindsaar.net>', 'ada@test.lindsaar.net']
31
+ class ToField < CommonAddressField #:nodoc:
32
+ NAME = 'To'
54
33
  end
55
34
  end
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # frozen_string_literal: true
3
- require 'mail/fields/common/common_field'
3
+ require 'mail/fields/common_field'
4
+ require 'mail/utilities'
4
5
 
5
6
  module Mail
6
7
  # Provides access to an unstructured header field
@@ -15,58 +16,28 @@ module Mail
15
16
  # field bodies are simply to be treated as a single line of characters
16
17
  # with no further processing (except for header "folding" and
17
18
  # "unfolding" as described in section 2.2.3).
18
- class UnstructuredField
19
-
20
- include Mail::CommonField
21
- include Mail::Utilities
22
-
23
- attr_accessor :charset
24
- attr_reader :errors
25
-
19
+ class UnstructuredField < CommonField #:nodoc:
26
20
  def initialize(name, value, charset = nil)
27
- @errors = []
28
-
29
21
  if value.is_a?(Array)
30
22
  # Probably has arrived here from a failed parse of an AddressList Field
31
23
  value = value.join(', ')
32
- else
33
- # Ensure we are dealing with a string
34
- value = value.to_s
35
24
 
36
- # Mark UTF-8 strings parsed from ASCII-8BIT
37
- if value.respond_to?(:force_encoding) && value.encoding == Encoding::ASCII_8BIT
38
- utf8 = value.dup.force_encoding(Encoding::UTF_8)
39
- value = utf8 if utf8.valid_encoding?
40
- end
25
+ # Mark UTF-8 strings parsed from ASCII-8BIT
26
+ elsif value.respond_to?(:force_encoding) && value.encoding == Encoding::ASCII_8BIT
27
+ utf8 = value.dup.force_encoding(Encoding::UTF_8)
28
+ value = utf8 if utf8.valid_encoding?
41
29
  end
42
30
 
43
- if charset
44
- self.charset = charset
45
- else
31
+ charset ||=
46
32
  if value.respond_to?(:encoding)
47
- self.charset = value.encoding
48
- else
49
- self.charset = $KCODE
33
+ value.encoding
50
34
  end
51
- end
52
- self.name = name
53
- self.value = value
54
- self
55
- end
56
-
57
- def encoded
58
- do_encode
59
- end
60
35
 
61
- def decoded
62
- do_decode
36
+ super name, value.to_s, charset
63
37
  end
64
38
 
65
- def default
66
- decoded
67
- end
68
-
69
- def parse # An unstructured field does not parse
39
+ # An unstructured field does not parse
40
+ def parse
70
41
  self
71
42
  end
72
43
 
@@ -196,7 +167,7 @@ module Mail
196
167
  end
197
168
 
198
169
  def encode(value)
199
- value = [value].pack(CAPITAL_M).gsub(EQUAL_LF, EMPTY)
170
+ value = [value].pack(Constants::CAPITAL_M).gsub(Constants::EQUAL_LF, Constants::EMPTY)
200
171
  value.gsub!(/"/, '=22')
201
172
  value.gsub!(/\(/, '=28')
202
173
  value.gsub!(/\)/, '=29')
@@ -207,16 +178,13 @@ module Mail
207
178
  end
208
179
 
209
180
  def encode_crlf(value)
210
- value.gsub!(CR, CR_ENCODED)
211
- value.gsub!(LF, LF_ENCODED)
181
+ value.gsub!(Constants::CR, Constants::CR_ENCODED)
182
+ value.gsub!(Constants::LF, Constants::LF_ENCODED)
212
183
  value
213
184
  end
214
185
 
215
186
  def normalized_encoding
216
- encoding = charset.to_s.upcase.gsub('_', '-')
217
- encoding = 'UTF-8' if encoding == 'UTF8' # Ruby 1.8.x and $KCODE == 'u'
218
- encoding
187
+ charset.to_s.upcase.gsub('_', '-')
219
188
  end
220
-
221
189
  end
222
190
  end