tmail 1.2.1 → 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +50 -5
- data/MANIFEST +188 -0
- data/NOTES +1 -1
- data/README +10 -4
- data/Rakefile +1 -10
- data/lib/tmail.rb +1 -0
- data/lib/tmail/Makefile +0 -1
- data/lib/tmail/address.rb +190 -17
- data/lib/tmail/attachments.rb +1 -1
- data/lib/tmail/base64.rb +4 -10
- data/lib/tmail/compat.rb +8 -6
- data/lib/tmail/config.rb +2 -6
- data/lib/tmail/core_extensions.rb +14 -18
- data/lib/tmail/encode.rb +47 -12
- data/lib/tmail/header.rb +7 -10
- data/lib/tmail/index.rb +2 -1
- data/lib/tmail/interface.rb +14 -12
- data/lib/tmail/loader.rb +2 -0
- data/lib/tmail/mail.rb +83 -24
- data/lib/tmail/mailbox.rb +70 -10
- data/lib/tmail/main.rb +2 -0
- data/lib/tmail/mbox.rb +2 -0
- data/lib/tmail/net.rb +16 -15
- data/lib/tmail/obsolete.rb +7 -12
- data/lib/tmail/parser.rb +1 -0
- data/lib/tmail/require_arch.rb +2 -0
- data/lib/tmail/scanner.rb +2 -1
- data/lib/tmail/scanner_r.rb +11 -10
- data/lib/tmail/utils.rb +83 -26
- data/lib/tmail/version.rb +3 -2
- data/log/BugTrackingLog.txt +1208 -0
- data/log/{ChangeLog.txt → Changelog-0.txt} +36 -0
- data/log/Changelog.txt +534 -0
- data/log/Testlog.txt +114 -0
- data/log/Todo.txt +0 -2
- data/meta/VERSION +1 -0
- data/meta/project.yaml +8 -5
- data/meta/unixname +1 -0
- data/setup.rb +1481 -0
- data/site/contributing/index.html +183 -0
- data/site/css/clean.css +27 -0
- data/site/css/layout.css +31 -0
- data/site/css/style.css +60 -0
- data/site/download/index.html +61 -0
- data/site/img/envelope.jpg +0 -0
- data/site/img/mailman.gif +0 -0
- data/site/img/stamp-sm.jpg +0 -0
- data/site/img/stamp.jpg +0 -0
- data/site/img/stampborder.jpg +0 -0
- data/site/img/tfire.jpg +0 -0
- data/site/img/tmail.png +0 -0
- data/site/index.html +270 -0
- data/site/js/jquery.js +31 -0
- data/site/log/Changelog.xsl +33 -0
- data/site/log/changelog.xml +1677 -0
- data/site/outdated/BUGS +3 -0
- data/site/outdated/DEPENDS +1 -0
- data/site/outdated/Incompatibilities +89 -0
- data/site/outdated/Incompatibilities.ja +102 -0
- data/site/outdated/NEWS +9 -0
- data/site/outdated/README.ja +73 -0
- data/site/outdated/doc.ja/address.html +275 -0
- data/site/outdated/doc.ja/basics.html +405 -0
- data/site/outdated/doc.ja/config.html +49 -0
- data/site/outdated/doc.ja/details.html +146 -0
- data/site/outdated/doc.ja/index.html +39 -0
- data/site/outdated/doc.ja/mail.html +793 -0
- data/site/outdated/doc.ja/mailbox.html +265 -0
- data/site/outdated/doc.ja/port.html +95 -0
- data/site/outdated/doc.ja/tmail.html +58 -0
- data/site/outdated/doc.ja/usage.html +202 -0
- data/site/outdated/rdd/address.rrd.m +229 -0
- data/site/outdated/rdd/basics.rd.m +275 -0
- data/site/outdated/rdd/config.rrd.m +26 -0
- data/site/outdated/rdd/details.rd.m +117 -0
- data/site/outdated/rdd/index.rhtml.m +54 -0
- data/site/outdated/rdd/mail.rrd.m +701 -0
- data/site/outdated/rdd/mailbox.rrd.m +228 -0
- data/site/outdated/rdd/port.rrd.m +69 -0
- data/site/outdated/rdd/tmail.rrd.m +33 -0
- data/site/outdated/rdd/usage.rd.m +247 -0
- data/site/quickstart/index.html +69 -0
- data/site/quickstart/quickstart.html +52 -0
- data/site/quickstart/usage.html +193 -0
- data/site/reference/address.html +247 -0
- data/site/reference/config.html +30 -0
- data/site/reference/index.html +101 -0
- data/site/reference/mail.html +726 -0
- data/site/reference/mailbox.html +245 -0
- data/site/reference/port.html +75 -0
- data/site/reference/tmail.html +35 -0
- data/test/fixtures/mailbox +405 -4
- data/test/fixtures/raw_email_multiple_from +30 -0
- data/test/kcode.rb +2 -2
- data/test/temp_test_one.rb +46 -0
- data/test/test_address.rb +77 -38
- data/test/test_encode.rb +0 -2
- data/test/test_header.rb +47 -24
- data/test/test_mail.rb +52 -9
- data/test/test_mbox.rb +28 -0
- data/test/test_port.rb +33 -27
- data/test/test_quote.rb +35 -8
- data/work/script/make +26 -0
- data/work/script/rdoc +39 -0
- data/{script → work/script}/setup +0 -0
- data/work/script/test +30 -0
- metadata +249 -184
- data/log/History.txt +0 -40
- data/meta/config.yaml +0 -8
- data/meta/icli.yaml +0 -16
- data/meta/tmail.roll +0 -3
- data/script/changelog +0 -19
- data/script/clobber/distclean +0 -8
- data/script/clobber/package +0 -10
- data/script/compile +0 -32
- data/script/pack/gem +0 -93
- data/script/pack/tgz +0 -41
- data/script/pack/zip +0 -41
- data/script/prepare +0 -15
- data/script/publish +0 -51
- data/script/rdoc +0 -42
- data/script/release +0 -10
- data/script/stamp +0 -33
- data/script/stats +0 -138
- data/script/tag +0 -25
- data/script/test +0 -36
data/lib/tmail/mailbox.rb
CHANGED
@@ -150,9 +150,78 @@ module TMail
|
|
150
150
|
|
151
151
|
class UNIXMbox
|
152
152
|
|
153
|
+
class << self
|
154
|
+
alias newobj new
|
155
|
+
end
|
156
|
+
|
157
|
+
# Creates a new mailbox object that you can iterate through to collect the
|
158
|
+
# emails from with "each_port".
|
159
|
+
#
|
160
|
+
# You need to pass it a filename of a unix mailbox format file, the format of this
|
161
|
+
# file can be researched at this page at {wikipedia}[link:http://en.wikipedia.org/wiki/Mbox]
|
162
|
+
#
|
163
|
+
# ==== Parameters
|
164
|
+
#
|
165
|
+
# +filename+: The filename of the mailbox you want to open
|
166
|
+
#
|
167
|
+
# +tmpdir+: Can be set to override TMail using the system environment's temp dir. TMail will first
|
168
|
+
# use the temp dir specified by you (if any) or then the temp dir specified in the Environment's TEMP
|
169
|
+
# value then the value in the Environment's TMP value or failing all of the above, '/tmp'
|
170
|
+
#
|
171
|
+
# +readonly+: If set to false, each email you take from the mail box will be removed from the mailbox.
|
172
|
+
# default is *false* - ie, it *WILL* truncate your mailbox file to ZERO once it has read the emails out.
|
173
|
+
#
|
174
|
+
# ==== Options:
|
175
|
+
#
|
176
|
+
# None
|
177
|
+
#
|
178
|
+
# ==== Examples:
|
179
|
+
#
|
180
|
+
# # First show using readonly true:
|
181
|
+
#
|
182
|
+
# require 'ftools'
|
183
|
+
# File.size("../test/fixtures/mailbox")
|
184
|
+
# #=> 20426
|
185
|
+
#
|
186
|
+
# mailbox = TMail::UNIXMbox.new("../test/fixtures/mailbox", nil, true)
|
187
|
+
# #=> #<TMail::UNIXMbox:0x14a2aa8 @readonly=true.....>
|
188
|
+
#
|
189
|
+
# mailbox.each_port do |port|
|
190
|
+
# mail = TMail::Mail.new(port)
|
191
|
+
# puts mail.subject
|
192
|
+
# end
|
193
|
+
# #Testing mailbox 1
|
194
|
+
# #Testing mailbox 2
|
195
|
+
# #Testing mailbox 3
|
196
|
+
# #Testing mailbox 4
|
197
|
+
# require 'ftools'
|
198
|
+
# File.size?("../test/fixtures/mailbox")
|
199
|
+
# #=> 20426
|
200
|
+
#
|
201
|
+
# # Now show with readonly set to the default false
|
202
|
+
#
|
203
|
+
# mailbox = TMail::UNIXMbox.new("../test/fixtures/mailbox")
|
204
|
+
# #=> #<TMail::UNIXMbox:0x14a2aa8 @readonly=false.....>
|
205
|
+
#
|
206
|
+
# mailbox.each_port do |port|
|
207
|
+
# mail = TMail::Mail.new(port)
|
208
|
+
# puts mail.subject
|
209
|
+
# end
|
210
|
+
# #Testing mailbox 1
|
211
|
+
# #Testing mailbox 2
|
212
|
+
# #Testing mailbox 3
|
213
|
+
# #Testing mailbox 4
|
214
|
+
#
|
215
|
+
# File.size?("../test/fixtures/mailbox")
|
216
|
+
# #=> nil
|
217
|
+
def UNIXMbox.new( filename, tmpdir = nil, readonly = false )
|
218
|
+
tmpdir = ENV['TEMP'] || ENV['TMP'] || '/tmp'
|
219
|
+
newobj(filename, "#{tmpdir}/ruby_tmail_#{$$}_#{rand()}", readonly, false)
|
220
|
+
end
|
221
|
+
|
153
222
|
def UNIXMbox.lock( fname )
|
154
223
|
begin
|
155
|
-
f = File.open(fname)
|
224
|
+
f = File.open(fname, 'r+')
|
156
225
|
f.flock File::LOCK_EX
|
157
226
|
yield f
|
158
227
|
ensure
|
@@ -161,15 +230,6 @@ module TMail
|
|
161
230
|
end
|
162
231
|
end
|
163
232
|
|
164
|
-
class << self
|
165
|
-
alias newobj new
|
166
|
-
end
|
167
|
-
|
168
|
-
def UNIXMbox.new( fname, tmpdir = nil, readonly = false )
|
169
|
-
tmpdir = ENV['TEMP'] || ENV['TMP'] || '/tmp'
|
170
|
-
newobj(fname, "#{tmpdir}/ruby_tmail_#{$$}_#{rand()}", readonly, false)
|
171
|
-
end
|
172
|
-
|
173
233
|
def UNIXMbox.static_new( fname, dir, readonly = false )
|
174
234
|
newobj(fname, dir, readonly, true)
|
175
235
|
end
|
data/lib/tmail/main.rb
CHANGED
data/lib/tmail/mbox.rb
CHANGED
data/lib/tmail/net.rb
CHANGED
@@ -1,8 +1,3 @@
|
|
1
|
-
=begin rdoc
|
2
|
-
|
3
|
-
= Net provides SMTP wrapping
|
4
|
-
|
5
|
-
=end
|
6
1
|
#--
|
7
2
|
# Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
|
8
3
|
#
|
@@ -29,13 +24,14 @@
|
|
29
24
|
# with permission of Minero Aoki.
|
30
25
|
#++
|
31
26
|
|
27
|
+
#:stopdoc:
|
32
28
|
require 'nkf'
|
33
|
-
|
29
|
+
#:startdoc:
|
34
30
|
|
35
31
|
module TMail
|
36
32
|
|
37
33
|
class Mail
|
38
|
-
|
34
|
+
|
39
35
|
def send_to( smtp )
|
40
36
|
do_send_to(smtp) do
|
41
37
|
ready_to_send
|
@@ -131,7 +127,7 @@ module TMail
|
|
131
127
|
|
132
128
|
end
|
133
129
|
|
134
|
-
|
130
|
+
#:stopdoc:
|
135
131
|
class DeleteFields
|
136
132
|
|
137
133
|
NOSEND_FIELDS = %w(
|
@@ -155,8 +151,9 @@ module TMail
|
|
155
151
|
end
|
156
152
|
|
157
153
|
end
|
154
|
+
#:startdoc:
|
158
155
|
|
159
|
-
|
156
|
+
#:stopdoc:
|
160
157
|
class AddMessageId
|
161
158
|
|
162
159
|
def initialize( fqdn = nil )
|
@@ -170,8 +167,9 @@ module TMail
|
|
170
167
|
end
|
171
168
|
|
172
169
|
end
|
170
|
+
#:startdoc:
|
173
171
|
|
174
|
-
|
172
|
+
#:stopdoc:
|
175
173
|
class AddDate
|
176
174
|
|
177
175
|
def exec( mail )
|
@@ -179,8 +177,9 @@ module TMail
|
|
179
177
|
end
|
180
178
|
|
181
179
|
end
|
180
|
+
#:startdoc:
|
182
181
|
|
183
|
-
|
182
|
+
#:stopdoc:
|
184
183
|
class MimeEncodeAuto
|
185
184
|
|
186
185
|
def initialize( s = nil, m = nil )
|
@@ -198,8 +197,9 @@ module TMail
|
|
198
197
|
end
|
199
198
|
|
200
199
|
end
|
201
|
-
|
200
|
+
#:startdoc:
|
202
201
|
|
202
|
+
#:stopdoc:
|
203
203
|
class MimeEncodeSingle
|
204
204
|
|
205
205
|
def exec( mail )
|
@@ -225,8 +225,9 @@ module TMail
|
|
225
225
|
end
|
226
226
|
|
227
227
|
end
|
228
|
-
|
229
|
-
|
228
|
+
#:startdoc:
|
229
|
+
|
230
|
+
#:stopdoc:
|
230
231
|
class MimeEncodeMulti
|
231
232
|
|
232
233
|
def exec( mail, top = true )
|
@@ -243,5 +244,5 @@ module TMail
|
|
243
244
|
end
|
244
245
|
|
245
246
|
end
|
246
|
-
|
247
|
+
#:startdoc:
|
247
248
|
end # module TMail
|
data/lib/tmail/obsolete.rb
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
= Obsolete methods that are depriciated
|
4
4
|
|
5
|
+
If you really want to see them, go to lib/tmail/obsolete.rb and view to your
|
6
|
+
heart's content.
|
7
|
+
|
5
8
|
=end
|
6
9
|
#--
|
7
10
|
# Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
|
@@ -28,10 +31,9 @@
|
|
28
31
|
# Note: Originally licensed under LGPL v2+. Using MIT license for Rails
|
29
32
|
# with permission of Minero Aoki.
|
30
33
|
#++
|
34
|
+
#:stopdoc:
|
35
|
+
module TMail #:nodoc:
|
31
36
|
|
32
|
-
module TMail
|
33
|
-
|
34
|
-
# mail.rb
|
35
37
|
class Mail
|
36
38
|
alias include? key?
|
37
39
|
alias has_key? key?
|
@@ -51,8 +53,6 @@ module TMail
|
|
51
53
|
alias has_value? value?
|
52
54
|
end
|
53
55
|
|
54
|
-
|
55
|
-
# facade.rb
|
56
56
|
class Mail
|
57
57
|
def from_addr( default = nil )
|
58
58
|
addr, = from_addrs(nil)
|
@@ -83,13 +83,11 @@ module TMail
|
|
83
83
|
alias each_dest each_destination
|
84
84
|
end
|
85
85
|
|
86
|
-
|
87
|
-
# address.rb
|
88
86
|
class Address
|
89
87
|
alias route routes
|
90
88
|
alias addr spec
|
91
89
|
|
92
|
-
def spec=( str )
|
90
|
+
def spec=( str )
|
93
91
|
@local, @domain = str.split(/@/,2).map {|s| s.split(/\./) }
|
94
92
|
end
|
95
93
|
|
@@ -97,8 +95,6 @@ module TMail
|
|
97
95
|
alias address= spec=
|
98
96
|
end
|
99
97
|
|
100
|
-
|
101
|
-
# mbox.rb
|
102
98
|
class MhMailbox
|
103
99
|
alias new_mail new_port
|
104
100
|
alias each_mail each_port
|
@@ -115,8 +111,6 @@ module TMail
|
|
115
111
|
alias each_newmail each_new_port
|
116
112
|
end
|
117
113
|
|
118
|
-
|
119
|
-
# utils.rb
|
120
114
|
extend TextUtils
|
121
115
|
|
122
116
|
class << self
|
@@ -135,3 +129,4 @@ module TMail
|
|
135
129
|
end
|
136
130
|
|
137
131
|
end # module TMail
|
132
|
+
#:startdoc:
|
data/lib/tmail/parser.rb
CHANGED
data/lib/tmail/require_arch.rb
CHANGED
data/lib/tmail/scanner.rb
CHANGED
@@ -28,7 +28,7 @@
|
|
28
28
|
# Note: Originally licensed under LGPL v2+. Using MIT license for Rails
|
29
29
|
# with permission of Minero Aoki.
|
30
30
|
#++
|
31
|
-
|
31
|
+
#:stopdoc:
|
32
32
|
#require 'tmail/require_arch'
|
33
33
|
require 'tmail/utils'
|
34
34
|
require 'tmail/config'
|
@@ -46,3 +46,4 @@ module TMail
|
|
46
46
|
Scanner = TMailScanner
|
47
47
|
end
|
48
48
|
end
|
49
|
+
#:stopdoc:
|
data/lib/tmail/scanner_r.rb
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
# Note: Originally licensed under LGPL v2+. Using MIT license for Rails
|
27
27
|
# with permission of Minero Aoki.
|
28
28
|
#++
|
29
|
-
|
29
|
+
#:stopdoc:
|
30
30
|
require 'tmail/config'
|
31
31
|
|
32
32
|
module TMail
|
@@ -105,7 +105,7 @@ module TMail
|
|
105
105
|
@received = (scantype == :RECEIVED)
|
106
106
|
@is_mime_header = MIME_HEADERS[scantype]
|
107
107
|
|
108
|
-
atom, token, @quoted_re, @domlit_re, @comment_re = PATTERN_TABLE[
|
108
|
+
atom, token, @quoted_re, @domlit_re, @comment_re = PATTERN_TABLE[TMail.KCODE]
|
109
109
|
@word_re = (MIME_HEADERS[scantype] ? token : atom)
|
110
110
|
end
|
111
111
|
|
@@ -145,34 +145,34 @@ module TMail
|
|
145
145
|
|
146
146
|
if s = readstr(@word_re)
|
147
147
|
if @is_mime_header
|
148
|
-
yield :TOKEN, s
|
148
|
+
yield [:TOKEN, s]
|
149
149
|
else
|
150
150
|
# atom
|
151
151
|
if /\A\d+\z/ === s
|
152
|
-
yield :DIGIT, s
|
152
|
+
yield [:DIGIT, s]
|
153
153
|
elsif @received
|
154
|
-
yield RECV_TOKEN[s.downcase] || :ATOM, s
|
154
|
+
yield [RECV_TOKEN[s.downcase] || :ATOM, s]
|
155
155
|
else
|
156
|
-
yield :ATOM, s
|
156
|
+
yield [:ATOM, s]
|
157
157
|
end
|
158
158
|
end
|
159
159
|
|
160
160
|
elsif skip(/\A"/)
|
161
|
-
yield :QUOTED, scan_quoted_word()
|
161
|
+
yield [:QUOTED, scan_quoted_word()]
|
162
162
|
|
163
163
|
elsif skip(/\A\[/)
|
164
|
-
yield :DOMLIT, scan_domain_literal()
|
164
|
+
yield [:DOMLIT, scan_domain_literal()]
|
165
165
|
|
166
166
|
elsif skip(/\A\(/)
|
167
167
|
@comments.push scan_comment()
|
168
168
|
|
169
169
|
else
|
170
170
|
c = readchar()
|
171
|
-
yield c, c
|
171
|
+
yield [c, c]
|
172
172
|
end
|
173
173
|
end
|
174
174
|
|
175
|
-
yield false, '$'
|
175
|
+
yield [false, '$']
|
176
176
|
end
|
177
177
|
|
178
178
|
def scan_quoted_word
|
@@ -259,3 +259,4 @@ module TMail
|
|
259
259
|
end
|
260
260
|
|
261
261
|
end # module TMail
|
262
|
+
#:startdoc:
|
data/lib/tmail/utils.rb
CHANGED
@@ -1,8 +1,3 @@
|
|
1
|
-
=begin rdoc
|
2
|
-
|
3
|
-
= General Purpose TMail Utilities
|
4
|
-
|
5
|
-
=end
|
6
1
|
#--
|
7
2
|
# Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
|
8
3
|
#
|
@@ -29,21 +24,73 @@
|
|
29
24
|
# with permission of Minero Aoki.
|
30
25
|
#++
|
31
26
|
|
27
|
+
# = TMail - The EMail Swiss Army Knife for Ruby
|
28
|
+
#
|
29
|
+
# The TMail library provides you with a very complete way to handle and manipulate EMails
|
30
|
+
# from within your Ruby programs.
|
31
|
+
#
|
32
|
+
# Used as the backbone for email handling by the Ruby on Rails and Nitro web frameworks as
|
33
|
+
# well as a bunch of other Ruby apps including the Ruby-Talk mailing list to newsgroup email
|
34
|
+
# gateway, it is a proven and reliable email handler that won't let you down.
|
35
|
+
#
|
36
|
+
# Originally created by Minero Aoki, TMail has been recently picked up by Mikel Lindsaar and
|
37
|
+
# is being actively maintained. Numerous backlogged bug fixes have been applied as well as
|
38
|
+
# Ruby 1.9 compatibility and a swath of documentation to boot.
|
39
|
+
#
|
40
|
+
# TMail allows you to treat an email totally as an object and allow you to get on with your
|
41
|
+
# own programming without having to worry about crafting the perfect email address validation
|
42
|
+
# parser, or assembling an email from all it's component parts.
|
43
|
+
#
|
44
|
+
# TMail handles the most complex part of the email - the header. It generates and parses
|
45
|
+
# headers and provides you with instant access to their innards through simple and logically
|
46
|
+
# named accessor and setter methods.
|
47
|
+
#
|
48
|
+
# TMail also provides a wrapper to Net/SMTP as well as Unix Mailbox handling methods to
|
49
|
+
# directly read emails from your unix mailbox, parse them and use them.
|
50
|
+
#
|
51
|
+
# Following is the comprehensive list of methods to access TMail::Mail objects. You can also
|
52
|
+
# check out TMail::Mail, TMail::Address and TMail::Headers for other lists.
|
32
53
|
module TMail
|
33
54
|
|
55
|
+
# Provides an exception to throw on errors in Syntax within TMail's parsers
|
34
56
|
class SyntaxError < StandardError; end
|
35
57
|
|
36
|
-
|
58
|
+
# Provides a new email boundary to separate parts of the email. This is a random
|
59
|
+
# string based off the current time, so should be fairly unique.
|
60
|
+
#
|
61
|
+
# For Example:
|
62
|
+
#
|
63
|
+
# TMail.new_boundary
|
64
|
+
# #=> "mimepart_47bf656968207_25a8fbb80114"
|
65
|
+
# TMail.new_boundary
|
66
|
+
# #=> "mimepart_47bf66051de4_25a8fbb80240"
|
37
67
|
def TMail.new_boundary
|
38
68
|
'mimepart_' + random_tag
|
39
69
|
end
|
40
70
|
|
71
|
+
# Provides a new email message ID. You can use this to generate unique email message
|
72
|
+
# id's for your email so you can track them.
|
73
|
+
#
|
74
|
+
# Optionally takes a fully qualified domain name (default to the current hostname
|
75
|
+
# returned by Socket.gethostname) that will be appended to the message ID.
|
76
|
+
#
|
77
|
+
# For Example:
|
78
|
+
#
|
79
|
+
# email.message_id = TMail.new_message_id
|
80
|
+
# #=> "<47bf66845380e_25a8fbb80332@baci.local.tmail>"
|
81
|
+
# email.to_s
|
82
|
+
# #=> "Message-Id: <47bf668b633f1_25a8fbb80475@baci.local.tmail>\n\n"
|
83
|
+
# email.message_id = TMail.new_message_id("lindsaar.net")
|
84
|
+
# #=> "<47bf668b633f1_25a8fbb80475@lindsaar.net.tmail>"
|
85
|
+
# email.to_s
|
86
|
+
# #=> "Message-Id: <47bf668b633f1_25a8fbb80475@lindsaar.net.tmail>\n\n"
|
41
87
|
def TMail.new_message_id( fqdn = nil )
|
42
88
|
fqdn ||= ::Socket.gethostname
|
43
89
|
"<#{random_tag()}@#{fqdn}.tmail>"
|
44
90
|
end
|
45
91
|
|
46
|
-
|
92
|
+
#:stopdoc:
|
93
|
+
def TMail.random_tag #:nodoc:
|
47
94
|
@uniq += 1
|
48
95
|
t = Time.now
|
49
96
|
sprintf('%x%x_%x%x%d%x',
|
@@ -54,8 +101,13 @@ module TMail
|
|
54
101
|
|
55
102
|
@uniq = 0
|
56
103
|
|
104
|
+
#:startdoc:
|
105
|
+
|
106
|
+
# Text Utils provides a namespace to define TOKENs, ATOMs, PHRASEs and CONTROL characters that
|
107
|
+
# are OK per RFC 2822.
|
108
|
+
#
|
109
|
+
# It also provides methods you can call to determine if a string is safe
|
57
110
|
module TextUtils
|
58
|
-
# Defines characters per RFC that are OK for TOKENs, ATOMs, PHRASEs and CONTROL characters.
|
59
111
|
|
60
112
|
aspecial = '()<>[]:;.\\,"'
|
61
113
|
tspecial = '()<>[];:\\,"/?='
|
@@ -67,37 +119,37 @@ module TMail
|
|
67
119
|
TOKEN_UNSAFE = /[#{Regexp.quote tspecial}#{control}#{lwsp}]/n
|
68
120
|
CONTROL_CHAR = /[#{control}]/n
|
69
121
|
|
122
|
+
# Returns true if the string supplied is free from characters not allowed as an ATOM
|
70
123
|
def atom_safe?( str )
|
71
|
-
# Returns true if the string supplied is free from characters not allowed as an ATOM
|
72
124
|
not ATOM_UNSAFE === str
|
73
125
|
end
|
74
126
|
|
127
|
+
# If the string supplied has ATOM unsafe characters in it, will return the string quoted
|
128
|
+
# in double quotes, otherwise returns the string unmodified
|
75
129
|
def quote_atom( str )
|
76
|
-
# If the string supplied has ATOM unsafe characters in it, will return the string quoted
|
77
|
-
# in double quotes, otherwise returns the string unmodified
|
78
130
|
(ATOM_UNSAFE === str) ? dquote(str) : str
|
79
131
|
end
|
80
132
|
|
133
|
+
# If the string supplied has PHRASE unsafe characters in it, will return the string quoted
|
134
|
+
# in double quotes, otherwise returns the string unmodified
|
81
135
|
def quote_phrase( str )
|
82
|
-
# If the string supplied has PHRASE unsafe characters in it, will return the string quoted
|
83
|
-
# in double quotes, otherwise returns the string unmodified
|
84
136
|
(PHRASE_UNSAFE === str) ? dquote(str) : str
|
85
137
|
end
|
86
138
|
|
139
|
+
# Returns true if the string supplied is free from characters not allowed as a TOKEN
|
87
140
|
def token_safe?( str )
|
88
|
-
# Returns true if the string supplied is free from characters not allowed as a TOKEN
|
89
141
|
not TOKEN_UNSAFE === str
|
90
142
|
end
|
91
143
|
|
144
|
+
# If the string supplied has TOKEN unsafe characters in it, will return the string quoted
|
145
|
+
# in double quotes, otherwise returns the string unmodified
|
92
146
|
def quote_token( str )
|
93
|
-
# If the string supplied has TOKEN unsafe characters in it, will return the string quoted
|
94
|
-
# in double quotes, otherwise returns the string unmodified
|
95
147
|
(TOKEN_UNSAFE === str) ? dquote(str) : str
|
96
148
|
end
|
97
149
|
|
98
|
-
|
99
|
-
|
100
|
-
|
150
|
+
# Wraps supplied string in double quotes unless it is already wrapped
|
151
|
+
# Returns double quoted string
|
152
|
+
def dquote( str ) #:nodoc:
|
101
153
|
unless str =~ /^".*?"$/
|
102
154
|
'"' + str.gsub(/["\\]/n) {|s| '\\' + s } + '"'
|
103
155
|
else
|
@@ -106,12 +158,14 @@ module TMail
|
|
106
158
|
end
|
107
159
|
private :dquote
|
108
160
|
|
161
|
+
# Unwraps supplied string from inside double quotes
|
162
|
+
# Returns unquoted string
|
109
163
|
def unquote( str )
|
110
|
-
# Unwraps supplied string from inside double quotes
|
111
|
-
# Returns unquoted string
|
112
164
|
str =~ /^"(.*?)"$/ ? $1 : str
|
113
165
|
end
|
114
166
|
|
167
|
+
# Provides a method to join a domain name by it's parts and also makes it
|
168
|
+
# ATOM safe by quoting it as needed
|
115
169
|
def join_domain( arr )
|
116
170
|
arr.map {|i|
|
117
171
|
if /\A\[.*\]\z/ === i
|
@@ -122,7 +176,7 @@ module TMail
|
|
122
176
|
}.join('.')
|
123
177
|
end
|
124
178
|
|
125
|
-
|
179
|
+
#:stopdoc:
|
126
180
|
ZONESTR_TABLE = {
|
127
181
|
'jst' => 9 * 60,
|
128
182
|
'eet' => 2 * 60,
|
@@ -168,9 +222,10 @@ module TMail
|
|
168
222
|
'y' => 12 * 60,
|
169
223
|
'z' => 0 * 60
|
170
224
|
}
|
225
|
+
#:startdoc:
|
171
226
|
|
227
|
+
# Takes a time zone string from an EMail and converts it to Unix Time (seconds)
|
172
228
|
def timezone_string_to_unixtime( str )
|
173
|
-
# Takes a time zone string from an EMail and converts it to Unix Time (seconds)
|
174
229
|
if m = /([\+\-])(\d\d?)(\d\d)/.match(str)
|
175
230
|
sec = (m[2].to_i * 60 + m[3].to_i) * 60
|
176
231
|
m[1] == '-' ? -sec : sec
|
@@ -181,7 +236,7 @@ module TMail
|
|
181
236
|
end
|
182
237
|
end
|
183
238
|
|
184
|
-
|
239
|
+
#:stopdoc:
|
185
240
|
WDAY = %w( Sun Mon Tue Wed Thu Fri Sat TMailBUG )
|
186
241
|
MONTH = %w( TMailBUG Jan Feb Mar Apr May Jun
|
187
242
|
Jul Aug Sep Oct Nov Dec TMailBUG )
|
@@ -201,7 +256,7 @@ module TMail
|
|
201
256
|
|
202
257
|
|
203
258
|
MESSAGE_ID = /<[^\@>]+\@[^>\@]+>/
|
204
|
-
|
259
|
+
|
205
260
|
def message_id?( str )
|
206
261
|
MESSAGE_ID === str
|
207
262
|
end
|
@@ -239,7 +294,7 @@ module TMail
|
|
239
294
|
}
|
240
295
|
|
241
296
|
def to_kcode( str )
|
242
|
-
flag = NKF_FLAGS[
|
297
|
+
flag = NKF_FLAGS[TMail.KCODE] or return str
|
243
298
|
NKF.nkf(flag, str)
|
244
299
|
end
|
245
300
|
|
@@ -274,6 +329,8 @@ module TMail
|
|
274
329
|
end
|
275
330
|
end
|
276
331
|
end
|
332
|
+
#:startdoc:
|
333
|
+
|
277
334
|
|
278
335
|
end
|
279
336
|
|