mailfactory-acd 1.4.1 → 1.4.2
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.
- checksums.yaml +4 -4
- data/lib/mailfactory.rb +71 -71
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48524b9ba34f31d8cc9355cf5a3b396b1c23c87b
|
4
|
+
data.tar.gz: bbe948834feb6aeadfa1c1c7dd40f1fef835cc85
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3d46f291b7e9315e9b6d45e51c5ad87433da8b0c407c2ea1e21276aa35fe98a9838a96874c1c7d3b99329affcb8a2f4c296dd1c81884b43ad4445c5d0b9a6f4
|
7
|
+
data.tar.gz: d5bfce55e19e5c11d037b6834184477a7999dbf92dca15161a4a091e2925de1350aaf93c4558e5a5c72c77c6f78f53e823cf27d48cc1d28002f2c034141cde19
|
data/lib/mailfactory.rb
CHANGED
@@ -48,8 +48,8 @@ end
|
|
48
48
|
# An easy class for creating a mail message
|
49
49
|
class MailFactory
|
50
50
|
|
51
|
-
VERSION = '1.4.
|
52
|
-
|
51
|
+
VERSION = '1.4.2'
|
52
|
+
|
53
53
|
def initialize()
|
54
54
|
@headers = Array.new()
|
55
55
|
@attachments = Array.new()
|
@@ -59,16 +59,16 @@ class MailFactory
|
|
59
59
|
@text = nil
|
60
60
|
@charset = 'utf-8'
|
61
61
|
end
|
62
|
-
|
63
|
-
|
62
|
+
|
63
|
+
|
64
64
|
# adds a header to the bottom of the headers
|
65
65
|
def add_header(header, value)
|
66
66
|
value = quoted_printable_with_instruction(value, @charset) if header == 'subject'
|
67
67
|
value = quote_address_if_necessary(value, @charset) if %w[from to cc bcc reply-to].include?(header.downcase)
|
68
68
|
@headers << "#{header}: #{value}"
|
69
69
|
end
|
70
|
-
|
71
|
-
|
70
|
+
|
71
|
+
|
72
72
|
# removes the named header - case insensitive
|
73
73
|
def remove_header(header)
|
74
74
|
@headers.each_index() { |i|
|
@@ -77,64 +77,64 @@ class MailFactory
|
|
77
77
|
end
|
78
78
|
}
|
79
79
|
end
|
80
|
-
|
81
|
-
|
80
|
+
|
81
|
+
|
82
82
|
# sets a header (removing any other versions of that header)
|
83
83
|
def set_header(header, value)
|
84
84
|
remove_header(header)
|
85
85
|
add_header(header, value)
|
86
86
|
end
|
87
|
-
|
88
|
-
|
87
|
+
|
88
|
+
|
89
89
|
def replyto=(newreplyto)
|
90
90
|
remove_header("Reply-To")
|
91
91
|
add_header("Reply-To", newreplyto)
|
92
92
|
end
|
93
|
-
|
94
|
-
|
93
|
+
|
94
|
+
|
95
95
|
def replyto()
|
96
96
|
return(get_header("Reply-To")[0])
|
97
97
|
end
|
98
|
-
|
99
|
-
|
98
|
+
|
99
|
+
|
100
100
|
# sets the plain text body of the message
|
101
101
|
def text=(newtext)
|
102
102
|
@text = newtext
|
103
103
|
end
|
104
|
-
|
105
|
-
|
104
|
+
|
105
|
+
|
106
106
|
# sets the HTML body of the message. Only the body of the
|
107
107
|
# html should be provided
|
108
108
|
def html=(newhtml)
|
109
109
|
@html = "<html>\n<head>\n<meta content=\"text/html;charset=#{@charset}\" http-equiv=\"Content-Type\">\n</head>\n<body bgcolor=\"#ffffff\" text=\"#000000\">\n#{newhtml}\n</body>\n</html>"
|
110
110
|
end
|
111
|
-
|
112
|
-
|
111
|
+
|
112
|
+
|
113
113
|
# sets the HTML body of the message. The entire HTML section should be provided
|
114
114
|
def rawhtml=(newhtml)
|
115
115
|
@html = newhtml
|
116
116
|
end
|
117
|
-
|
118
|
-
|
117
|
+
|
118
|
+
|
119
119
|
# implement method missing to provide helper methods for setting and getting headers.
|
120
120
|
# Headers with '-' characters may be set/gotten as 'x_mailer' or 'XMailer' (splitting
|
121
121
|
# will occur between capital letters or on '_' chracters)
|
122
122
|
def method_missing(methId, *args)
|
123
123
|
name = methId.id2name()
|
124
|
-
|
124
|
+
|
125
125
|
# mangle the name if we have to
|
126
126
|
if(name =~ /_/)
|
127
127
|
name = name.gsub(/_/, '-')
|
128
128
|
elsif(name =~ /[A-Z]/)
|
129
129
|
name = name.gsub(/([a-zA-Z])([A-Z])/, '\1-\2')
|
130
130
|
end
|
131
|
-
|
131
|
+
|
132
132
|
# determine if it sets or gets, and do the right thing
|
133
133
|
if(name =~ /=$/)
|
134
134
|
if(args.length != 1)
|
135
135
|
super(methId, args)
|
136
136
|
end
|
137
|
-
set_header(name[/^(.*)=$/, 1], args[0])
|
137
|
+
set_header(name[/^(.*)=$/, 1], args[0])
|
138
138
|
else
|
139
139
|
if(args.length != 0)
|
140
140
|
super(methId, args)
|
@@ -144,7 +144,7 @@ class MailFactory
|
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
147
|
-
|
147
|
+
|
148
148
|
# returns the value (or values) of the named header in an array
|
149
149
|
def get_header(header)
|
150
150
|
headers = Array.new()
|
@@ -154,11 +154,11 @@ class MailFactory
|
|
154
154
|
headers << h[/^[^:]+:(.*)/i, 1].strip()
|
155
155
|
end
|
156
156
|
}
|
157
|
-
|
157
|
+
|
158
158
|
return(headers)
|
159
159
|
end
|
160
|
-
|
161
|
-
|
160
|
+
|
161
|
+
|
162
162
|
# returns true if the email is multipart
|
163
163
|
def multipart?()
|
164
164
|
if(@attachments.length > 0 or @html != nil)
|
@@ -167,7 +167,7 @@ class MailFactory
|
|
167
167
|
return(false)
|
168
168
|
end
|
169
169
|
end
|
170
|
-
|
170
|
+
|
171
171
|
|
172
172
|
# builds an email and returns it as a string. Takes the following options:
|
173
173
|
# <tt>:messageid</tt>:: Adds a message id to the message based on the from header (defaults to false)
|
@@ -176,7 +176,7 @@ class MailFactory
|
|
176
176
|
if(options[:date] == nil)
|
177
177
|
options[:date] = true
|
178
178
|
end
|
179
|
-
|
179
|
+
|
180
180
|
if(options[:messageid])
|
181
181
|
# add a unique message-id
|
182
182
|
remove_header("Message-ID")
|
@@ -195,7 +195,7 @@ class MailFactory
|
|
195
195
|
if(get_header("MIME-Version").length == 0)
|
196
196
|
add_header("MIME-Version", "1.0")
|
197
197
|
end
|
198
|
-
|
198
|
+
|
199
199
|
if(get_header("Content-Type").length == 0)
|
200
200
|
if(@attachments.length == 0)
|
201
201
|
add_header("Content-Type", "multipart/alternative;boundary=\"#{@bodyboundary}\"")
|
@@ -204,17 +204,17 @@ class MailFactory
|
|
204
204
|
end
|
205
205
|
end
|
206
206
|
end
|
207
|
-
|
207
|
+
|
208
208
|
return("#{headers_to_s()}#{body_to_s()}")
|
209
209
|
end
|
210
210
|
|
211
|
-
|
212
|
-
# returns a formatted email - equivalent to construct(:messageid => true)
|
211
|
+
|
212
|
+
# returns a formatted email - equivalent to construct(:messageid => true)
|
213
213
|
def to_s()
|
214
214
|
return(construct(:messageid => true))
|
215
215
|
end
|
216
|
-
|
217
|
-
|
216
|
+
|
217
|
+
|
218
218
|
# generates a unique boundary string
|
219
219
|
def generate_boundary()
|
220
220
|
randomstring = Array.new()
|
@@ -234,8 +234,8 @@ class MailFactory
|
|
234
234
|
}
|
235
235
|
return("----=_NextPart_#{randomstring.join()}")
|
236
236
|
end
|
237
|
-
|
238
|
-
|
237
|
+
|
238
|
+
|
239
239
|
# adds an attachment to the mail. Type may be given as a mime type. If it
|
240
240
|
# is left off and the MIME::Types module is available it will be determined automagically.
|
241
241
|
# If the optional attachemntheaders is given, then they will be added to the attachment
|
@@ -248,8 +248,8 @@ class MailFactory
|
|
248
248
|
attachment['mimetype'] = MIME::Types.type_for(filename).to_s
|
249
249
|
else
|
250
250
|
attachment['mimetype'] = type
|
251
|
-
end
|
252
|
-
|
251
|
+
end
|
252
|
+
|
253
253
|
# Open in rb mode to handle Windows, which mangles binary files opened in a text mode
|
254
254
|
File.open(filename, "rb") { |fp|
|
255
255
|
attachment['attachment'] = file_encode(fp.read())
|
@@ -264,8 +264,8 @@ class MailFactory
|
|
264
264
|
|
265
265
|
@attachments << attachment
|
266
266
|
end
|
267
|
-
|
268
|
-
|
267
|
+
|
268
|
+
|
269
269
|
# adds an attachment to the mail as emailfilename. Type may be given as a mime type. If it
|
270
270
|
# is left off and the MIME::Types module is available it will be determined automagically.
|
271
271
|
# file may be given as an IO stream (which will be read until the end) or as a filename.
|
@@ -278,17 +278,17 @@ class MailFactory
|
|
278
278
|
|
279
279
|
if(type != nil)
|
280
280
|
attachment['mimetype'] = type.to_s()
|
281
|
-
elsif(file[
|
281
|
+
elsif(file["\n"])
|
282
282
|
attachment['mimetype'] = MIME::Types.type_for(emailfilename).to_s
|
283
283
|
elsif(file.kind_of?(String) or file.kind_of?(Pathname))
|
284
284
|
attachment['mimetype'] = MIME::Types.type_for(file.to_s()).to_s
|
285
285
|
else
|
286
286
|
attachment['mimetype'] = ''
|
287
287
|
end
|
288
|
-
|
289
|
-
if(file[
|
288
|
+
|
289
|
+
if(file["\n"])
|
290
290
|
attachment['attachment'] = file_encode(file)
|
291
|
-
elsif(file.kind_of?(String) or file.kind_of?(Pathname))
|
291
|
+
elsif(file.kind_of?(String) or file.kind_of?(Pathname))
|
292
292
|
# Open in rb mode to handle Windows, which mangles binary files opened in a text mode
|
293
293
|
File.open(file.to_s(), "rb") { |fp|
|
294
294
|
attachment['attachment'] = file_encode(fp.read())
|
@@ -298,50 +298,50 @@ class MailFactory
|
|
298
298
|
else
|
299
299
|
raise(Exception, "file is not a supported type (must be a String, Pathnamem, or support read method)")
|
300
300
|
end
|
301
|
-
|
301
|
+
|
302
302
|
if(attachmentheaders != nil)
|
303
303
|
if(!attachmentheaders.kind_of?(Array))
|
304
304
|
attachmentheaders = attachmentheaders.split(/\r?\n/)
|
305
305
|
end
|
306
306
|
attachment['headers'] = attachmentheaders
|
307
307
|
end
|
308
|
-
|
308
|
+
|
309
309
|
@attachments << attachment
|
310
310
|
end
|
311
|
-
|
312
|
-
|
311
|
+
|
312
|
+
|
313
313
|
alias attach add_attachment
|
314
314
|
alias attach_as add_attachment_as
|
315
|
-
|
315
|
+
|
316
316
|
protected
|
317
|
-
|
317
|
+
|
318
318
|
# returns the @headers as a properly formatted string
|
319
319
|
def headers_to_s()
|
320
320
|
return("#{@headers.join("\r\n")}\r\n\r\n")
|
321
321
|
end
|
322
|
-
|
323
|
-
|
322
|
+
|
323
|
+
|
324
324
|
# returns the body as a properly formatted string
|
325
325
|
def body_to_s()
|
326
326
|
body = Array.new()
|
327
|
-
|
327
|
+
|
328
328
|
# simple message with one part
|
329
329
|
if(!multipart?())
|
330
330
|
return(@text)
|
331
331
|
else
|
332
332
|
body << "This is a multi-part message in MIME format.\r\n\r\n--#{@attachmentboundary}\r\nContent-Type: multipart/alternative; boundary=\"#{@bodyboundary}\""
|
333
|
-
|
333
|
+
|
334
334
|
if(@attachments.length > 0)
|
335
335
|
# text part
|
336
336
|
body << "#{buildbodyboundary("text/plain; charset=#{@charset}; format=flowed", 'quoted-printable')}\r\n\r\n#{quote_if_necessary(@text, @charset)}"
|
337
|
-
|
337
|
+
|
338
338
|
# html part if one is provided
|
339
339
|
if @html
|
340
340
|
body << "#{buildbodyboundary("text/html; charset=#{@charset}", 'quoted-printable')}\r\n\r\n#{quote_if_necessary(@html, @charset)}"
|
341
341
|
end
|
342
|
-
|
342
|
+
|
343
343
|
body << "--#{@bodyboundary}--"
|
344
|
-
|
344
|
+
|
345
345
|
# and, the attachments
|
346
346
|
if(@attachments.length > 0)
|
347
347
|
@attachments.each() { |attachment|
|
@@ -352,18 +352,18 @@ protected
|
|
352
352
|
else
|
353
353
|
# text part
|
354
354
|
body << "#{buildbodyboundary("text/plain; charset=#{@charset}; format=flowed", 'quoted-printable')}\r\n\r\n#{quote_if_necessary(@text, @charset)}"
|
355
|
-
|
355
|
+
|
356
356
|
# html part
|
357
357
|
body << "#{buildbodyboundary("text/html; charset=#{@charset}", 'quoted-printable')}\r\n\r\n#{quote_if_necessary(@html, @charset)}"
|
358
|
-
|
358
|
+
|
359
359
|
body << "--#{@bodyboundary}--"
|
360
360
|
end
|
361
|
-
|
361
|
+
|
362
362
|
return(body.join("\r\n\r\n"))
|
363
363
|
end
|
364
364
|
end
|
365
|
-
|
366
|
-
|
365
|
+
|
366
|
+
|
367
367
|
# builds a boundary string for including attachments in the body, expects an attachment hash as built by
|
368
368
|
# add_attachment and add_attachment_as
|
369
369
|
def buildattachmentboundary(attachment)
|
@@ -372,11 +372,11 @@ protected
|
|
372
372
|
if(attachment['headers'])
|
373
373
|
boundary = boundary + "\r\n#{attachment['headers'].join("\r\n")}"
|
374
374
|
end
|
375
|
-
|
375
|
+
|
376
376
|
return(boundary)
|
377
377
|
end
|
378
|
-
|
379
|
-
|
378
|
+
|
379
|
+
|
380
380
|
# builds a boundary string for inclusion in the body of a message
|
381
381
|
def buildbodyboundary(type, encoding)
|
382
382
|
return("--#{@bodyboundary}\r\nContent-Type: #{type}\r\nContent-Transfer-Encoding: #{encoding}")
|
@@ -394,11 +394,11 @@ protected
|
|
394
394
|
# return(collection.join("\n"))
|
395
395
|
return(enc)
|
396
396
|
end
|
397
|
-
|
398
|
-
|
397
|
+
|
398
|
+
|
399
399
|
# Convert the given text into quoted printable format, with an instruction
|
400
400
|
# that the text be eventually interpreted in the given charset.
|
401
|
-
|
401
|
+
|
402
402
|
def quoted_printable_with_instruction(text, charset)
|
403
403
|
text = quoted_printable_encode_header(text)
|
404
404
|
"=?#{charset}?Q?#{text}?="
|
@@ -411,7 +411,7 @@ protected
|
|
411
411
|
|
412
412
|
# Convert the given character to quoted printable format
|
413
413
|
# see http://tools.ietf.org/html/rfc2047
|
414
|
-
|
414
|
+
|
415
415
|
require 'enumerator' unless ''.respond_to? :enum_for
|
416
416
|
|
417
417
|
def quoted_printable_encode_header(text)
|
@@ -465,5 +465,5 @@ protected
|
|
465
465
|
address
|
466
466
|
end
|
467
467
|
end
|
468
|
-
|
468
|
+
|
469
469
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mailfactory-acd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Powers
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-11-
|
12
|
+
date: 2014-11-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mime-types
|