mms2r 1.0.7 → 1.1.0

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.
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--