mms2r 1.0.7 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/History.txt +19 -1
  2. data/Manifest.txt +38 -19
  3. data/README.txt +40 -8
  4. data/Rakefile +2 -2
  5. data/conf/mms2r_cingular_me_media_subject.yml +3 -0
  6. data/conf/{mms2r_cingularmedia_transform.yml → mms2r_cingular_me_media_transform.yml} +1 -0
  7. data/conf/mms2r_dobson_media_ignore.yml +4 -0
  8. data/conf/mms2r_media_ignore.yml +4 -0
  9. data/conf/mms2r_media_subject.yml +3 -0
  10. data/conf/mms2r_my_cingular_media_subject.yml +3 -0
  11. data/conf/mms2r_nextel_media_ignore.yml +11 -0
  12. data/conf/mms2r_sprint_media_ignore.yml +5 -0
  13. data/conf/mms2r_sprint_media_subject.yml +3 -0
  14. data/conf/{mms2r_tmobilemedia_ignore.yml → mms2r_t_mobile_media_ignore.yml} +2 -5
  15. data/conf/mms2r_verizon_media_ignore.yml +4 -0
  16. data/conf/mms2r_verizon_media_transform.yml +6 -0
  17. data/dev_tools/debug_sprint_hpricot_parsing.rb +82 -0
  18. data/lib/mms2r.rb +61 -0
  19. data/lib/mms2r/cingular_me_media.rb +23 -0
  20. data/lib/mms2r/dobson_media.rb +4 -5
  21. data/lib/mms2r/{mmode_media.rb → m_mode_media.rb} +4 -4
  22. data/lib/mms2r/media.rb +283 -160
  23. data/lib/mms2r/my_cingular_media.rb +15 -0
  24. data/lib/mms2r/nextel_media.rb +9 -3
  25. data/lib/mms2r/sprint_media.rb +137 -29
  26. data/lib/mms2r/sprint_pcs_media.rb +16 -0
  27. data/lib/mms2r/t_mobile_media.rb +21 -0
  28. data/lib/mms2r/verizon_media.rb +11 -3
  29. data/lib/mms2r/vtext_media.rb +16 -0
  30. data/test/files/cingularme-text-02.mail +14 -0
  31. data/test/files/hello_world_empty_text.mail +6 -0
  32. data/test/files/hello_world_mail_multipart.mail +7 -0
  33. data/test/files/{cingular-image-01.mail → mycingular-image-01.mail} +0 -0
  34. data/test/files/simple-with-two-images-two-texts.mail +49 -0
  35. data/test/files/{sprint-image-02.mail → sprint-broken-image-01.mail} +1 -1
  36. data/test/files/sprint-image-01.mail +1 -1
  37. data/test/files/sprint-pcs-text-01.mail +8 -0
  38. data/test/files/sprint-text-01.mail +195 -8
  39. data/test/files/sprint-two-images-01.mail +198 -0
  40. data/test/files/sprint-video-01.mail +1 -1
  41. data/test/files/verizon-image-02.mail +1 -1
  42. data/test/files/vtext-text-01.mail +1 -1
  43. data/test/test_mms2r_cingular_me_media.rb +51 -0
  44. data/test/test_mms2r_dobson_media.rb +46 -0
  45. data/test/{test_mms2r_mmode.rb → test_mms2r_m_mode_media.rb} +1 -1
  46. data/test/test_mms2r_media.rb +160 -74
  47. data/test/test_mms2r_my_cingular_media.rb +31 -0
  48. data/test/test_mms2r_nextel_media.rb +100 -0
  49. data/test/test_mms2r_sprint_media.rb +221 -0
  50. data/test/test_mms2r_sprint_pcs_media.rb +27 -0
  51. data/test/{test_mms2r_tmobile.rb → test_mms2r_t_mobile_media.rb} +13 -13
  52. data/test/test_mms2r_verizon_media.rb +96 -0
  53. data/test/test_mms2r_vtext_media.rb +28 -0
  54. data/vendor/plugins/mms2r/lib/autotest/discover.rb +3 -0
  55. data/vendor/plugins/mms2r/lib/autotest/mms2r.rb +33 -0
  56. metadata +62 -37
  57. data/conf/mms2r_nextelmedia_ignore.yml +0 -10
  58. data/conf/mms2r_sprintmedia_ignore.yml +0 -10
  59. data/conf/mms2r_verizonmedia_ignore.yml +0 -3
  60. data/conf/mms2r_verizonmedia_transform.yml +0 -3
  61. data/lib/mms2r/cingular_media.rb +0 -11
  62. data/lib/mms2r/tmobile_media.rb +0 -11
  63. data/lib/mms2r/version.rb +0 -12
  64. data/test/test_mms2r_cingular.rb +0 -58
  65. data/test/test_mms2r_dobson.rb +0 -36
  66. data/test/test_mms2r_nextel.rb +0 -132
  67. data/test/test_mms2r_sprint.rb +0 -174
  68. data/test/test_mms2r_verizon.rb +0 -102
