sup 0.19.0 → 0.22.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.
- checksums.yaml +4 -4
- data/.gitignore +5 -0
- data/.gitmodules +3 -0
- data/.travis.yml +3 -2
- data/CONTRIBUTORS +19 -13
- data/Gemfile +4 -0
- data/History.txt +41 -0
- data/Rakefile +41 -1
- data/ReleaseNotes +17 -0
- data/bin/sup +5 -18
- data/bin/sup-add +1 -2
- data/bin/sup-config +0 -1
- data/bin/sup-dump +0 -1
- data/bin/sup-import-dump +1 -2
- data/bin/sup-sync +0 -1
- data/bin/sup-sync-back-maildir +1 -2
- data/bin/sup-tweak-labels +1 -2
- data/contrib/colorpicker.rb +0 -2
- data/contrib/completion/_sup.bash +102 -0
- data/devel/profile.rb +0 -1
- data/ext/mkrf_conf_xapian.rb +47 -0
- data/lib/sup.rb +9 -8
- data/lib/sup/buffer.rb +12 -0
- data/lib/sup/colormap.rb +5 -2
- data/lib/sup/contact.rb +4 -2
- data/lib/sup/crypto.rb +41 -8
- data/lib/sup/draft.rb +8 -8
- data/lib/sup/hook.rb +1 -1
- data/lib/sup/index.rb +2 -2
- data/lib/sup/label.rb +1 -1
- data/lib/sup/maildir.rb +16 -5
- data/lib/sup/mbox.rb +13 -5
- data/lib/sup/message.rb +17 -3
- data/lib/sup/message_chunks.rb +10 -2
- data/lib/sup/mode.rb +33 -28
- data/lib/sup/modes/edit_message_mode.rb +3 -2
- data/lib/sup/modes/forward_mode.rb +22 -3
- data/lib/sup/modes/line_cursor_mode.rb +1 -1
- data/lib/sup/modes/text_mode.rb +6 -1
- data/lib/sup/modes/thread_index_mode.rb +11 -1
- data/lib/sup/modes/thread_view_mode.rb +103 -9
- data/lib/sup/person.rb +68 -61
- data/lib/sup/search.rb +1 -1
- data/lib/sup/sent.rb +1 -1
- data/lib/sup/util.rb +1 -75
- data/lib/sup/util/locale_fiddler.rb +24 -0
- data/lib/sup/version.rb +1 -1
- data/sup.gemspec +22 -5
- data/test/{messages → fixtures}/bad-content-transfer-encoding-1.eml +0 -0
- data/test/{messages → fixtures}/binary-content-transfer-encoding-2.eml +0 -0
- data/test/fixtures/blank-header-fields.eml +71 -0
- data/test/fixtures/contacts.txt +1 -0
- data/test/fixtures/malicious-attachment-names.eml +55 -0
- data/test/fixtures/missing-from-to.eml +18 -0
- data/test/{messages → fixtures}/missing-line.eml +0 -0
- data/test/fixtures/multi-part-2.eml +72 -0
- data/test/fixtures/multi-part.eml +61 -0
- data/test/fixtures/no-body.eml +18 -0
- data/test/fixtures/simple-message.eml +29 -0
- data/test/gnupg_test_home/gpg.conf +2 -1
- data/test/gnupg_test_home/key1.gen +15 -0
- data/test/gnupg_test_home/key2.gen +15 -0
- data/test/gnupg_test_home/key_ecc.gen +13 -0
- data/test/gnupg_test_home/pubring.gpg +0 -0
- data/test/gnupg_test_home/receiver_pubring.gpg +0 -0
- data/test/gnupg_test_home/receiver_secring.gpg +0 -0
- data/test/gnupg_test_home/regen_keys.sh +38 -0
- data/test/gnupg_test_home/secring.gpg +0 -0
- data/test/gnupg_test_home/sup-test-2@foo.bar.asc +22 -17
- data/test/integration/test_maildir.rb +75 -0
- data/test/integration/test_mbox.rb +69 -0
- data/test/test_crypto.rb +12 -2
- data/test/test_header_parsing.rb +1 -1
- data/test/test_helper.rb +6 -3
- data/test/test_message.rb +42 -342
- data/test/test_messages_dir.rb +4 -28
- data/test/test_yaml_regressions.rb +1 -1
- data/test/unit/test_contact.rb +33 -0
- data/test/unit/test_locale_fiddler.rb +15 -0
- data/test/unit/test_person.rb +37 -0
- metadata +108 -38
- data/test/gnupg_test_home/receiver_trustdb.gpg +0 -0
- data/test/gnupg_test_home/trustdb.gpg +0 -0
data/lib/sup/person.rb
CHANGED
@@ -18,11 +18,16 @@ class Person
|
|
18
18
|
@email = email.strip.gsub(/\s+/, " ")
|
19
19
|
end
|
20
20
|
|
21
|
-
def to_s
|
21
|
+
def to_s
|
22
|
+
if @name
|
23
|
+
"#@name <#@email>"
|
24
|
+
else
|
25
|
+
@email
|
26
|
+
end
|
27
|
+
end
|
22
28
|
|
23
29
|
# def == o; o && o.email == email; end
|
24
30
|
# alias :eql? :==
|
25
|
-
# def hash; [name, email].hash; end
|
26
31
|
|
27
32
|
def shortname
|
28
33
|
case @name
|
@@ -37,26 +42,10 @@ class Person
|
|
37
42
|
end
|
38
43
|
end
|
39
44
|
|
40
|
-
def longname
|
41
|
-
if @name && @email
|
42
|
-
"#@name <#@email>"
|
43
|
-
else
|
44
|
-
@email
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
45
|
def mediumname; @name || @email; end
|
49
46
|
|
50
|
-
def
|
51
|
-
|
52
|
-
if name =~ /[",@]/
|
53
|
-
"#{name.inspect} <#{email}>" # escape quotes
|
54
|
-
else
|
55
|
-
"#{name} <#{email}>"
|
56
|
-
end
|
57
|
-
else
|
58
|
-
email
|
59
|
-
end
|
47
|
+
def longname
|
48
|
+
to_s
|
60
49
|
end
|
61
50
|
|
62
51
|
def full_address
|
@@ -79,56 +68,74 @@ class Person
|
|
79
68
|
end.downcase
|
80
69
|
end
|
81
70
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
71
|
+
def eql? o; email.eql? o.email end
|
72
|
+
def hash; email.hash end
|
73
|
+
|
74
|
+
|
75
|
+
## see comments in self.from_address
|
76
|
+
def indexable_content
|
77
|
+
[name, email, email.split(/@/).first].join(" ")
|
86
78
|
end
|
87
79
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
## separating those three bits, and no <>'s. this is the output of
|
98
|
-
## #indexable_content. here, we reverse-engineer that format to extract
|
99
|
-
## a valid address.
|
100
|
-
##
|
101
|
-
## we store things this way to allow searches on a to/from/etc field to
|
102
|
-
## match any of those parts. a more robust solution would be to store a
|
103
|
-
## separate, non-indexed field with the proper headers. but this way we
|
104
|
-
## save precious bits, and it's backwards-compatible with older indexes.
|
105
|
-
[$1, $2]
|
106
|
-
when /["'](.*?)["'] <(.*?)>/, /([^,]+) <(.*?)>/
|
107
|
-
a, b = $1, $2
|
108
|
-
[a.gsub('\"', '"'), b]
|
109
|
-
when /<((\S+?)@\S+?)>/
|
110
|
-
[$2, $1]
|
111
|
-
when /((\S+?)@\S+)/
|
112
|
-
[$2, $1]
|
80
|
+
class << self
|
81
|
+
|
82
|
+
def full_address name, email
|
83
|
+
if name && email
|
84
|
+
if name =~ /[",@]/
|
85
|
+
"#{name.inspect} <#{email}>" # escape quotes
|
86
|
+
else
|
87
|
+
"#{name} <#{email}>"
|
88
|
+
end
|
113
89
|
else
|
114
|
-
|
90
|
+
email
|
115
91
|
end
|
92
|
+
end
|
116
93
|
|
117
|
-
|
118
|
-
|
94
|
+
## return "canonical" person using contact manager or create one if
|
95
|
+
## not found or contact manager not available
|
96
|
+
def from_name_and_email name, email
|
97
|
+
ContactManager.instantiated? && ContactManager.person_for(email) || Person.new(name, email)
|
98
|
+
end
|
119
99
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
100
|
+
def from_address s
|
101
|
+
return nil if s.nil?
|
102
|
+
|
103
|
+
## try and parse an email address and name
|
104
|
+
name, email = case s
|
105
|
+
when /(.+?) ((\S+?)@\S+) \3/
|
106
|
+
## ok, this first match cause is insane, but bear with me. email
|
107
|
+
## addresses are stored in the to/from/etc fields of the index in a
|
108
|
+
## weird format: "name address first-part-of-address", i.e. spaces
|
109
|
+
## separating those three bits, and no <>'s. this is the output of
|
110
|
+
## #indexable_content. here, we reverse-engineer that format to extract
|
111
|
+
## a valid address.
|
112
|
+
##
|
113
|
+
## we store things this way to allow searches on a to/from/etc field to
|
114
|
+
## match any of those parts. a more robust solution would be to store a
|
115
|
+
## separate, non-indexed field with the proper headers. but this way we
|
116
|
+
## save precious bits, and it's backwards-compatible with older indexes.
|
117
|
+
[$1, $2]
|
118
|
+
when /["'](.*?)["'] <(.*?)>/, /([^,]+) <(.*?)>/
|
119
|
+
a, b = $1, $2
|
120
|
+
[a.gsub('\"', '"'), b]
|
121
|
+
when /<((\S+?)@\S+?)>/
|
122
|
+
[$2, $1]
|
123
|
+
when /((\S+?)@\S+)/
|
124
|
+
[$2, $1]
|
125
|
+
else
|
126
|
+
[nil, s]
|
127
|
+
end
|
128
|
+
|
129
|
+
from_name_and_email name, email
|
130
|
+
end
|
131
|
+
|
132
|
+
def from_address_list ss
|
133
|
+
return [] if ss.nil?
|
134
|
+
ss.dup.split_on_commas.map { |s| self.from_address s }
|
135
|
+
end
|
124
136
|
|
125
|
-
## see comments in self.from_address
|
126
|
-
def indexable_content
|
127
|
-
[name, email, email.split(/@/).first].join(" ")
|
128
137
|
end
|
129
138
|
|
130
|
-
def eql? o; email.eql? o.email end
|
131
|
-
def hash; email.hash end
|
132
139
|
end
|
133
140
|
|
134
141
|
end
|
data/lib/sup/search.rb
CHANGED
data/lib/sup/sent.rb
CHANGED
@@ -40,7 +40,7 @@ class SentLoader < MBox
|
|
40
40
|
|
41
41
|
def initialize
|
42
42
|
@filename = Redwood::SENT_FN
|
43
|
-
File.open(@filename, "w") { } unless File.
|
43
|
+
File.open(@filename, "w") { } unless File.exist? @filename
|
44
44
|
super "mbox://" + @filename, true, $config[:archive_sent]
|
45
45
|
end
|
46
46
|
|
data/lib/sup/util.rb
CHANGED
@@ -10,15 +10,6 @@ require 'benchmark'
|
|
10
10
|
require 'unicode'
|
11
11
|
require 'fileutils'
|
12
12
|
|
13
|
-
## time for some monkeypatching!
|
14
|
-
class Symbol
|
15
|
-
unless method_defined? :to_proc
|
16
|
-
def to_proc
|
17
|
-
proc { |obj, *args| obj.send(self, *args) }
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
13
|
class Lockfile
|
23
14
|
def gen_lock_id
|
24
15
|
Hash[
|
@@ -89,7 +80,7 @@ module RMail
|
|
89
80
|
end
|
90
81
|
|
91
82
|
def charset
|
92
|
-
if header.field?("content-type") && header.fetch("content-type") =~ /charset
|
83
|
+
if header.field?("content-type") && header.fetch("content-type") =~ /charset\s*=\s*"?(.*?)"?(;|$)/i
|
93
84
|
$1
|
94
85
|
end
|
95
86
|
end
|
@@ -170,13 +161,6 @@ module RMail
|
|
170
161
|
end
|
171
162
|
end
|
172
163
|
|
173
|
-
class Range
|
174
|
-
## only valid for integer ranges (unless I guess it's exclusive)
|
175
|
-
def size
|
176
|
-
last - first + (exclude_end? ? 0 : 1)
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
164
|
class Module
|
181
165
|
def bool_reader *args
|
182
166
|
args.each { |sym| class_eval %{ def #{sym}?; @#{sym}; end } }
|
@@ -198,17 +182,6 @@ class Module
|
|
198
182
|
end
|
199
183
|
|
200
184
|
class Object
|
201
|
-
def ancestors
|
202
|
-
ret = []
|
203
|
-
klass = self.class
|
204
|
-
|
205
|
-
until klass == Object
|
206
|
-
ret << klass
|
207
|
-
klass = klass.superclass
|
208
|
-
end
|
209
|
-
ret
|
210
|
-
end
|
211
|
-
|
212
185
|
## "k combinator"
|
213
186
|
def returning x; yield x; x; end
|
214
187
|
|
@@ -382,8 +355,6 @@ class String
|
|
382
355
|
|
383
356
|
# Fix the damn string! make sure it is valid utf-8, then convert to
|
384
357
|
# user encoding.
|
385
|
-
#
|
386
|
-
# Not Ruby 1.8 compatible
|
387
358
|
def fix_encoding!
|
388
359
|
# first try to encode to utf-8 from whatever current encoding
|
389
360
|
encode!('UTF-8', :invalid => :replace, :undef => :replace)
|
@@ -406,8 +377,6 @@ class String
|
|
406
377
|
|
407
378
|
# transcode the string if original encoding is know
|
408
379
|
# fix if broken.
|
409
|
-
#
|
410
|
-
# Not Ruby 1.8 compatible
|
411
380
|
def transcode to_encoding, from_encoding
|
412
381
|
begin
|
413
382
|
encode!(to_encoding, from_encoding, :invalid => :replace, :undef => :replace)
|
@@ -474,13 +443,6 @@ class String
|
|
474
443
|
out = out.fix_encoding! # this should now be an utf-8 string of ascii
|
475
444
|
# compat chars.
|
476
445
|
end
|
477
|
-
|
478
|
-
unless method_defined? :ascii_only?
|
479
|
-
def ascii_only?
|
480
|
-
size.times { |i| return false if self[i] & 128 != 0 }
|
481
|
-
return true
|
482
|
-
end
|
483
|
-
end
|
484
446
|
end
|
485
447
|
|
486
448
|
class Numeric
|
@@ -518,12 +480,6 @@ class Fixnum
|
|
518
480
|
end
|
519
481
|
end
|
520
482
|
|
521
|
-
unless method_defined?(:ord)
|
522
|
-
def ord
|
523
|
-
self
|
524
|
-
end
|
525
|
-
end
|
526
|
-
|
527
483
|
## hacking the english language
|
528
484
|
def pluralize s
|
529
485
|
to_s + " " +
|
@@ -607,10 +563,6 @@ module Enumerable
|
|
607
563
|
end
|
608
564
|
end
|
609
565
|
|
610
|
-
unless Object.const_defined? :Enumerator
|
611
|
-
Enumerator = Enumerable::Enumerator
|
612
|
-
end
|
613
|
-
|
614
566
|
class Array
|
615
567
|
def flatten_one_level
|
616
568
|
inject([]) { |a, e| a + e }
|
@@ -706,32 +658,6 @@ class SavingHash
|
|
706
658
|
defer_all_other_method_calls_to :hash
|
707
659
|
end
|
708
660
|
|
709
|
-
class OrderedHash < Hash
|
710
|
-
alias_method :store, :[]=
|
711
|
-
alias_method :each_pair, :each
|
712
|
-
attr_reader :keys
|
713
|
-
|
714
|
-
def initialize *a
|
715
|
-
@keys = []
|
716
|
-
a.each { |k, v| self[k] = v }
|
717
|
-
end
|
718
|
-
|
719
|
-
def []= key, val
|
720
|
-
@keys << key unless member?(key)
|
721
|
-
super
|
722
|
-
end
|
723
|
-
|
724
|
-
def values; keys.map { |k| self[k] } end
|
725
|
-
def index key; @keys.index key end
|
726
|
-
|
727
|
-
def delete key
|
728
|
-
@keys.delete key
|
729
|
-
super
|
730
|
-
end
|
731
|
-
|
732
|
-
def each; @keys.each { |k| yield k, self[k] } end
|
733
|
-
end
|
734
|
-
|
735
661
|
## easy thread-safe class for determining who's the "winner" in a race (i.e.
|
736
662
|
## first person to hit the finish line
|
737
663
|
class FinishLine
|
@@ -0,0 +1,24 @@
|
|
1
|
+
## the following magic enables wide characters when used with a ruby
|
2
|
+
## ncurses.so that's been compiled against libncursesw. (note the w.) why
|
3
|
+
## this works, i have no idea. much like pretty much every aspect of
|
4
|
+
## dealing with curses. cargo cult programming at its best.
|
5
|
+
require 'fiddle'
|
6
|
+
require 'fiddle/import'
|
7
|
+
|
8
|
+
module LocaleFiddler
|
9
|
+
extend Fiddle::Importer
|
10
|
+
|
11
|
+
SETLOCALE_LIB = case RbConfig::CONFIG['arch']
|
12
|
+
when /darwin/; "libc.dylib"
|
13
|
+
when /cygwin/; "cygwin1.dll"
|
14
|
+
when /freebsd/; "libc.so.7"
|
15
|
+
else; "libc.so.6"
|
16
|
+
end
|
17
|
+
|
18
|
+
dlload SETLOCALE_LIB
|
19
|
+
extern "char *setlocale(int, char const *)"
|
20
|
+
|
21
|
+
def setlocale(type, string)
|
22
|
+
LocaleFiddler.setlocale(type, string)
|
23
|
+
end
|
24
|
+
end
|
data/lib/sup/version.rb
CHANGED
data/sup.gemspec
CHANGED
@@ -25,29 +25,46 @@ DESC
|
|
25
25
|
SUP: please note that our old mailing lists have been shut down,
|
26
26
|
re-subscribe to supmua@googlegroups.com to discuss and follow
|
27
27
|
updates on sup (send email to: supmua+subscribe@googlegroups.com).
|
28
|
+
|
29
|
+
OpenBSD users:
|
30
|
+
If your operating system is OpenBSD you have some
|
31
|
+
additional, manual steps to do before Sup will work, see:
|
32
|
+
https://github.com/sup-heliotrope/sup/wiki/Installation%3A-OpenBSD.
|
28
33
|
EOF
|
29
34
|
|
30
35
|
s.files = `git ls-files -z`.split("\x0")
|
31
36
|
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
32
37
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
33
38
|
s.require_paths = ["lib"]
|
39
|
+
s.extra_rdoc_files = Dir.glob("man/*")
|
40
|
+
|
41
|
+
s.required_ruby_version = '>= 2.0.0'
|
34
42
|
|
35
|
-
|
43
|
+
# this is here to support skipping the xapian-ruby installation on OpenBSD
|
44
|
+
# because the xapian-ruby gem doesn't install on OpenBSD, you must install
|
45
|
+
# xapian-core and xapian-bindings manually on OpenBSD
|
46
|
+
# see https://github.com/sup-heliotrope/sup/wiki/Installation%3A-OpenBSD
|
47
|
+
# and https://en.wikibooks.org/wiki/Ruby_Programming/RubyGems#How_to_install_different_versions_of_gems_depending_on_which_version_of_ruby_the_installee_is_using
|
48
|
+
s.extensions = %w[ext/mkrf_conf_xapian.rb]
|
49
|
+
|
50
|
+
## remember to update the xapian dependency in
|
51
|
+
## ext/mkrf_conf_xapian.rb and Gemfile.
|
36
52
|
|
37
|
-
s.add_runtime_dependency "xapian-ruby", "~> 1.2.15"
|
38
53
|
s.add_runtime_dependency "ncursesw", "~> 1.4.0"
|
39
54
|
s.add_runtime_dependency "rmail-sup", "~> 1.0.1"
|
40
55
|
s.add_runtime_dependency "highline"
|
41
56
|
s.add_runtime_dependency "trollop", ">= 1.12"
|
42
57
|
s.add_runtime_dependency "lockfile"
|
43
|
-
s.add_runtime_dependency "mime-types", "
|
58
|
+
s.add_runtime_dependency "mime-types", "> 2.0"
|
44
59
|
s.add_runtime_dependency "locale", "~> 2.0"
|
45
60
|
s.add_runtime_dependency "chronic", "~> 0.9.1"
|
46
61
|
s.add_runtime_dependency "unicode", "~> 0.4.4"
|
47
62
|
|
48
63
|
s.add_development_dependency "bundler", "~> 1.3"
|
49
64
|
s.add_development_dependency "rake"
|
50
|
-
s.add_development_dependency
|
51
|
-
s.add_development_dependency "rr", "~> 1.
|
65
|
+
s.add_development_dependency 'minitest', '~> 5.5.1'
|
66
|
+
s.add_development_dependency "rr", "~> 1.1"
|
52
67
|
s.add_development_dependency "gpgme", ">= 2.0.2"
|
68
|
+
s.add_development_dependency "pry"
|
69
|
+
|
53
70
|
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,71 @@
|
|
1
|
+
Return-Path: <monitor-list-bounces@widget.com>
|
2
|
+
X-Original-To: nobody@localhost
|
3
|
+
Delivered-To: nobody@localhost.eng.widget.com
|
4
|
+
Received: from localhost (localhost.localdomain [127.0.0.1])
|
5
|
+
by soquel.eng.widget.com (Postfix) with ESMTP id 609BC13C0DB1
|
6
|
+
for <nobody@localhost>; Thu, 19 Mar 2009 13:43:21 -0700 (PDT)
|
7
|
+
MIME-Version: 1.0
|
8
|
+
Received: from pa-excas-vip.widget.com [10.16.67.200]
|
9
|
+
by localhost with IMAP (fetchmail-6.2.5)
|
10
|
+
for nobody@localhost (single-drop); Thu, 19 Mar 2009 13:43:21 -0700 (PDT)
|
11
|
+
Received: from pa-exht01.widget.com (10.113.81.167) by pa-excaht11.widget.com
|
12
|
+
(10.113.81.197) with Microsoft SMTP Server (TLS) id 8.1.311.2; Thu, 19 Mar
|
13
|
+
2009 13:42:30 -0700
|
14
|
+
Received: from mailman2.widget.com (10.16.64.159) by pa-exht01.widget.com
|
15
|
+
(10.113.81.167) with Microsoft SMTP Server id 8.1.336.0; Thu, 19 Mar 2009
|
16
|
+
13:42:30 -0700
|
17
|
+
Received: by mailman2.widget.com (Postfix) id 47095AE30856; Thu, 19 Mar 2009
|
18
|
+
13:42:29 -0700 (PDT)
|
19
|
+
Received: from countchocula.widget.com (localhost.localdomain [127.0.0.1]) by
|
20
|
+
mailman2.widget.com (Postfix) with ESMTP id 5F782ABC5948; Thu, 19 Mar 2009
|
21
|
+
13:42:28 -0700 (PDT)
|
22
|
+
Received: from mailhost4.widget.com (mailhost4.widget.com [10.16.67.124]) by
|
23
|
+
mailman2.widget.com (Postfix) with ESMTP id 6CDCCABC5948 for
|
24
|
+
<monitor-list@mailman2.widget.com>; Thu, 19 Mar 2009 13:42:26 -0700 (PDT)
|
25
|
+
Received: by mailhost4.widget.com (Postfix) id 2364AC9AC4; Thu, 19 Mar 2009
|
26
|
+
13:42:26 -0700 (PDT)
|
27
|
+
Received: from pa-exht01.widget.com (pa-exht01.widget.com [10.113.81.167]) by
|
28
|
+
mailhost4.widget.com (Postfix) with ESMTP id 17A68C9AC3 for
|
29
|
+
<monitor-list@widget.com>; Thu, 19 Mar 2009 13:42:26 -0700 (PDT)
|
30
|
+
Received: from PA-EXMBX04.widget.com ([10.113.81.142]) by pa-exht01.widget.com
|
31
|
+
([10.113.81.167]) with mapi; Thu, 19 Mar 2009 13:42:26 -0700
|
32
|
+
From: Some User <someuser@widget.com>
|
33
|
+
To: "monitor-list@widget.com" <monitor-list@widget.com>
|
34
|
+
Sender: "monitor-list-bounces@widget.com" <monitor-list-bounces@widget.com>
|
35
|
+
Date: Thu, 19 Mar 2009 13:42:25 -0700
|
36
|
+
Subject: Looking for a mac
|
37
|
+
Thread-Topic: Looking for a mac
|
38
|
+
Thread-Index: AQHJqNM1xIqqjNRWuUCUBaxzPFK5eQ==
|
39
|
+
Message-ID:
|
40
|
+
<D3C12B2AD838B44DA9D6B2CA334246D011E72A73A4@PA-EXMBX04.widget.com>
|
41
|
+
List-Help: <mailto:monitor-list-request@widget.com?subject=help>
|
42
|
+
List-Subscribe: <http://mailman2.widget.com/mailman/listinfo/monitor-list>,
|
43
|
+
<mailto:monitor-list-request@widget.com?subject=subscribe>
|
44
|
+
List-Unsubscribe:
|
45
|
+
<http://mailman2.widget.com/mailman/listinfo/monitor-list>,
|
46
|
+
<mailto:monitor-list-request@widget.com?subject=unsubscribe>
|
47
|
+
Accept-Language: en-US
|
48
|
+
Content-Language: en-US
|
49
|
+
X-MS-Exchange-Organization-AuthAs: Anonymous
|
50
|
+
X-MS-Exchange-Organization-AuthSource: pa-exht01.widget.com
|
51
|
+
X-MS-Has-Attach:
|
52
|
+
X-Auto-Response-Suppress: All
|
53
|
+
X-MS-TNEF-Correlator:
|
54
|
+
acceptlanguage: en-US
|
55
|
+
delivered-to: monitor-list@widget.com
|
56
|
+
errors-to: monitor-list-bounces@widget.com
|
57
|
+
list-id: engineering monitor related <monitor-list.widget.com>
|
58
|
+
x-mailman-version: 2.1.8
|
59
|
+
x-beenthere: monitor-list@widget.com
|
60
|
+
x-original-to: monitor-list@mailman2.widget.com
|
61
|
+
list-post: <mailto:monitor-list@widget.com>
|
62
|
+
list-archive: <http://mailman2.widget.com/pipermail/monitor-list>
|
63
|
+
Content-Type: text/plain; charset="us-ascii"
|
64
|
+
Content-Transfer-Encoding: quoted-printable
|
65
|
+
|
66
|
+
Hi all,
|
67
|
+
|
68
|
+
Just wondering if anybody can lend me a mac to reproduce PR 384931 ?
|
69
|
+
Thanks.
|
70
|
+
|
71
|
+
Michael=
|