kbaum-mail 2.1.2.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/CHANGELOG.rdoc +289 -0
- data/README.rdoc +575 -0
- data/Rakefile +72 -0
- data/TODO.rdoc +19 -0
- data/lib/mail.rb +113 -0
- data/lib/mail/attachments_list.rb +76 -0
- data/lib/mail/body.rb +243 -0
- data/lib/mail/configuration.rb +69 -0
- data/lib/mail/core_extensions/nil.rb +11 -0
- data/lib/mail/core_extensions/string.rb +19 -0
- data/lib/mail/elements/address.rb +306 -0
- data/lib/mail/elements/address_list.rb +74 -0
- data/lib/mail/elements/content_disposition_element.rb +30 -0
- data/lib/mail/elements/content_location_element.rb +25 -0
- data/lib/mail/elements/content_transfer_encoding_element.rb +21 -0
- data/lib/mail/elements/content_type_element.rb +35 -0
- data/lib/mail/elements/date_time_element.rb +26 -0
- data/lib/mail/elements/envelope_from_element.rb +34 -0
- data/lib/mail/elements/message_ids_element.rb +29 -0
- data/lib/mail/elements/mime_version_element.rb +26 -0
- data/lib/mail/elements/phrase_list.rb +21 -0
- data/lib/mail/elements/received_element.rb +30 -0
- data/lib/mail/encodings/base64.rb +18 -0
- data/lib/mail/encodings/encodings.rb +201 -0
- data/lib/mail/encodings/quoted_printable.rb +26 -0
- data/lib/mail/envelope.rb +35 -0
- data/lib/mail/field.rb +219 -0
- data/lib/mail/field_list.rb +33 -0
- data/lib/mail/fields/bcc_field.rb +53 -0
- data/lib/mail/fields/cc_field.rb +52 -0
- data/lib/mail/fields/comments_field.rb +41 -0
- data/lib/mail/fields/common/address_container.rb +16 -0
- data/lib/mail/fields/common/common_address.rb +128 -0
- data/lib/mail/fields/common/common_date.rb +51 -0
- data/lib/mail/fields/common/common_field.rb +64 -0
- data/lib/mail/fields/common/common_message_id.rb +57 -0
- data/lib/mail/fields/common/parameter_hash.rb +39 -0
- data/lib/mail/fields/content_description_field.rb +19 -0
- data/lib/mail/fields/content_disposition_field.rb +60 -0
- data/lib/mail/fields/content_id_field.rb +63 -0
- data/lib/mail/fields/content_location_field.rb +42 -0
- data/lib/mail/fields/content_transfer_encoding_field.rb +45 -0
- data/lib/mail/fields/content_type_field.rb +175 -0
- data/lib/mail/fields/date_field.rb +53 -0
- data/lib/mail/fields/from_field.rb +53 -0
- data/lib/mail/fields/in_reply_to_field.rb +52 -0
- data/lib/mail/fields/keywords_field.rb +43 -0
- data/lib/mail/fields/message_id_field.rb +80 -0
- data/lib/mail/fields/mime_version_field.rb +54 -0
- data/lib/mail/fields/optional_field.rb +11 -0
- data/lib/mail/fields/received_field.rb +62 -0
- data/lib/mail/fields/references_field.rb +53 -0
- data/lib/mail/fields/reply_to_field.rb +53 -0
- data/lib/mail/fields/resent_bcc_field.rb +53 -0
- data/lib/mail/fields/resent_cc_field.rb +53 -0
- data/lib/mail/fields/resent_date_field.rb +33 -0
- data/lib/mail/fields/resent_from_field.rb +53 -0
- data/lib/mail/fields/resent_message_id_field.rb +32 -0
- data/lib/mail/fields/resent_sender_field.rb +60 -0
- data/lib/mail/fields/resent_to_field.rb +53 -0
- data/lib/mail/fields/return_path_field.rb +62 -0
- data/lib/mail/fields/sender_field.rb +65 -0
- data/lib/mail/fields/structured_field.rb +36 -0
- data/lib/mail/fields/subject_field.rb +15 -0
- data/lib/mail/fields/to_field.rb +53 -0
- data/lib/mail/fields/unstructured_field.rb +117 -0
- data/lib/mail/header.rb +235 -0
- data/lib/mail/mail.rb +194 -0
- data/lib/mail/message.rb +1780 -0
- data/lib/mail/network/delivery_methods/file_delivery.rb +40 -0
- data/lib/mail/network/delivery_methods/sendmail.rb +62 -0
- data/lib/mail/network/delivery_methods/smtp.rb +110 -0
- data/lib/mail/network/delivery_methods/test_mailer.rb +40 -0
- data/lib/mail/network/retriever_methods/imap.rb +31 -0
- data/lib/mail/network/retriever_methods/pop3.rb +149 -0
- data/lib/mail/parsers/address_lists.rb +61 -0
- data/lib/mail/parsers/address_lists.treetop +19 -0
- data/lib/mail/parsers/content_disposition.rb +369 -0
- data/lib/mail/parsers/content_disposition.treetop +46 -0
- data/lib/mail/parsers/content_location.rb +133 -0
- data/lib/mail/parsers/content_location.treetop +20 -0
- data/lib/mail/parsers/content_transfer_encoding.rb +179 -0
- data/lib/mail/parsers/content_transfer_encoding.treetop +25 -0
- data/lib/mail/parsers/content_type.rb +512 -0
- data/lib/mail/parsers/content_type.treetop +58 -0
- data/lib/mail/parsers/date_time.rb +111 -0
- data/lib/mail/parsers/date_time.treetop +11 -0
- data/lib/mail/parsers/envelope_from.rb +188 -0
- data/lib/mail/parsers/envelope_from.treetop +32 -0
- data/lib/mail/parsers/message_ids.rb +42 -0
- data/lib/mail/parsers/message_ids.treetop +15 -0
- data/lib/mail/parsers/mime_version.rb +141 -0
- data/lib/mail/parsers/mime_version.treetop +19 -0
- data/lib/mail/parsers/phrase_lists.rb +42 -0
- data/lib/mail/parsers/phrase_lists.treetop +15 -0
- data/lib/mail/parsers/received.rb +68 -0
- data/lib/mail/parsers/received.treetop +11 -0
- data/lib/mail/parsers/rfc2045.rb +406 -0
- data/lib/mail/parsers/rfc2045.treetop +35 -0
- data/lib/mail/parsers/rfc2822.rb +5081 -0
- data/lib/mail/parsers/rfc2822.treetop +410 -0
- data/lib/mail/parsers/rfc2822_obsolete.rb +3607 -0
- data/lib/mail/parsers/rfc2822_obsolete.treetop +241 -0
- data/lib/mail/part.rb +82 -0
- data/lib/mail/parts_list.rb +34 -0
- data/lib/mail/patterns.rb +43 -0
- data/lib/mail/utilities.rb +163 -0
- data/lib/mail/vendor/treetop.rb +4 -0
- data/lib/mail/version.rb +10 -0
- data/lib/mail/version_specific/ruby_1_8.rb +84 -0
- data/lib/mail/version_specific/ruby_1_9.rb +77 -0
- data/lib/tasks/corpus.rake +125 -0
- data/lib/tasks/treetop.rake +10 -0
- metadata +188 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mail
|
|
3
|
+
module Encodings
|
|
4
|
+
class QuotedPrintable
|
|
5
|
+
|
|
6
|
+
# Decode the string from Quoted-Printable
|
|
7
|
+
def self.decode(str)
|
|
8
|
+
str.unpack("M*").first
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.encode(str)
|
|
12
|
+
str.gsub( /[^a-z ]/i ) { quoted_printable_encode($&) }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
# Convert the given character to quoted printable format, taking into
|
|
18
|
+
# account multi-byte characters (if executing with $KCODE="u", for instance)
|
|
19
|
+
def self.quoted_printable_encode(character)
|
|
20
|
+
result = ""
|
|
21
|
+
character.each_byte { |b| result << "=%02X" % b }
|
|
22
|
+
result
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# = Mail Envelope
|
|
4
|
+
#
|
|
5
|
+
# The Envelope class provides a field for the first line in an
|
|
6
|
+
# mbox file, that looks like "From mikel@test.lindsaar.net DATETIME"
|
|
7
|
+
#
|
|
8
|
+
# This envelope class reads that line, and turns it into an
|
|
9
|
+
# Envelope.from and Envelope.date for your use.
|
|
10
|
+
module Mail
|
|
11
|
+
class Envelope < StructuredField
|
|
12
|
+
|
|
13
|
+
def initialize(*args)
|
|
14
|
+
super(FIELD_NAME, strip_field(FIELD_NAME, args.last))
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def tree
|
|
18
|
+
@element ||= Mail::EnvelopeFromElement.new(value)
|
|
19
|
+
@tree ||= @element.tree
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def element
|
|
23
|
+
@element ||= Mail::EnvelopeFromElement.new(value)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def date
|
|
27
|
+
::DateTime.parse("#{element.date_time}")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def from
|
|
31
|
+
element.address
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
end
|
data/lib/mail/field.rb
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mail
|
|
3
|
+
# Provides a single class to call to create a new structured or unstructured
|
|
4
|
+
# field. Works out per RFC what field of field it is being given and returns
|
|
5
|
+
# the correct field of class back on new.
|
|
6
|
+
#
|
|
7
|
+
# ===Per RFC 2822
|
|
8
|
+
#
|
|
9
|
+
# 2.2. Header Fields
|
|
10
|
+
#
|
|
11
|
+
# Header fields are lines composed of a field name, followed by a colon
|
|
12
|
+
# (":"), followed by a field body, and terminated by CRLF. A field
|
|
13
|
+
# name MUST be composed of printable US-ASCII characters (i.e.,
|
|
14
|
+
# characters that have values between 33 and 126, inclusive), except
|
|
15
|
+
# colon. A field body may be composed of any US-ASCII characters,
|
|
16
|
+
# except for CR and LF. However, a field body may contain CRLF when
|
|
17
|
+
# used in header "folding" and "unfolding" as described in section
|
|
18
|
+
# 2.2.3. All field bodies MUST conform to the syntax described in
|
|
19
|
+
# sections 3 and 4 of this standard.
|
|
20
|
+
#
|
|
21
|
+
class Field
|
|
22
|
+
|
|
23
|
+
include Patterns
|
|
24
|
+
include Comparable
|
|
25
|
+
|
|
26
|
+
STRUCTURED_FIELDS = %w[ bcc cc content-description content-disposition
|
|
27
|
+
content-id content-location content-transfer-encoding
|
|
28
|
+
content-type date from in-reply-to keywords message-id
|
|
29
|
+
mime-version received references reply-to
|
|
30
|
+
resent-bcc resent-cc resent-date resent-from
|
|
31
|
+
resent-message-id resent-sender resent-to
|
|
32
|
+
return-path sender to ]
|
|
33
|
+
|
|
34
|
+
KNOWN_FIELDS = STRUCTURED_FIELDS + ['comments', 'subject']
|
|
35
|
+
|
|
36
|
+
# Generic Field Exception
|
|
37
|
+
class FieldError < StandardError
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Raised when a parsing error has occurred (ie, a StructuredField has tried
|
|
41
|
+
# to parse a field that is invalid or improperly written)
|
|
42
|
+
class ParseError < FieldError #:nodoc:
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Raised when attempting to set a structured field's contents to an invalid syntax
|
|
46
|
+
class SyntaxError < FieldError #:nodoc:
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Accepts a string:
|
|
50
|
+
#
|
|
51
|
+
# Field.new("field-name: field data")
|
|
52
|
+
#
|
|
53
|
+
# Or name, value pair:
|
|
54
|
+
#
|
|
55
|
+
# Field.new("field-name", "value")
|
|
56
|
+
#
|
|
57
|
+
# Or a name by itself:
|
|
58
|
+
#
|
|
59
|
+
# Field.new("field-name")
|
|
60
|
+
#
|
|
61
|
+
# Note, does not want a terminating carriage return. Returns
|
|
62
|
+
# self appropriately parsed. If value is not a string, then
|
|
63
|
+
# it will be passed through as is, for example, content-type
|
|
64
|
+
# field can accept an array with the type and a hash of
|
|
65
|
+
# parameters:
|
|
66
|
+
#
|
|
67
|
+
# Field.new('content-type', ['text', 'plain', {:charset => 'UTF-8'}])
|
|
68
|
+
def initialize(name, value = nil)
|
|
69
|
+
case
|
|
70
|
+
when name =~ /:/ && value.blank? # Field.new("field-name: field data")
|
|
71
|
+
name, value = split(name)
|
|
72
|
+
create_field(name, value)
|
|
73
|
+
when name !~ /:/ && value.blank? # Field.new("field-name")
|
|
74
|
+
create_field(name, nil)
|
|
75
|
+
else # Field.new("field-name", "value")
|
|
76
|
+
create_field(name, value)
|
|
77
|
+
end
|
|
78
|
+
return self
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def field=(value)
|
|
82
|
+
@field = value
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def field
|
|
86
|
+
@field
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def name
|
|
90
|
+
field.name
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def value
|
|
94
|
+
field.value
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def value=(str)
|
|
98
|
+
create_field(name, str)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def to_s
|
|
102
|
+
field.to_s
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def update(name, value)
|
|
106
|
+
create_field(name, value)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def same( other )
|
|
110
|
+
match_to_s(other.name, field.name)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def <=>( other )
|
|
114
|
+
self_order = FIELD_ORDER.rindex(self.name.to_s.downcase) || 100
|
|
115
|
+
other_order = FIELD_ORDER.rindex(other.name.to_s.downcase) || 100
|
|
116
|
+
self_order <=> other_order
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def method_missing(name, *args, &block)
|
|
120
|
+
field.send(name, *args, &block)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
FIELD_ORDER = %w[ return-path received
|
|
124
|
+
resent-date resent-from resent-sender resent-to
|
|
125
|
+
resent-cc resent-bcc resent-message-id
|
|
126
|
+
date from sender reply-to to cc bcc
|
|
127
|
+
message-id in-reply-to references
|
|
128
|
+
subject comments keywords
|
|
129
|
+
mime-version content-type content-transfer-encoding
|
|
130
|
+
content-location content-disposition content-description ]
|
|
131
|
+
|
|
132
|
+
private
|
|
133
|
+
|
|
134
|
+
def split(raw_field)
|
|
135
|
+
match_data = raw_field.match(/^(#{FIELD_NAME})\s*:\s*(#{FIELD_BODY})?$/)
|
|
136
|
+
[match_data[1].to_s.strip, match_data[2].to_s.strip]
|
|
137
|
+
rescue
|
|
138
|
+
STDERR.puts "WARNING: Could not parse (and so ignorning) '#{raw_field}'"
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def create_field(name, value)
|
|
142
|
+
begin
|
|
143
|
+
self.field = new_field(name, value)
|
|
144
|
+
rescue
|
|
145
|
+
self.field = Mail::UnstructuredField.new(name, value)
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def new_field(name, value)
|
|
150
|
+
# Could do this with constantize and make it "as DRY as", but a simple case
|
|
151
|
+
# statement is, well, simpler...
|
|
152
|
+
case name.to_s
|
|
153
|
+
when /^to$/i
|
|
154
|
+
ToField.new(name, value)
|
|
155
|
+
when /^cc$/i
|
|
156
|
+
CcField.new(name, value)
|
|
157
|
+
when /^bcc$/i
|
|
158
|
+
BccField.new(name, value)
|
|
159
|
+
when /^message-id$/i
|
|
160
|
+
MessageIdField.new(name, value)
|
|
161
|
+
when /^in-reply-to$/i
|
|
162
|
+
InReplyToField.new(name, value)
|
|
163
|
+
when /^references$/i
|
|
164
|
+
ReferencesField.new(name, value)
|
|
165
|
+
when /^subject$/i
|
|
166
|
+
SubjectField.new(name, value)
|
|
167
|
+
when /^comments$/i
|
|
168
|
+
CommentsField.new(name, value)
|
|
169
|
+
when /^keywords$/i
|
|
170
|
+
KeywordsField.new(name, value)
|
|
171
|
+
when /^date$/i
|
|
172
|
+
DateField.new(name, value)
|
|
173
|
+
when /^from$/i
|
|
174
|
+
FromField.new(name, value)
|
|
175
|
+
when /^sender$/i
|
|
176
|
+
SenderField.new(name, value)
|
|
177
|
+
when /^reply-to$/i
|
|
178
|
+
ReplyToField.new(name, value)
|
|
179
|
+
when /^resent-date$/i
|
|
180
|
+
ResentDateField.new(name, value)
|
|
181
|
+
when /^resent-from$/i
|
|
182
|
+
ResentFromField.new(name, value)
|
|
183
|
+
when /^resent-sender$/i
|
|
184
|
+
ResentSenderField.new(name, value)
|
|
185
|
+
when /^resent-to$/i
|
|
186
|
+
ResentToField.new(name, value)
|
|
187
|
+
when /^resent-cc$/i
|
|
188
|
+
ResentCcField.new(name, value)
|
|
189
|
+
when /^resent-bcc$/i
|
|
190
|
+
ResentBccField.new(name, value)
|
|
191
|
+
when /^resent-message-id$/i
|
|
192
|
+
ResentMessageIdField.new(name, value)
|
|
193
|
+
when /^return-path$/i
|
|
194
|
+
ReturnPathField.new(name, value)
|
|
195
|
+
when /^received$/i
|
|
196
|
+
ReceivedField.new(name, value)
|
|
197
|
+
when /^mime-version$/i
|
|
198
|
+
MimeVersionField.new(name, value)
|
|
199
|
+
when /^content-transfer-encoding$/i
|
|
200
|
+
ContentTransferEncodingField.new(name, value)
|
|
201
|
+
when /^content-description$/i
|
|
202
|
+
ContentDescriptionField.new(name, value)
|
|
203
|
+
when /^content-disposition$/i
|
|
204
|
+
ContentDispositionField.new(name, value)
|
|
205
|
+
when /^content-type$/i
|
|
206
|
+
ContentTypeField.new(name, value)
|
|
207
|
+
when /^content-id$/i
|
|
208
|
+
ContentIdField.new(name, value)
|
|
209
|
+
when /^content-location$/i
|
|
210
|
+
ContentLocationField.new(name, value)
|
|
211
|
+
else
|
|
212
|
+
OptionalField.new(name, value)
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mail
|
|
3
|
+
|
|
4
|
+
# Field List class provides an enhanced array that keeps a list of
|
|
5
|
+
# email fields in order. And allows you to insert new fields without
|
|
6
|
+
# having to worry about the order they will appear in.
|
|
7
|
+
class FieldList < Array
|
|
8
|
+
|
|
9
|
+
include Enumerable
|
|
10
|
+
|
|
11
|
+
def <<( new_field )
|
|
12
|
+
current_entry = self.rindex(new_field.name)
|
|
13
|
+
if current_entry
|
|
14
|
+
self.insert((current_entry + 1), new_field)
|
|
15
|
+
else
|
|
16
|
+
insert_idx = -1
|
|
17
|
+
self.each_with_index do |item, idx|
|
|
18
|
+
case item <=> new_field
|
|
19
|
+
when -1
|
|
20
|
+
next
|
|
21
|
+
when 0
|
|
22
|
+
next
|
|
23
|
+
when 1
|
|
24
|
+
insert_idx = idx
|
|
25
|
+
break
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
insert(insert_idx, new_field)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# = Blind Carbon Copy Field
|
|
4
|
+
#
|
|
5
|
+
# The Bcc field inherits from StructuredField and handles the Bcc: header
|
|
6
|
+
# field in the email.
|
|
7
|
+
#
|
|
8
|
+
# Sending bcc to a mail message will instantiate a Mail::Field object that
|
|
9
|
+
# has a BccField as it's field type. This includes all Mail::CommonAddress
|
|
10
|
+
# module instance metods.
|
|
11
|
+
#
|
|
12
|
+
# Only one Bcc field can appear in a header, though it can have multiple
|
|
13
|
+
# addresses and groups of addresses.
|
|
14
|
+
#
|
|
15
|
+
# == Examples:
|
|
16
|
+
#
|
|
17
|
+
# mail = Mail.new
|
|
18
|
+
# mail.bcc = 'Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net'
|
|
19
|
+
# mail.bcc #=> ['Mikel Lindsaar <mikel@test.lindsaar.net>', 'ada@test.lindsaar.net']
|
|
20
|
+
# mail[:bcc] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::BccField:0x180e1c4
|
|
21
|
+
# mail['bcc'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::BccField:0x180e1c4
|
|
22
|
+
# mail['Bcc'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::BccField:0x180e1c4
|
|
23
|
+
#
|
|
24
|
+
# mail[:bcc].encoded #=> '' # Bcc field does not get output into an email
|
|
25
|
+
# mail[:bcc].decoded #=> 'Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net'
|
|
26
|
+
# mail[:bcc].addresses #=> ['mikel@test.lindsaar.net', 'ada@test.lindsaar.net']
|
|
27
|
+
# mail[:bcc].formatted #=> ['Mikel Lindsaar <mikel@test.lindsaar.net>', 'ada@test.lindsaar.net']
|
|
28
|
+
#
|
|
29
|
+
module Mail
|
|
30
|
+
class BccField < StructuredField
|
|
31
|
+
|
|
32
|
+
include Mail::CommonAddress
|
|
33
|
+
|
|
34
|
+
FIELD_NAME = 'bcc'
|
|
35
|
+
CAPITALIZED_FIELD = 'Bcc'
|
|
36
|
+
|
|
37
|
+
def initialize(*args)
|
|
38
|
+
super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, args.last))
|
|
39
|
+
self.parse
|
|
40
|
+
self
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Bcc field should never be :encoded
|
|
44
|
+
def encoded
|
|
45
|
+
''
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def decoded
|
|
49
|
+
do_decode
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# = Carbon Copy Field
|
|
4
|
+
#
|
|
5
|
+
# The Cc field inherits from StructuredField and handles the Cc: header
|
|
6
|
+
# field in the email.
|
|
7
|
+
#
|
|
8
|
+
# Sending cc to a mail message will instantiate a Mail::Field object that
|
|
9
|
+
# has a CcField as it's field type. This includes all Mail::CommonAddress
|
|
10
|
+
# module instance metods.
|
|
11
|
+
#
|
|
12
|
+
# Only one Cc field can appear in a header, though it can have multiple
|
|
13
|
+
# addresses and groups of addresses.
|
|
14
|
+
#
|
|
15
|
+
# == Examples:
|
|
16
|
+
#
|
|
17
|
+
# mail = Mail.new
|
|
18
|
+
# mail.cc = 'Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net'
|
|
19
|
+
# mail.cc #=> ['Mikel Lindsaar <mikel@test.lindsaar.net>', 'ada@test.lindsaar.net']
|
|
20
|
+
# mail[:cc] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::CcField:0x180e1c4
|
|
21
|
+
# mail['cc'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::CcField:0x180e1c4
|
|
22
|
+
# mail['Cc'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::CcField:0x180e1c4
|
|
23
|
+
#
|
|
24
|
+
# mail[:cc].encoded #=> 'Cc: Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net\r\n'
|
|
25
|
+
# mail[:cc].decoded #=> 'Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net'
|
|
26
|
+
# mail[:cc].addresses #=> ['mikel@test.lindsaar.net', 'ada@test.lindsaar.net']
|
|
27
|
+
# mail[:cc].formatted #=> ['Mikel Lindsaar <mikel@test.lindsaar.net>', 'ada@test.lindsaar.net']
|
|
28
|
+
#
|
|
29
|
+
module Mail
|
|
30
|
+
class CcField < StructuredField
|
|
31
|
+
|
|
32
|
+
include Mail::CommonAddress
|
|
33
|
+
|
|
34
|
+
FIELD_NAME = 'cc'
|
|
35
|
+
CAPITALIZED_FIELD = 'Cc'
|
|
36
|
+
|
|
37
|
+
def initialize(*args)
|
|
38
|
+
super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, args.last))
|
|
39
|
+
self.parse
|
|
40
|
+
self
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def encoded
|
|
44
|
+
do_encode(CAPITALIZED_FIELD)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def decoded
|
|
48
|
+
do_decode
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# = Comments Field
|
|
4
|
+
#
|
|
5
|
+
# The Comments field inherits from UnstructuredField and handles the Comments:
|
|
6
|
+
# header field in the email.
|
|
7
|
+
#
|
|
8
|
+
# Sending comments to a mail message will instantiate a Mail::Field object that
|
|
9
|
+
# has a CommentsField as it's field type.
|
|
10
|
+
#
|
|
11
|
+
# An email header can have as many comments fields as it wants. There is no upper
|
|
12
|
+
# limit, the comments field is also optional (that is, no comment is needed)
|
|
13
|
+
#
|
|
14
|
+
# == Examples:
|
|
15
|
+
#
|
|
16
|
+
# mail = Mail.new
|
|
17
|
+
# mail.comments = 'This is a comment'
|
|
18
|
+
# mail.comments #=> 'This is a comment'
|
|
19
|
+
# mail[:comments] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::CommentsField:0x180e1c4
|
|
20
|
+
# mail['comments'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::CommentsField:0x180e1c4
|
|
21
|
+
# mail['comments'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::CommentsField:0x180e1c4
|
|
22
|
+
#
|
|
23
|
+
# mail.comments = "This is another comment"
|
|
24
|
+
# mail[:comments].map { |c| c.to_s }
|
|
25
|
+
# #=> ['This is a comment', "This is another comment"]
|
|
26
|
+
#
|
|
27
|
+
module Mail
|
|
28
|
+
class CommentsField < UnstructuredField
|
|
29
|
+
|
|
30
|
+
FIELD_NAME = 'comments'
|
|
31
|
+
CAPITALIZED_FIELD = 'Comments'
|
|
32
|
+
|
|
33
|
+
def initialize(*args)
|
|
34
|
+
super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, args.last))
|
|
35
|
+
self.parse
|
|
36
|
+
self
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
end
|