@@ -0,0 +1,15 @@
1
+ module MMS2R
2
+
3
+ ##
4
+ # My Cingular version of MMS2R::Media
5
+ #
6
+ # The Cingular MMS messages are well formed multipart
7
+ # mails and do not contain any extra advertising or
8
+ # mark up for structure.
9
+ #
10
+ # The default subject from the carrier if the user does
11
+ # not provide one is "Multimedia message"
12
+
13
+ class MMS2R::MyCingularMedia < MMS2R::Media
14
+ end
15
+ end
@@ -1,10 +1,16 @@
1
- require 'mms2r'
2
- require 'mms2r/media'
3
-
4
1
  module MMS2R
5
2
 
6
3
  ##
7
4
  # Nextel version of MMS2R::Media
5
+ #
6
+ # Typically these messages have two multiparts, one is the
7
+ # image attached to the MMS and the other is a multipart
8
+ # alternative. The alternative has text and html alternative
9
+ # parts announcing the fact that its a MMS message from
10
+ # Sprint Nextel and these parts can be ignored.
11
+ #
12
+ # The default subject on these messages from the carrier
13
+ # is the name of the image or video attached to the message.
8
14
 
9
15
  class MMS2R::NextelMedia < MMS2R::Media
10
16
  end
@@ -1,52 +1,160 @@
1
1
  require 'net/http'
2
2
  require 'rubygems'
3
3
  require 'hpricot'
4
- require 'mms2r'
5
- require 'mms2r/media'
6
4
 
7
5
  module MMS2R
8
6
 
9
7
  ##
10
8
  # Sprint version of MMS2R::Media
9
+ #
10
+ # Sprint is an annoying carrier because they think they
11
+ # are so important that they don't actually transmit
12
+ # user generated content (like images or videos) directly
13
+ # in the MMS message. Instead, what they do is hijack the
14
+ # media that is sent from the cellular subscriber and place
15
+ # that content on a content server. In place of the media
16
+ # the recipient receives a HTML part telling the recipient
17
+ # how great Sprint is with links back to their content server.
18
+ # Then the recipient has to click through Sprint more pages
19
+ # to view the content.
20
+ #
21
+ # The default subject on these messages from the
22
+ # carrier is "You have new Picture Mail!"
11
23
 
12
24
  class MMS2R::SprintMedia < MMS2R::Media
13
25
 
14
26
  ##
15
- # MMS2R::SprintMedia has to override process_media because Sprint
16
- # doesn't attach media (images, video, etc.) to it MMS. Media such
27
+ # MMS2R::SprintMedia has to override process() because Sprint
28
+ # doesn't attach media (images, video, etc.) to its MMS. Media such
17
29
  # as images and videos are hosted on a Sprint content server.
18
30
  # MMS2R::SprintMedia has to pick apart an HTML attachment to find
19
- # the URL to the media on Sprint's content server.
20
-
21
- def process_media(part)
22
- if self.class.part_type?(part).eql?('text/plain')
23
- file_name = filename?(part)
24
- type, content = transform_text(part)
25
- elsif self.class.part_type?(part).eql?('text/html')
26
- doc = Hpricot(part.body)
27
- trs = doc.search("/html/body//tr")
28
- imgs = doc.search("/html/body//img")
29
- img = imgs[2].attributes['src']
30
- #here's where the content is, now download it
31
- url = URI.parse(img)
31
+ # the URL to the media on Sprint's content server and download
32
+ # each piece of content. Any text message part of the MMS
33
+ # if it exists is embedded in the html.
34
+
35
+ def process
36
+ @logger.info("#{self.class} processing") unless @logger.nil?
37
+ #sprint MMS are multipart
38
+ parts = @mail.parts
39
+
40
+ #find the payload html
41
+ doc = nil
42
+ parts.each do |p|
43
+ next unless self.class.part_type?(p).eql?('text/html')
44
+ d = Hpricot(p.body)
45
+ title = d.at('title').inner_html
46
+ doc = d if title =~ /You have new Picture Mail!/
47
+ end
48
+ return if doc.nil? #it was a dud
49
+
50
+ # break it down
51
+ sprint_phone_number(doc)
52
+ sprint_process_text(doc)
53
+ sprint_process_media(doc)
54
+
55
+ end
56
+
57
+ private
58
+
59
+ ##
60
+ # Digs out where Sprint hides the phone number
61
+
62
+ def sprint_phone_number(doc)
63
+ c = doc.search("/html/head/comment//").last
64
+ t = c.content.gsub(/\s+/m," ").strip
65
+ #@number returned in parent's get_number
66
+ @number = / name=&quot;MDN&quot;&gt;(\d+)&lt;/.match(t)[1]
67
+ end
68
+
69
+ ##
70
+ # pulls out the user text form the MMS and adds the text
71
+ # to media hash
72
+
73
+ def sprint_process_text(doc)
74
+ # there is at least one <pre> with MMS text if text has been included by
75
+ # the user. (note) we'll have to verify that if they attach multiple texts
76
+ # to the MMS then Sprint stacks it up in multiple <pre>'s. The only <pre>
77
+ # tag in the document is for text from the user.
78
+ doc.search("/html/body//pre").each do |pre|
79
+ type = 'text/plain'
80
+ text = pre.inner_html.strip
81
+ next if text.size == 0
82
+ type, text = transform_text(type, text)
83
+ type, file = sprint_write_file(type, text.strip)
84
+ add_file(type, file) unless type.nil? || file.nil?
85
+ end
86
+ end
87
+
88
+ ##
89
+ # Fetch all the media that is referred to in the doc
90
+
91
+ def sprint_process_media(doc)
92
+ srcs = Array.new
93
+ # collect all the images in the document, even though
94
+ # they are <img> tag some might actually refer to video.
95
+ # To know the link refers to vide one must look at the
96
+ # content type on the http GET response.
97
+ imgs = doc.search("/html/body//img")
98
+ imgs.each do |i|
99
+ src = i.attributes['src']
100
+ # we don't want to double fetch content and we only
101
+ # want to fetch media from the content server, you get
102
+ # a clue about that as there is a RECIPIENT in the URI path
103
+ # of real content
104
+ next unless /mmps\/RECIPIENT\//.match(src)
105
+ next if srcs.detect{|s| s.eql?(src)}
106
+ srcs << src
107
+ end
108
+
109
+ #we've got the payload now, go fetch them
110
+ cnt = 0
111
+ srcs.each do |src|
32
112
  begin
33
- res = Net::HTTP.get_response(url)
34
- res.value
35
- file_name ="#{img.match(/\/RECIPIENT\/([^\/]+)\//)[1]}.#{self.class.default_ext(res.content_type)}"
36
- type = res.content_type
37
- content = res.body
113
+ url = URI.parse(src)
114
+ #res = Net::HTTP.get_response(url)
115
+ #lets be vanilla stealth
116
+ agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)"
117
+ res = Net::HTTP.start(url.host, url.port) do |http|
118
+ req = Net::HTTP::Get.new(url.request_uri, {'User-Agent' => agent})
119
+ http.request(req)
120
+ end
38
121
  rescue
39
122
  @logger.error("#{self.class} processing error, #{$!}") unless @logger.nil?
123
+ next
40
124
  end
125
+
126
+ # setup the file path and file
127
+ base = /\/RECIPIENT\/([^\/]+)\//.match(src)[1]
128
+ type = res.content_type
129
+ file_name = "#{base}-#{cnt}.#{self.class.default_ext(type)}"
130
+ file = File.join(msg_tmp_dir(),File.basename(file_name))
131
+
132
+ # write it and add it to the media hash
133
+ type, file = sprint_write_file(type, res.body, file)
134
+ add_file(type, file) unless type.nil? || file.nil?
135
+ cnt = cnt + 1
41
136
  end
42
- unless type.nil?
43
- file = File.join(msg_tmp_dir(),file_name)
44
- @logger.info("#{self.class} writing file #{file}") unless @logger.nil?
45
- File.open(file,'w'){ |f|
46
- f.write(content)
47
- }
48
- end
137
+
138
+ end
139
+
140
+ ##
141
+ # Creates a temporary file based on the type
142
+
143
+ def sprint_temp_file(type)
144
+ file_name = "#{Time.now.to_f}.#{self.class.default_ext(type)}"
145
+ File.join(msg_tmp_dir(),File.basename(file_name))
146
+ end
147
+
148
+ ##
149
+ # Writes the content to a file and returns the type, file as a tuple.
150
+ def sprint_write_file(type, content, file = nil)
151
+ file = sprint_temp_file(type) if file.nil?
152
+ @logger.info("#{self.class} writing file #{file}") unless @logger.nil?
153
+ File.open(file,'w'){ |f|
154
+ f.write(content)
155
+ }
49
156
  return type, file
50
157
  end
158
+
51
159
  end
52
160
  end
@@ -0,0 +1,16 @@
1
+ module MMS2R
2
+
3
+ ##
4
+ # Sprint PCS version of MMS2R::Media
5
+ #
6
+ # This is a SMS message from a Sprint subscriber
7
+ # that is transformed into an MMS so it can leave the
8
+ # Sprint network. Its not a multipart email, its
9
+ # body is the message.
10
+ #
11
+ # The subject of these MMS are always the
12
+ # empty string.
13
+
14
+ class MMS2R::SprintPcsMedia < MMS2R::Media
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ module MMS2R
2
+
3
+ ##
4
+ # T-Mobile version of MMS2R::Media
5
+ #
6
+ # T-Mobile MMS have the user's content in them as
7
+ # a multipart but they also frame that content in
8
+ # a HTML document. They also attach a number of small
9
+ # images with the MMS that are used in the HTML so that
10
+ # if an email reader is used to view the message then
11
+ # the message is framed nicely by pretty T-Mobile
12
+ # logos. MMS2R throws out all that junk and leaves the
13
+ # the user generated content.
14
+ #
15
+ # The default subject of the MMS from the carrier
16
+ # is the empty string if the user did not set
17
+ # the subject explicitly.
18
+
19
+ class MMS2R::TMobileMedia < MMS2R::Media
20
+ end
21
+ end
@@ -1,10 +1,18 @@
1
- require 'mms2r'
2
- require 'mms2r/media'
3
-
4
1
  module MMS2R
5
2
 
6
3
  ##
7
4
  # Verizon version of MMS2R::Media
5
+ #
6
+ # Typically there are two parts to a Verizon MMS
7
+ # if its just for a image for example. The first part
8
+ # is text with a message that says the MMS is being
9
+ # sent from a Verizon subscriber. If the MMS also
10
+ # contains a user generated message then that will be
11
+ # at the top of the text greeting from Verizon. The
12
+ # part of the MMS is the media itself.
13
+ #
14
+ # The default subject on these MMS is the empty
15
+ # string if the user has not already specified one.
8
16
 
9
17
  class MMS2R::VerizonMedia < MMS2R::Media
10
18
  end
@@ -0,0 +1,16 @@
1
+ module MMS2R
2
+
3
+ ##
4
+ # Verizon/Vtext version of MMS2R::Media
5
+ #
6
+ # Vtext is a SMS message from a Verizon subscriber
7
+ # that is transformed into an MMS so it can leave the
8
+ # Verizon network. Its not a multipart email, its
9
+ # body is the message.
10
+ #
11
+ # The subject of the message is the same as the body
12
+ # of the message.
13
+
14
+ class MMS2R::VtextMedia < MMS2R::Media
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ From: 2068675309@cingularme.com
2
+ To: tommytutone@example.com
3
+ Subject:
4
+ X-OPWV-Extra-Message-Type: MO
5
+ Message-Id: <01234567890123.ZZCD4567.foobar01.cingularme.com@cingularme.com>
6
+ Date: Wed, 7 Feb 2007 00:39:36 -0500
7
+
8
+ hello world
9
+ foo bar
10
+
11
+ --
12
+ ===============================================
13
+ Brought to you by, Cingular Wireless Messaging
14
+ http://www.CingularMe.COM/
@@ -0,0 +1,6 @@
1
+ From:2068675309@mms.example.com
2
+ To:tommytutone@example.com
3
+ Subject: text only
4
+ Message-Id: <00000000000001.0123456789@mx.mms.example.com>
5
+ Date: Wed, 10 Jan 2007 08:18:30 -0600 (CST)
6
+
@@ -13,5 +13,12 @@ Content-Location: hello_world.txt
13
13
  Content-Disposition: inline
14
14
 
15
15
  aGVsbG8gd29ybGQ=
16
+ ------=_Part_1061064_5544954.1168500502466
17
+ Content-Type: application/smil;Charset=UTF-8;Name=mms.smil.txt
18
+ content-location: mms.smil.txt
19
+ content-id: <mms.smil.txt>
20
+ Content-Transfer-Encoding: 7bit
21
+
22
+ Water
16
23
  ------=_Part_1061064_5544954.1168500502466--
17
24
 
@@ -0,0 +1,49 @@
1
+ X-Priority: 3
2
+ Importance: Normal
3
+ From: 2068675309@examle.com
4
+ To: tommytutone@example.com
5
+ Subject:
6
+ Message-ID: <012345678901AAAAAF@-89012333336789012111>
7
+ Date: Tue, 2 Jan 2007 13:22:45 -0600
8
+ MIME-Version: 1.0
9
+ Content-Type: multipart/mixed;
10
+ type="application/smil";
11
+ boundary="__CONTENT_01234_PART_BOUNDARY__01234567__"
12
+
13
+ --__CONTENT_01234_PART_BOUNDARY__01234567__
14
+ content-type: text/plain
15
+ Content-Location: small.txt
16
+
17
+ small
18
+
19
+ --__CONTENT_01234_PART_BOUNDARY__01234567__
20
+ Content-Type: text/plain; charset=utf-8
21
+ Content-Transfer-Encoding: base64
22
+ Content-Location: big.txt
23
+ Content-Disposition: inline
24
+
25
+ dGhpcyBzaG91bGQgYmUgYmlnZ2VyIHRleHQ=
26
+
27
+ --__CONTENT_01234_PART_BOUNDARY__01234567__
28
+ Content-Type: image/gif; name=small.gif
29
+ Content-Transfer-Encoding: base64
30
+ Content-Disposition: attachment; filename=small.gif
31
+ Content-ID: <small.gif>
32
+
33
+ R0lGODlhAQABAIAAAP///wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==
34
+
35
+ --__CONTENT_01234_PART_BOUNDARY__01234567__
36
+ Content-Type: image/jpeg;
37
+ name="big.jpg"
38
+ Content-Location: big.jpg
39
+ Content-Transfer-Encoding: base64
40
+
41
+ /9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAAD//gAXQ3JlYXRl
42
+ ZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxER
43
+ ExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4e
44
+ Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAAQAB
45
+ AwEiAAIRAQMRAf/EABUAAQEAAAAAAAAAAAAAAAAAAAAH/8QAFBABAAAAAAAAAAAAAAAAAAAA
46
+ AP/EABUBAQEAAAAAAAAAAAAAAAAAAAcI/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQAC
47
+ EQMRAD8AlgA6WW//2Q==
48
+ --__CONTENT_01234_PART_BOUNDARY__01234567__--
49
+
@@ -81,7 +81,7 @@ Content-Transfer-Encoding: 7bit
81
81
  <table border="0" bgcolor="#ffffff" cellpadding="0" cellspacing="7" style="table-layout:fixed">
82
82
  <tr>
83
83
  <td align="center">
84
- <img src="http://localhost:99163/brokenimage/RECIPIENT/000_0123a01234567890_1/2?inviteToken=helloworld0123456789&amp;limitsize=258,258&amp;outquality=90&amp;squareoutput=255,255,255&amp;ext=.jpg&amp;iconifyVideo=true&amp;wm=1"/>
84
+ <img src="http://localhost:99163/mmps/RECIPIENT/000_0123a01234567890_1/2?inviteToken=helloworld0123456789&amp;limitsize=258,258&amp;outquality=90&amp;squareoutput=255,255,255&amp;ext=.jpg&amp;iconifyVideo=true&amp;wm=1&amp;HACK=BROKEN"/>
85
85
  </td>
86
86
  </tr>
87
87
  </table>
@@ -81,7 +81,7 @@ Content-Transfer-Encoding: 7bit
81
81
  <table border="0" bgcolor="#ffffff" cellpadding="0" cellspacing="7" style="table-layout:fixed">
82
82
  <tr>
83
83
  <td align="center">
84
- <img src="http://localhost:99163/simpleimage/RECIPIENT/000_0123a01234567890_1/2?inviteToken=helloworld0123456789&amp;limitsize=258,258&amp;outquality=90&amp;squareoutput=255,255,255&amp;ext=.jpg&amp;iconifyVideo=true&amp;wm=1"/>
84
+ <img src="http://localhost:99163/mmps/RECIPIENT/000_0123a01234567890_1/2?inviteToken=helloworld0123456789&amp;limitsize=258,258&amp;outquality=90&amp;squareoutput=255,255,255&amp;ext=.jpg&amp;iconifyVideo=true&amp;wm=1&amp;HACK=IMAGE"/>
85
85
  </td>
86
86
  </tr>
87
87
  </table>
@@ -0,0 +1,8 @@
1
+ From:2068675309@messaging.sprintpcs.com
2
+ To:tommytutone@example.com
3
+ Subject:
4
+ X-OPWV-Extra-Message-Type:MO
5
+ Message-Id: <01234567890123.01234ABCDE@mx.messaging.sprintpcs.com>
6
+ Date: Wed, 15 Jan 2007 10:26:08 -0600 (CST)
7
+
8
+ hello world
@@ -1,8 +1,195 @@
1
- From:2068675309@messaging.sprintpcs.com
2
- To:tommytutone@example.com
3
- Subject:
4
- X-OPWV-Extra-Message-Type:MO
5
- Message-Id: <01234567890123.01234ABCDE@mx.messaging.sprintpcs.com>
6
- Date: Wed, 15 Jan 2007 10:26:08 -0600 (CST)
7
-
8
- hello world
1
+ Message-ID: <01234567.9876543210987.JdsafdsaMail.jkdos@adfsalal09>
2
+ From: "someuser@pm.sprint.com" <someuser@pm.sprint.com>
3
+ To: tommytutone@example.com
4
+ Subject: You have new Picture Mail!
5
+ MIME-Version: 1.0
6
+ Content-Type: multipart/alternative;
7
+ boundary="----=_Part_012345_67890123.4567890123456"
8
+ X-Priority: 3
9
+ X-MSMail-Priority: Normal
10
+ Importance: Normal
11
+
12
+ ------=_Part_012345_67890123.4567890123456
13
+ Content-Type: text/plain; charset=us-ascii
14
+ Content-Transfer-Encoding: 7bit
15
+
16
+ You have new Picture Mail!
17
+
18
+ Click Go/View to see now.
19
+ http://pictures.sprintpcs.com/?mivt=helloworld0123456789&shareName=MMS
20
+
21
+ _abcedef
22
+
23
+
24
+ ------=_Part_012345_67890123.4567890123456
25
+ Content-Type: text/html
26
+ Content-Transfer-Encoding: 7bit
27
+
28
+ <html>
29
+ <head><title>You have new Picture Mail!</title>
30
+ <!-- lsPictureMail-Share-helloworld0123456789-comment
31
+ &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF&#45;8&quot;?&gt;
32
+ &lt;shareMessage&gt;
33
+ &lt;messageContents type=&quot;PICTURE&quot;&gt;
34
+ &lt;messageText&gt;&lt;/messageText&gt;
35
+ &lt;mediaItems&gt;
36
+ &lt;mediaItem id=&quot;1&quot;&gt;
37
+ &lt;title&gt;&lt;/title&gt;
38
+ &amp;lt;url&amp;gt;http://pictures.sprintpcs.com/getMMBOXMessageMedia?id=Xw1004H8sLv6S3x76lVPYvc9HWuygho0mqG1a5IEKWLR8s8O0GEqXAmk5gW%2FZUWGqyw0fwJJvr7U%0AtWtQs5%2FZA7tmYNq7KKkBMqlL64JVNH%2BGkNKbb8WqPL%2FsrHZdYUVet3SRzN1GfrfUo%2BpWfjCBBg%3D%3D%0A&amp;lt;/url&amp;gt;
39
+
40
+ &lt;urlExpiration&gt;2007&#45;03&#45;11T21:14:27Z&lt;/urlExpiration&gt;
41
+ &lt;/mediaItem&gt;
42
+ &lt;/mediaItems&gt;
43
+ &lt;/messageContents&gt;
44
+ &lt;/shareMessage&gt;
45
+
46
+ -->
47
+ <!-- lsPictureMail-UserInfo-helloworld0123456789-comment
48
+ &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF&#45;8&quot;?&gt;
49
+ &lt;UserInfo timestamp=&quot;2007&#45;03&#45;04T21:14:27.96+00:00&quot; originating_from_address=&quot;someuser@pm.sprint.com&quot;&gt;&lt;credential name=&quot;MDN&quot;&gt;2068509247&lt;/credential&gt;&lt;/UserInfo&gt;
50
+ -->
51
+ </head>
52
+ <body marginheight="0" marginwidth="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
53
+ <table border="0" width="100%" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" >
54
+ <tr>
55
+ <td VALIGN="top" colspan="2" width="100%">
56
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#FFE100">
57
+ <tr>
58
+ <td><a href="http://www.sprintpcs.com"><img src="http://pictures.sprintpcs.com/retailers/PCSNEXTEL/images/logos/togetherWithNextel.gif" alt="" border="0" /></a></td>
59
+ </tr>
60
+ </table>
61
+ </td>
62
+ </tr>
63
+ <tr>
64
+ <td VALIGN="top" colspan="2">
65
+ <table border="0" cellpadding="0" cellspacing="0" width="590" bgcolor="#FFFFFF">
66
+ <tr>
67
+ <td><br/><p><img src="http://pictures.sprintpcs.com/images/x.gif" border="0" width="10"/><font face="trebuchet ms, Helvetica, Arial, Verdana" size="2"><b>You have a Picture Mail from someuser@pm.sprint.com</b></font><br/><br/></p></td>
68
+ </tr>
69
+ </table>
70
+ </td>
71
+ </tr>
72
+ <tr>
73
+ <td colspan="2">
74
+ <table border="0" width="590" cellpadding="0" cellspacing="0">
75
+ <tr>
76
+ <td width="10">&nbsp;</td>
77
+ <td width="280" valign="top">
78
+ <table border="0" cellpadding="0" style="border:1px solid #9C9A9C;">
79
+ <tr>
80
+ <td>
81
+ <table border="0" bgcolor="#ffffff" cellpadding="0" cellspacing="7" style="table-layout:fixed">
82
+ <tr>
83
+ <td align="center">
84
+ <img src="http://pictures.sprintpcs.com/{SHARE_ICON_URI}&amp;limitsize=258,258&amp;outquality=90&amp;squareoutput=255,255,255&amp;ext=.jpg&amp;iconifyVideo=true&amp;wm=1"/>
85
+ </td>
86
+ </tr>
87
+ </table>
88
+ </td>
89
+ </tr>
90
+ </table>
91
+ </td>
92
+ <td width="20">&nbsp;</td>
93
+ <td VALIGN="top" align="right" width="280">
94
+ <table border="0" cellpadding="0" cellspacing="0" width="280" style="table-layout:fixed">
95
+ <tr>
96
+ <td><p><font face="trebuchet ms, Helvetica, Arial, Verdana" size="2"><b>Message:</b></font></p></td>
97
+ </tr>
98
+ <tr>
99
+ <td><pre style="overflow:auto; font:normal 10pt trebuchet ms; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">Tea Pot</pre></td>
100
+ </tr>
101
+ <tr>
102
+ <td><img src="http://pictures.sprintpcs.com/images/x.gif" border="0" height="15"/></td>
103
+ </tr>
104
+ <tr>
105
+ <td width="280">
106
+ <div style="padding-left:10px; padding-top:4px; padding-bottom:4px; color:white; background-color:#59639C; font: bold 10pt trebuchet ms" width="280">
107
+ Options
108
+ </div>
109
+ <div style="padding:10px; background-color:#f1f1f1; font: normal 10pt trebuchet ms" width="280">
110
+ <a target="_blank" style="color: #148AB2;" href="http://pictures.sprintpcs.com/share.do?invite=helloworld0123456789&amp;shareName=MMS&amp;messageState=RETRIEVED">View Picture</a><br/>
111
+ <a target="_blank" style="color: #148AB2;" href="http://pictures.sprintpcs.com/share.do?invite=helloworld0123456789&amp;shareName=PRINT">Order Prints and Gifts</a><br/>
112
+ <a target="_blank" style="color: #148AB2;" href="http://pictures.sprintpcs.com/share.do?invite=helloworld0123456789&amp;shareName=REPLY">Reply to Sender</a><br/>
113
+ <a target="_blank" style="color: #148AB2;" href="http://pictures.sprintpcs.com/share.do?invite=helloworld0123456789&amp;shareName=REPLYTOALL">Reply to All</a><br/>
114
+ <a target="_blank" style="color: #148AB2;" href="http://pictures.sprintpcs.com/share.do?invite=helloworld0123456789&amp;shareName=FORWARD">Forward</a><br/><br/>
115
+ Send and receive Pictures and Videos through Picture Mail<sup>SM</sup>. For more information go to <a target="_blank" style="color: #148AB2;" href="http://www.sprint.com/picturemail">www.sprint.com/picturemail.</a>
116
+ </div>
117
+ </td>
118
+ </tr>
119
+ </table>
120
+ </td>
121
+ </tr>
122
+ </table>
123
+ </td>
124
+ </tr>
125
+ <tr>
126
+ <td colspan="2">
127
+ <img src="http://pictures.sprintpcs.com/images/x.gif" width="5" height="15"/>
128
+ </td>
129
+ </tr>
130
+ <tr>
131
+ <td align="left" colspan="2" width="590">
132
+ <table cellpadding="0" cellspacing="0" align="left" bgcolor="#FFFFFF">
133
+ <tr>
134
+ <td width="10">&nbsp;</td>
135
+ <td width="580">
136
+ <table cellpadding="0" cellspacing="0" align="center" border="0" bgcolor="#FFFFFF">
137
+ <tr>
138
+ <!-- AdJuggler 5.0 request
139
+ Ad Spot: email_picture-mail-invitation_1_120x85
140
+ Channel: Undefined
141
+ Ad Dimension: 120x85
142
+ Category: Undefined
143
+ Sub-category: Undefined
144
+ -->
145
+ <td width="120"><a href="http://banners.pictures.sprintpcs.com/servlet/ajrotator/361/0/clickCGI?zone=1"><img src="http://banners.pictures.sprintpcs.com/servlet/ajrotator/361/0/viewCGI?zone=1&amp;dim=135" border="0"/></a></td>
146
+ <td width="30"></td>
147
+ <!-- AdJuggler 5.0 request
148
+ Ad Spot: email_picture-mail-invitation_2_120x85
149
+ Channel: Undefined
150
+ Ad Dimension: 120x85
151
+ Category: Undefined
152
+ Sub-category: Undefined
153
+ -->
154
+ <td width="120"><a href="http://banners.pictures.sprintpcs.com/servlet/ajrotator/362/0/clickCGI?zone=1"><img src="http://banners.pictures.sprintpcs.com/servlet/ajrotator/362/0/viewCGI?zone=1&amp;dim=135" border="0"/></a></td>
155
+ <td width="30"></td>
156
+ <!-- AdJuggler 5.0 request
157
+ Ad Spot: email_picture-mail-invitation_3_120x85
158
+ Channel: Undefined
159
+ Ad Dimension: 120x85
160
+ Category: Undefined
161
+ Sub-category: Undefined
162
+ -->
163
+ <td width="120"><a href="http://banners.pictures.sprintpcs.com/servlet/ajrotator/363/0/clickCGI?zone=1"><img src="http://banners.pictures.sprintpcs.com/servlet/ajrotator/363/0/viewCGI?zone=1&amp;dim=135" border="0"/></a></td>
164
+ </tr>
165
+ </table>
166
+ </td>
167
+ </tr>
168
+ </table>
169
+ </td>
170
+ </tr>
171
+ <tr>
172
+ <td VALIGN="top" colspan="2" width="590">
173
+ <img src="http://pictures.sprintpcs.com/images/x.gif" height="5"/>
174
+ </td>
175
+ </tr>
176
+ <tr>
177
+ <td VALIGN="top" colspan="2" width="100%">
178
+ <table width="100%" border="0" cellspacing="0" cellpadding="0">
179
+ <tr>
180
+ <td bgcolor="#f1f1f1" align="left"><img src="http://pictures.sprintpcs.com/images/x.gif" border="0" width="385" height="15"/><span style="font-family:trebuchet ms, Helvetica, Arial, Verdana; Font-size: 11px; Color: #000000">&#169; 2007 Sprint Nextel. All rights reserved.</span></td>
181
+ </tr>
182
+ <tr>
183
+ <td bgcolor="#f1f1f1" width="100%"><img src="http://pictures.sprintpcs.com/images/x.gif" border="0" width="20" height="5"/><a href="http://www.verisign.com"><img src="http://pictures.sprintpcs.com/retailers/PCSNEXTEL/images/logos/verisign.jpg" alt="VeriSign's Home Page" border="0" /></a></td>
184
+ </tr>
185
+ <tr>
186
+ <td bgcolor="#f1f1f1" width="100%"><img src="http://pictures.sprintpcs.com/images/x.gif" border="0" height="10"/></td>
187
+ </tr>
188
+ </table>
189
+ </td>
190
+ </tr>
191
+ </table>
192
+ </body>
193
+ </html><!-- picture_mail_arrived -->
194
+
195
+ ------=_Part_012345_67890123.4567890123456--