vmail 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/.gitignore +3 -0
  2. data/NOTES +7 -2
  3. data/README.markdown +310 -72
  4. data/lib/vmail.rb +8 -0
  5. data/lib/vmail.vim +53 -21
  6. data/lib/vmail/imap_client.rb +19 -4
  7. data/lib/vmail/message_formatter.rb +32 -11
  8. data/lib/vmail/options.rb +14 -13
  9. data/lib/vmail/version.rb +1 -1
  10. data/test/fixtures/rfc_part.eml +306 -0
  11. data/test/message_formatter_test.rb +12 -1
  12. data/vmail.gemspec +3 -3
  13. data/website/.gitignore +1 -0
  14. data/website/bottom.markdown +20 -0
  15. data/website/gen.rb +22 -0
  16. data/website/images-vmail/1-small.png +0 -0
  17. data/website/images-vmail/1.png +0 -0
  18. data/website/images-vmail/attach-small.png +0 -0
  19. data/website/images-vmail/attach.png +0 -0
  20. data/website/images-vmail/autocomplete-small.png +0 -0
  21. data/website/images-vmail/autocomplete.png +0 -0
  22. data/website/lightbox2/css/lightbox.css +27 -0
  23. data/website/lightbox2/images/bullet.gif +0 -0
  24. data/website/lightbox2/images/close.gif +0 -0
  25. data/website/lightbox2/images/closelabel.gif +0 -0
  26. data/website/lightbox2/images/donate-button.gif +0 -0
  27. data/website/lightbox2/images/download-icon.gif +0 -0
  28. data/website/lightbox2/images/image-1.jpg +0 -0
  29. data/website/lightbox2/images/loading.gif +0 -0
  30. data/website/lightbox2/images/nextlabel.gif +0 -0
  31. data/website/lightbox2/images/prevlabel.gif +0 -0
  32. data/website/lightbox2/images/thumb-1.jpg +0 -0
  33. data/website/lightbox2/index.html +63 -0
  34. data/website/lightbox2/js/builder.js +136 -0
  35. data/website/lightbox2/js/effects.js +1122 -0
  36. data/website/lightbox2/js/lightbox.js +498 -0
  37. data/website/lightbox2/js/prototype.js +4221 -0
  38. data/website/lightbox2/js/scriptaculous.js +58 -0
  39. data/website/stylesheets-vmail/960.css +1 -0
  40. data/website/stylesheets-vmail/reset.css +1 -0
  41. data/website/stylesheets-vmail/site.css +59 -0
  42. data/website/stylesheets-vmail/syntax-colors.css +33 -0
  43. data/website/stylesheets-vmail/text.css +1 -0
  44. data/website/top.markdown +9 -0
  45. data/website/vmail-template.html +50 -0
  46. data/website/vmail.html +438 -0
  47. metadata +48 -10
  48. data/gmail.vim +0 -180
  49. data/wrapper.rb +0 -8
@@ -1,5 +1,6 @@
1
1
  let s:mailbox = $VMAIL_MAILBOX
2
2
  let s:query = $VMAIL_QUERY
3
+ let s:browser_command = $VMAIL_BROWSER
3
4
  let s:append_file = ''
4
5
 
5
6
  let s:drb_uri = $DRB_URI
@@ -23,7 +24,7 @@ let s:forward_template_command = s:client_script . "forward_template "
23
24
  let s:deliver_command = s:client_script . "deliver "
24
25
  let s:save_draft_command = s:client_script . "save_draft "
25
26
  let s:save_attachments_command = s:client_script . "save_attachments "
26
- let s:open_html_command = s:client_script . "open_html_part "
27
+ let s:open_html_part_command = s:client_script . "open_html_part "
27
28
  let s:message_bufname = "MessageWindow"
28
29
 
29
30
  function! VmailStatusLine()
@@ -141,7 +142,6 @@ function! s:show_raw()
141
142
  setlocal nomodifiable
142
143
  endfunction
143
144
 
144
-
145
145
  function! s:focus_list_window()
146
146
  let winnr = bufwinnr(s:listbufnr)
147
147
  if winnr == -1
@@ -155,10 +155,10 @@ function! s:focus_list_window()
155
155
  if has("syntax")
156
156
  syn clear
157
157
  syn match BufferFlagged /^.*[*].*$/hs=s
158
- hi def BufferFlagged ctermfg=red ctermbg=black
158
+ hi def BufferFlagged ctermfg=red
159
159
  endif
160
160
  " vertically center the cursor line
161
- normal z.
161
+ " normal z.
162
162
  call feedkeys("\<c-l>") " prevents screen artifacts when user presses return too fast
163
163
  endfunction
164
164
 
@@ -256,6 +256,8 @@ func! s:delete_messages(flag) range
256
256
  if len(uids) > 2
257
257
  call feedkeys("\<cr>")
258
258
  endif
259
+ call s:focus_message_window()
260
+ close
259
261
  redraw
260
262
  echo len(uids) . " message" . (len(uids) == 1 ? '' : 's') . " marked " . a:flag
261
263
  endfunc
@@ -278,11 +280,12 @@ func! s:archive_messages() range
278
280
  exec a:firstline . "," . a:lastline . "delete"
279
281
  setlocal nomodifiable
280
282
  write
283
+ call s:focus_message_window()
284
+ close
281
285
  redraw
282
286
  echo len(uids) . " message" . (len(uids) == 1 ? '' : 's') . " archived"
283
287
  endfunc
284
288
 
285
-
286
289
  " --------------------------------------------------------------------------------
287
290
  " append text bodies of a set of messages to a file
288
291
  func! s:append_messages_to_file() range
@@ -445,6 +448,10 @@ function! s:select_mailbox()
445
448
  close
446
449
  call s:focus_message_window()
447
450
  close
451
+ " check if mailbox is a real mailbox
452
+ if (index(s:mailboxes, mailbox) == -1)
453
+ return
454
+ endif
448
455
  let s:mailbox = mailbox
449
456
  let command = s:select_mailbox_command . shellescape(s:mailbox)
450
457
  call system(command)
@@ -581,8 +588,12 @@ function! CompleteContact(findstart, base)
581
588
  endwhile
582
589
  return start
583
590
  else
584
- " find contacts matching with "a:base"
585
- let matches = system("grep -i " . shellescape(a:base) . " " . $VMAIL_CONTACTS_FILE)
591
+ " find contacts
592
+ " model regex: match at beginning of line, or inside < > wrapping
593
+ " email addr
594
+ " '\(^ho\|<ho\)'
595
+ let regex = shellescape('\(^' . a:base . '\|<' . a:base . '\)')
596
+ let matches = system("grep -i " . regex . " " . $VMAIL_CONTACTS_FILE)
586
597
  return split(matches, "\n")
587
598
  endif
588
599
  endfun
@@ -599,6 +610,7 @@ function! s:send_message()
599
610
  call system(s:deliver_command, mail)
600
611
  redraw
601
612
  echo "sent! press q to go back to message list"
613
+ redraw
602
614
  endfunction
603
615
 
604
616
  func! s:save_draft()
@@ -616,10 +628,11 @@ endfunc
616
628
 
617
629
  " call from inside message window with <Leader>h
618
630
  func! s:open_html_part()
619
- let command = s:open_html_command . s:current_uid
631
+ let command = s:open_html_part_command . s:current_uid
632
+ " the command saves the html part to a local file
620
633
  let outfile = system(command)
621
634
  " todo: allow user to change open in browser command?
622
- exec "!open " . outfile
635
+ exec "!" . s:browser_command . ' ' . outfile
623
636
  endfunc
624
637
 
625
638
  func! s:save_attachments()
@@ -633,15 +646,19 @@ func! s:save_attachments()
633
646
  endfunc
634
647
  " --------------------------------------------------------------------------------
635
648
 
636
- func! s:toggle_fullscreen()
649
+ func! s:maximize_window()
637
650
  if winnr('$') > 1
638
651
  only
639
- normal z.
640
- else
641
- call feedkeys("\<cr>")
652
+ " normal z.
642
653
  endif
643
654
  endfunc
644
655
 
656
+ func! s:open_href()
657
+ call search("http:", 'c')
658
+ let href = matchstr(getline(line('.')), 'http\S\+')
659
+ let command = "!" . s:browser_command . ' ' . shellescape(href)
660
+ exec command
661
+ endfunc
645
662
 
646
663
  " --------------------------------------------------------------------------------
647
664
  " MAPPINGS
@@ -653,8 +670,6 @@ func! s:message_window_mappings()
653
670
  noremap <silent> <buffer> <Leader>R :call <SID>show_raw()<cr>
654
671
  noremap <silent> <buffer> <Leader>R :call <SID>show_raw()<cr>
655
672
  noremap <silent> <buffer> <Leader>f :call <SID>compose_forward()<CR><cr>
656
- " TODO improve this
657
- noremap <silent> <buffer> <Leader>o yE :!open '<C-R>"'<CR><CR>
658
673
  noremap <silent> <buffer> <c-j> :call <SID>show_next_message()<CR>
659
674
  noremap <silent> <buffer> <c-k> :call <SID>show_previous_message()<CR>
660
675
  nmap <silent> <buffer> <leader>j <c-j>
@@ -662,8 +677,12 @@ func! s:message_window_mappings()
662
677
  noremap <silent> <buffer> <Leader>c :call <SID>compose_message()<CR>
663
678
  noremap <silent> <buffer> <Leader>h :call <SID>open_html_part()<CR><cr>
664
679
  nnoremap <silent> <buffer> q :close<cr>
680
+
665
681
  nnoremap <silent> <buffer> <leader># :call <SID>focus_list_window()<cr>:call <SID>delete_messages("Deleted")<cr>
682
+ nmap <silent> <buffer> <leader>d <leader>#
666
683
  nnoremap <silent> <buffer> <leader>* :call <SID>focus_list_window()<cr>:call <SID>toggle_star()<cr>
684
+ nmap <silent> <buffer> s <leader>*
685
+
667
686
  nnoremap <silent> <buffer> <Leader>b :call <SID>focus_list_window()<cr>call <SID>move_to_mailbox(0)<CR>
668
687
  nnoremap <silent> <buffer> <Leader>B :call <SID>focus_list_window()<cr>call <SID>move_to_mailbox(1)<CR>
669
688
  nnoremap <silent> <buffer> <leader>e :call <SID>focus_list_window()<cr>:call <SID>archive_messages()<cr>
@@ -671,14 +690,18 @@ func! s:message_window_mappings()
671
690
  nnoremap <silent> <buffer> <Leader>m :call <SID>focus_list_window()<cr>:call <SID>mailbox_window()<CR>
672
691
  nnoremap <silent> <buffer> <Leader>A :call <SID>save_attachments()<cr>
673
692
  " go fullscreen
674
- nnoremap <silent> <buffer> <Space> :call <SID>toggle_fullscreen()<cr>
693
+ nnoremap <silent> <buffer> <Space> :call <SID>maximize_window()<cr>
675
694
  endfunc
676
695
 
677
696
  func! s:message_list_window_mappings()
678
697
  noremap <silent> <buffer> <cr> :call <SID>show_message()<CR>
679
698
  noremap <silent> <buffer> q :qal!<cr>
699
+
680
700
  noremap <silent> <buffer> <leader>* :call <SID>toggle_star()<CR>
701
+ nmap <silent> <buffer> s <leader>*
681
702
  noremap <silent> <buffer> <leader># :call <SID>delete_messages("Deleted")<CR>
703
+ nmap <silent> <buffer> <leader>d <leader>#
704
+
682
705
  noremap <silent> <buffer> <leader>! :call <SID>delete_messages("[Gmail]/Spam")<CR>
683
706
  noremap <silent> <buffer> <leader>e :call <SID>archive_messages()<CR>
684
707
  "open a link browser (os x)
@@ -694,18 +717,27 @@ func! s:message_list_window_mappings()
694
717
  noremap <silent> <buffer> <Leader>a :call <SID>show_message()<cr>:call <SID>compose_reply(1)<CR>
695
718
  noremap <silent> <buffer> <c-j> :call <SID>show_next_message_in_list()<cr>
696
719
  noremap <silent> <buffer> <c-k> :call <SID>show_previous_message_in_list()<cr>
697
- nnoremap <silent> <buffer> <Space> :call <SID>toggle_fullscreen()<cr>
720
+ nnoremap <silent> <buffer> <Space> :call <SID>maximize_window()<cr>
698
721
  endfunc
699
722
 
700
723
  func! s:compose_window_mappings()
701
- " NOTE send_message is a global mapping, so user can load a saved
702
- " message from a file and send it
703
- nnoremap <silent> <Leader>vs :call <SID>send_message()<CR>
704
- nnoremap <silent> <buffer> <Leader>vd :call <SID>save_draft()<CR>
705
724
  noremap <silent> <buffer> <leader>q :call <SID>cancel_compose()<cr>
706
725
  nmap <silent> <buffer> q <leader>q
707
726
  endfunc
708
727
 
728
+ func! s:global_mappings()
729
+ " NOTE send_message is a global mapping, so user can load a saved
730
+ " message from a file and send it
731
+ nnoremap <silent> <leader>vs :call <SID>send_message()<CR>
732
+ nnoremap <silent> <leader>vd :call <SID>save_draft()<CR>
733
+ noremap <silent> <leader>o :call <SID>open_href()<cr>
734
+ endfunc
735
+
736
+ "TODO see if using LocalLeader and maplocalleader makes more sense
737
+ let mapleader = ","
738
+
739
+ call s:global_mappings()
740
+
709
741
  call s:create_list_window()
710
742
 
711
743
  call s:create_message_window()
@@ -91,7 +91,15 @@ module Vmail
91
91
  @imap.uid_fetch(uid_set, ["FLAGS", "ENVELOPE", "RFC822.SIZE" ])
92
92
  end
93
93
  log "extracting headers"
94
- lines = results.sort_by {|x| Time.parse(x.attr['ENVELOPE'].date)}.map {|x| format_header(x, max_uid)}
94
+ lines = results.
95
+ sort_by {|x|
96
+ begin
97
+ Time.parse(x.attr['ENVELOPE'].date)
98
+ rescue ArgumentError
99
+ Time.now
100
+ end
101
+ }.
102
+ map {|x| format_header(x, max_uid)}
95
103
  log "returning result"
96
104
  return lines.join("\n")
97
105
  end
@@ -118,7 +126,12 @@ module Vmail
118
126
  total_recips = (envelope.to + envelope.cc).size
119
127
  address += " + #{total_recips - 1}"
120
128
  end
121
- date = Time.parse(envelope.date).localtime
129
+ date = begin
130
+ Time.parse(envelope.date).localtime
131
+ rescue ArgumentError
132
+ Time.now
133
+ end
134
+
122
135
  date_formatted = if date.year != Time.now.year
123
136
  date.strftime "%b %d %Y" rescue envelope.date.to_s
124
137
  else
@@ -239,7 +252,6 @@ module Vmail
239
252
  @current_mail = mail # used later to show raw message or extract attachments if any
240
253
  log "saving current mail with parts: #{@current_mail.parts.inspect}"
241
254
  formatter = Vmail::MessageFormatter.new(mail)
242
- part = formatter.find_text_part
243
255
  out = formatter.process_body
244
256
  size = fetch_data.attr["RFC822.SIZE"]
245
257
  @current_message = <<-EOF
@@ -249,6 +261,9 @@ module Vmail
249
261
 
250
262
  #{out}
251
263
  EOF
264
+ rescue
265
+ log "parsing error"
266
+ "Error encountered parsing this message:\n#{$!}"
252
267
  end
253
268
 
254
269
  def format_parts_info(parts)
@@ -483,7 +498,7 @@ EOF
483
498
  @current_mail.body
484
499
  end
485
500
  return if html_part.nil?
486
- outfile = 'htmlpart.html'
501
+ outfile = 'vmail-htmlpart.html'
487
502
  File.open(outfile, 'w') {|f| f.puts(html_part.decoded)}
488
503
  # client should handle opening the html file
489
504
  return outfile
@@ -25,31 +25,52 @@ module Vmail
25
25
  lines.flatten
26
26
  end
27
27
 
28
- def process_body
29
- part = find_text_part(@mail.parts)
30
- body = if part && part.respond_to?(:header)
31
- if part.header["Content-Type"].to_s =~ /text\/plain/
32
- format_text_body(part)
33
- elsif part.header["Content-Type"].to_s =~ /text\/html/
28
+ def process_body(target = @mail)
29
+ if target.header['Content-Type'].to_s =~ /multipart\/mixed/
30
+ target.parts.map {|part|
31
+ if part.multipart?
32
+ part = find_text_or_html_part(target.parts)
33
+ format_part(part)
34
+ else
35
+ format_part(part)
36
+ end
37
+ }.join("\n#{'-' * 39}\n")
38
+ elsif target.header['Content-Type'].to_s =~ /multipart\/alternative/
39
+ part = find_text_or_html_part(target.parts)
40
+ format_part(part)
41
+ else
42
+ format_part(target)
43
+ end
44
+ end
45
+
46
+ def format_part(part)
47
+ if part && part.respond_to?(:header)
48
+ case part.header["Content-Type"].to_s
49
+ when /text\/html/
34
50
  format_html_body(part)
35
- else
51
+ when /text\/plain/
52
+ format_text_body(part)
53
+ when /message\/rfc/
54
+ m = Mail.new(part.body.decoded)
55
+ process_body(m)
56
+ else # just format_text on it anyway
36
57
  format_text_body(part)
37
58
  end
38
59
  else
39
- "NO BODY"
60
+ "[NO BODY]"
40
61
  end
41
62
  rescue
42
63
  puts $!
43
- body
64
+ "[error:] #{$!}"
44
65
  end
45
66
 
46
- def find_text_part(parts = @mail.parts)
67
+ def find_text_or_html_part(parts = @mail.parts)
47
68
  if parts.empty?
48
69
  return @mail
49
70
  end
50
71
  part = parts.detect {|part| part.multipart?}
51
72
  if part
52
- find_text_part(part.parts)
73
+ find_text_or_html_part(part.parts)
53
74
  else
54
75
  # no multipart part
55
76
  part = parts.detect {|part| (part.header["Content-Type"].to_s =~ /text\/plain/) }
@@ -57,6 +57,8 @@ EOF
57
57
  if @contacts_file.nil?
58
58
  puts "No contacts file found for auto-completion. See help for how to generate it."
59
59
  sleep 0.5
60
+ else
61
+ puts "Using contacts file #{@contacts_file}"
60
62
  end
61
63
 
62
64
  @config = YAML::load(File.read(@config_file))
@@ -96,34 +98,33 @@ EOF
96
98
  INSTRUCTIONS = <<-EOF
97
99
  CONFIGURATION FILE
98
100
 
99
- To run vmail, you need to create a yaml file called .vmailrc and save it
100
- either in the current directory (the directory from which you launch
101
- vmail) or in your home directory.
101
+ To run vmail, create a yaml file called .vmailrc and save it either in the
102
+ current directory (the directory from which you launch vmail) or in your home
103
+ directory.
102
104
 
103
- This file should look like this, except using your settings:
105
+ The .vmailrc file should look something like this. Substitute your own values.
104
106
 
105
107
  username: dhchoi@gmail.com
106
108
  password: password
107
109
  name: Daniel Choi
108
110
  signature: |
109
111
  --
110
- Sent via vmail. https://github.com/danchoi/vmail
112
+ Sent via vmail. http://danielchoi.com/software/vmail.html
111
113
 
112
- This file should be formatted according to the rules of YAML.
114
+ This file should be formatted in YAML syntax.
113
115
  http://www.yaml.org/spec/1.2/spec.html
114
116
 
115
117
  You can omit the password key-value pair if you'd rather not have the password
116
- on disk. In that case, you'll prompted for the password each time you
118
+ saved in the file. In that case, you'll prompted for the password each time you
117
119
  start vmail.
118
120
 
119
121
  CONTACTS AUTOCOMPLETION
120
122
 
121
- Vmail uses vim autocompletion to help you auto-complete email addresses.
122
- To use this feature, generate a vim-contacts.txt file in the current or
123
- home directory. This is a simple list of all the email addresses.
123
+ vmail uses vim autocompletion to help you auto-complete email addresses.
124
+ To use this feature, generate a vmail-contacts.txt file in the current or
125
+ home directory. This is a simple list of your email contacts.
124
126
  Invoking vmail with the -g option generates this file for you by
125
- collecting all the recipients and cc's from your last 500 or so sent
126
- emails.
127
-
127
+ collecting all the recipients and cc's from your last 500 sent
128
+ emails. You can adjust this number by using -g with a number argument.
128
129
  EOF
129
130
  end
@@ -1,3 +1,3 @@
1
1
  module Vmail
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -0,0 +1,306 @@
1
+ Return-Path: <Joshua.Robin@state.ma.us>
2
+ Received: by 10.213.2.204 with SMTP id 12cs7788ebk; Mon, 13 Dec 2010 17:30:19 -0800
3
+ Received: by 10.229.246.82 with SMTP id lx18mr4342235qcb.0.1292290218892; Mon, 13 Dec 2010 17:30:18 -0800
4
+ Received: from mmp-mitc-1.state.ma.us (mmp-mitc-1.state.ma.us [170.63.135.243]) by mx.google.com with ESMTP id p9si13679281qcg.75.2010.12.13.17.30.18; Mon, 13 Dec 2010 17:30:18 -0800
5
+ Received: from state.ma.us (itd-smtp-dmz.state.ma.us [170.63.135.245]) by mmp-mitc-1.state.ma.us with ESMTP id BT-MMP-56018; Mon, 13 Dec 2010 20:30:17 -0500
6
+ Received: from ([146.243.132.136]) by CF-Appliance-01.state.ma.us with ESMTP id 5503384.856631672; Mon, 13 Dec 2010 20:30:13 -0500
7
+ Received: from 146.243.132.243 ([146.243.132.243]) by
8
+ EOT-MAIL.MHD.Root.eot.gov ([146.243.132.237]) with Microsoft Exchange Server
9
+ HTTP-DAV ; Tue, 14 Dec 2010 01:30:37 +0000
10
+ Date: Mon, 13 Dec 2010 20:30:18 -0500
11
+ From: "Robin, Joshua \(DOT\)" <Joshua.Robin@state.ma.us>
12
+ To: "Robin, Joshua (DOT)" <Joshua.Robin@state.ma.us>
13
+ Message-ID: <020a01cb9b2e$829914e7$f384f392@MHD.Root.eot.gov>
14
+ Subject: Fwd: MassDOT Developers Holiday Meeting - Next Tuesday, December 14,
15
+ 2010
16
+ Mime-Version: 1.0
17
+ Content-Type: multipart/mixed;
18
+ boundary="----=_NextPart_000_020B_01CB9B2E.829914E7";
19
+ charset=UTF-8
20
+ Content-Transfer-Encoding: 7bit
21
+ Delivered-To: dhchoi@gmail.com
22
+ Received-SPF: pass (google.com: best guess record for domain of
23
+ Joshua.Robin@state.ma.us designates 170.63.135.243 as permitted sender)
24
+ client-ip=170.63.135.243;
25
+ Authentication-Results: mx.google.com; spf=pass (google.com: best guess record
26
+ for domain of Joshua.Robin@state.ma.us designates 170.63.135.243 as permitted
27
+ sender) smtp.mail=Joshua.Robin@state.ma.us
28
+ x-mimeole: Produced By Microsoft Exchange V6.5
29
+ Thread-Topic: MassDOT Developers Holiday Meeting - Next Tuesday, December 14,
30
+ 2010
31
+ Thread-Index: AcubLoKZqc0CaHEvTHevxE1vULW7fw==
32
+ Importance: Normal
33
+
34
+ This is a multi-part message in MIME format.
35
+
36
+ ------=_NextPart_000_020B_01CB9B2E.829914E7
37
+ Date: Mon, 13 Dec 2010 21:18:42 -0500
38
+ Mime-Version: 1.0
39
+ Content-Type: multipart/alternative;
40
+ boundary="----=_Part_1_1292290225853";
41
+ charset=UTF-8
42
+ Content-Transfer-Encoding: 7bit
43
+ Content-ID: <4d06d4022052a_23e680983d90322e7@spartan.local.mail>
44
+
45
+
46
+
47
+ ------=_Part_1_1292290225853
48
+ Date: Mon, 13 Dec 2010 21:18:42 -0500
49
+ Mime-Version: 1.0
50
+ Content-Type: text/plain;
51
+ charset=utf-8
52
+ Content-Transfer-Encoding: base64
53
+ Content-Disposition: inline
54
+ Content-ID: <4d06d4021e1fa_23e680983d9032041@spartan.local.mail>
55
+
56
+ DQpKdXN0IGEgcmVtaW5kZXIgYWJvdXQgVHVlc2RheSdzIGRldmVsb3BlciBt
57
+ ZWV0aW5nLiBEZXRhaWxzIGJlbG93LgoKQmVzdCwKSm9zaAoKSm9zaHVhIEsu
58
+ IFJvYmluCjYxNy41MDYuOTEzNwoKLS0tLS0gRm9yd2FyZGVkIG1lc3NhZ2Ug
59
+ LS0tLS0KRnJvbTogIkpvc2ggZnJvbSBNYXNzRE9UIiA8Sm9zaHVhLlJvYmlu
60
+ QHN0YXRlLm1hLnVzPgpEYXRlOiBNb24sIERlYyAxMywgMjAxMCA2OjUwIHBt
61
+ ClN1YmplY3Q6IE1hc3NET1QgRGV2ZWxvcGVycyBIb2xpZGF5IE1lZXRpbmcg
62
+ LSBOZXh0IFR1ZXNkYXksIERlY2VtYmVyIDE0LCAyMDEwClRvOiAiTWFzc0RP
63
+ VERldmVsb3BlcnMiIDxtYXNzZG90ZGV2ZWxvcGVyc0Bnb29nbGVncm91cHMu
64
+ Y29tPgoKDQo=
65
+
66
+
67
+ ------=_Part_1_1292290225853
68
+ Date: Mon, 13 Dec 2010 21:18:42 -0500
69
+ Mime-Version: 1.0
70
+ Content-Type: text/html;
71
+ charset=utf-8
72
+ Content-Transfer-Encoding: base64
73
+ Content-Disposition: inline
74
+ Content-ID: <4d06d4021f76f_23e680983d90321d0@spartan.local.mail>
75
+
76
+ DQpKdXN0IGEgcmVtaW5kZXIgYWJvdXQgVHVlc2RheSYjMzk7cyBkZXZlbG9w
77
+ ZXIgbWVldGluZy4gRGV0YWlscyBiZWxvdy48YnI+PGJyPkJlc3QsPGJyPkpv
78
+ c2g8YnI+PGJyPkpvc2h1YSBLLiBSb2Jpbjxicj42MTcuNTA2LjkxMzc8YnI+
79
+ PGJyPi0tLS0tIEZvcndhcmRlZCBtZXNzYWdlIC0tLS0tPGJyPkZyb206ICZx
80
+ dW90O0pvc2ggZnJvbSBNYXNzRE9UJnF1b3Q7ICZsdDtKb3NodWEuUm9iaW5A
81
+ c3RhdGUubWEudXMmZ3Q7PGJyPkRhdGU6IE1vbiwgRGVjIDEzLCAyMDEwIDY6
82
+ NTAgcG08YnI+U3ViamVjdDogTWFzc0RPVCBEZXZlbG9wZXJzIEhvbGlkYXkg
83
+ TWVldGluZyAtIE5leHQgVHVlc2RheSwgRGVjZW1iZXIgMTQsIDIwMTA8YnI+
84
+ VG86ICZxdW90O01hc3NET1REZXZlbG9wZXJzJnF1b3Q7ICZsdDttYXNzZG90
85
+ ZGV2ZWxvcGVyc0Bnb29nbGVncm91cHMuY29tJmd0Ozxicj48YnI+DQo=
86
+
87
+
88
+ ------=_Part_1_1292290225853--
89
+
90
+
91
+ ------=_NextPart_000_020B_01CB9B2E.829914E7
92
+ Date: Mon, 13 Dec 2010 21:18:42 -0500
93
+ Mime-Version: 1.0
94
+ Content-Type: message/rfc822;
95
+ charset=UTF-8
96
+ Content-Transfer-Encoding: 7bit
97
+ Content-Disposition: attachment
98
+ Content-ID: <4d06d4022267b_23e680983d903236d@spartan.local.mail>
99
+
100
+ Received: from mmp-bos-1.state.ma.us ([146.243.4.195]) by EOT-MAIL.mhd.root.eot.gov with Microsoft SMTPSVC(6.0.3790.4675);
101
+ Mon, 13 Dec 2010 18:50:22 -0500
102
+ Return-Path: <massdotdevelopers+bncciglx7eefhcg4probboerstdgg@googlegroups.com>
103
+ Received: from state.ma.us (itd-smtp-bos.state.ma.us [146.243.4.197]) by mmp-bos-1.state.ma.us with ESMTP id BT-MMP-61494 for joshua.robin@eot.state.ma.us; Mon, 13 Dec 2010 18:49:57 -0500
104
+ Received: from ([209.85.216.57])
105
+ by cf-appliance-03.state.ma.us with ESMTP id 5503337.637401966;
106
+ Mon, 13 Dec 2010 18:49:53 -0500
107
+ Received: by qwe4 with SMTP id 4sf56431qwe.22
108
+ for <joshua.robin@eot.state.ma.us>; Mon, 13 Dec 2010 15:49:52 -0800 (PST)
109
+ DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
110
+ d=googlegroups.com; s=beta;
111
+ h=domainkey-signature:received:x-beenthere:received:mime-version
112
+ :received:received:date:in-reply-to:x-ip:references:user-agent
113
+ :x-http-useragent:message-id:subject:from:to:x-original-sender
114
+ :reply-to:precedence:mailing-list:list-id:list-post:list-help
115
+ :list-archive:sender:list-subscribe:list-unsubscribe:content-type
116
+ :content-transfer-encoding;
117
+ bh=debdKLQY1iPuqITEebleJH6sD3ncMvreFZ5BLGBFAUc=;
118
+ b=WBI0D/ioYMIVHleC7fj/huf37UQX7JqjpqiMgmkdEDvbI0CenzxR3M29QDDm4j9P14
119
+ SSfXfsOuHMTCT7Wtsm1kD/456Yf4WbzZp90MHNuN3+lSJSolGgirauOZOybsd+RJa8LI
120
+ dqfYovLN0UsQlqvg75y2bdBhOqXyqYUTt6ydk=
121
+ DomainKey-Signature: a=rsa-sha1; c=nofws;
122
+ d=googlegroups.com; s=beta;
123
+ h=x-beenthere:mime-version:date:in-reply-to:x-ip:references
124
+ :user-agent:x-http-useragent:message-id:subject:from:to
125
+ :x-original-sender:reply-to:precedence:mailing-list:list-id
126
+ :list-post:list-help:list-archive:sender:list-subscribe
127
+ :list-unsubscribe:content-type:content-transfer-encoding;
128
+ b=h+zbFDxmB8/FfyAye39umXhx5BYu5Cc524mfsom/POHeFihJ7VWeGJFB9qrpbkkhCY
129
+ RTXmuchZP64eST40XJjA/6MX2OblidsBSpYdP+Dq0rSpNeVccaCthUrYmiGlMQbMeWqW
130
+ YbHuKueckpvuQQrX0wQCHNWXpdqiNOsNFuD44=
131
+ Received: by 10.224.19.134 with SMTP id a6mr215500qab.12.1292284192039;
132
+ Mon, 13 Dec 2010 15:49:52 -0800 (PST)
133
+ X-BeenThere: massdotdevelopers@googlegroups.com
134
+ Received: by 10.224.222.20 with SMTP id ie20ls415170qab.7.p; Mon, 13 Dec 2010
135
+ 15:49:51 -0800 (PST)
136
+ Received: by 10.224.53.195 with SMTP id n3mr209795qag.32.1292284191672; Mon,
137
+ 13 Dec 2010 15:49:51 -0800 (PST)
138
+ Received: by fu15g2000vbb.googlegroups.com with HTTP; Mon, 13 Dec 2010
139
+ 15:49:51 -0800 (PST)
140
+ Date: Mon, 13 Dec 2010 15:49:51 -0800 (PST)
141
+ In-Reply-To: <d59d680d-cfc4-4d44-a155-cee632c8a0e4@o14g2000prn.googlegroups.com>
142
+ X-IP: 67.208.190.2
143
+ References: <d59d680d-cfc4-4d44-a155-cee632c8a0e4@o14g2000prn.googlegroups.com>
144
+ User-Agent: G2/1.0
145
+ X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US)
146
+ AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10,gzip(gfe)
147
+ Message-ID: <0ce48b97-eb28-4b0c-87f7-c1de84d5cd99@fu15g2000vbb.googlegroups.com>
148
+ Subject: Re: MassDOT Developers Holiday Meeting - Next Tuesday, December 14, 2010
149
+ From: Josh from MassDOT <Joshua.Robin@state.ma.us>
150
+ To: MassDOTDevelopers <massdotdevelopers@googlegroups.com>
151
+ X-Original-Sender: joshua.robin@eot.state.ma.us
152
+ Reply-To: massdotdevelopers@googlegroups.com
153
+ Precedence: list
154
+ Mailing-list: list massdotdevelopers@googlegroups.com; contact massdotdevelopers+owners@googlegroups.com
155
+ List-ID: <massdotdevelopers.googlegroups.com>
156
+ List-Post: <http://groups.google.com/group/massdotdevelopers/post?hl=en_US>, <mailto:massdotdevelopers@googlegroups.com>
157
+ List-Help: <http://groups.google.com/support/?hl=en_US>, <mailto:massdotdevelopers+help@googlegroups.com>
158
+ List-Archive: <http://groups.google.com/group/massdotdevelopers?hl=en_US>
159
+ Sender: massdotdevelopers@googlegroups.com
160
+ List-Subscribe: <http://groups.google.com/group/massdotdevelopers/subscribe?hl=en_US>,
161
+ <mailto:massdotdevelopers+subscribe@googlegroups.com>
162
+ List-Unsubscribe: <http://groups.google.com/group/massdotdevelopers/subscribe?hl=en_US>,
163
+ <mailto:massdotdevelopers+unsubscribe@googlegroups.com>
164
+ X-spam: ESP<40>=
165
+ SHA:<0>
166
+ SHA_FLAGS:<0>
167
+ UHA:<10>
168
+ ISC:<0>
169
+ BAYES:<0>
170
+ SenderID:<-1>
171
+ DKIM:<1>
172
+ TS:<0>
173
+ SIG:<gHcABoAUAAITVFMyMC0xN0w1LTJPVTQtUFNES4AEAAEAA3zBgAIABQACgAgA
174
+ BAc1NTAzMzM3gBkABxhNZGJQNE5GcTZURzNQRm5YNE1DSndBPT2ADQAIDDIu
175
+ MC4zLjAyLTk1M4AEAAkDSU0ggAcACgY2LjcuMiAAAAAAgZYACYABAA8CgAgA
176
+ B1QriKfiWW1tgAQAAtFV2DmACAAT0ki8MXOad3CACAAJ0ki8MXOad3CACAAK
177
+ BbITBBADSfiACQALOSCBeEwXkBwAgAgACEzQY7hPJpS1gAQADAAADgmAZAAD
178
+ AAAADJ+xa+vsI1/TjO4NiQnVr+2Bo+nYshDoHlVMPWWxnqrWPRbndQlRt0K4
179
+ CeCaNl448PN9nCxV0AfGIDeiABTyHtTAUT3+qqhi8oFT51HNdpYianv67O4R
180
+ exiCeLHENg5wz4DIAAQAxmh0dHA6Ly9tYXBzLmdvb2dsZS5jb20vbWFwcz9m
181
+ PTNEZCZzb3VyY2U9M0RzX2Qmc2FkZHI9M0QmZGFkZHI9M0Q0Mi4zNTE4Mjks
182
+ LT0AaHR0cDovL3RhbGVydHMuY29tL3Jzc2ZlZWQyL2FsZXJ0c3Jzcy5hc3B4
183
+ AGh0dHA6Ly9tYXBzLmdvb2dsZS5jb20vbWFwcz9mPTNEZCZzb3U9AGh0dHA6
184
+ Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9tYXNzZG89AAAAAAA=>
185
+ DSC:<21> (google_group:<21>)
186
+ TRU_watch_spam: <0>
187
+ TRU_cn_scam_spam: <0>
188
+ TRU_adult_spam: <0>
189
+ TRU_back_scatter_new: <0>
190
+ TRU_medical_spam: <0>
191
+ TRU_cn_business_spam: <0>
192
+ TRU_spam1: <0>
193
+ TRU_marketing_spam: <0>
194
+ TRU_cn_profanity_spam: <0>
195
+ TRU_jp_adult_spam: <0>
196
+ TRU_cn_class_ad: <0>
197
+ URL Real-Time Signatures: <0>
198
+ TRU_html_image_spam: <0>
199
+ TRU_jp_misc_spam: <0>
200
+ TRU_embedded_image_spam: <0>
201
+ TRU_scam_spam: <0>
202
+ TRU_urllinks: <0>
203
+ TRU_cn_political: <0>
204
+ TRU_legal_spam: <0>
205
+ TRU_money_spam: <0>
206
+ TRU_cn_misc_spam: <0>
207
+ TRU_misc_spam: <0>
208
+ TRU_ru_spamsubj: <0>
209
+ TRU_lotto_spam: <0>
210
+ TRU_freehosting: <0>
211
+ TRU_profanity_spam: <0>
212
+ TRU_cn_entertainment_spam: <0>
213
+ TRU_stock_spam: <0>
214
+ TRU_phish_spam: <0>
215
+ TRU_spam2: <0>
216
+ TRU_playsites: <9>
217
+ MIME-Version: 1.0
218
+ Content-Type: text/plain; charset=windows-1252
219
+ Content-Transfer-Encoding: quoted-printable
220
+ X-OriginalArrivalTime: 13 Dec 2010 23:50:22.0140 (UTC) FILETIME=[8156CFC0:01CB9B20]
221
+
222
+ All,
223
+
224
+ I just wanted to remind you about our Developers Meeting tomorrow
225
+ night at 6pm at 10 Park Plaza in Boston. We will be meeting at the
226
+ information desk at the top of the escalators at 6pm.
227
+
228
+ For those who arrive later than 6, you will need to sign in at the
229
+ information desk and head to Suite 3170. If you have any issues
230
+ getting to the meeting please call me at 617.506.9137.
231
+
232
+ These are the directions to our building:
233
+ http://maps.google.com/maps?f=3Dd&source=3Ds_d&saddr=3D&daddr=3D42.351829,-=
234
+ 71.066029&hl=3Den&geocode=3DFdU8hgIdU57D-w&mra=3Dltm&dirflg=3Dr&ttype=3Ddep=
235
+ &date=3D12/07/10&time=3D3:28pm&noexp=3D0&noal=3D0&sort=3Ddef&sll=3D42.35139=
236
+ 2,-71.068003&sspn=3D0.005249,0.011362&ie=3DUTF8&t=3Dh&z=3D17&start=3D0
237
+
238
+ We will keep the meeting to an hour maximum and promise to have you
239
+ out the door by 7. Your input will be very valuable as we plan our
240
+ initiatives for 2011.
241
+
242
+ See you tomorrow!
243
+ Josh
244
+
245
+
246
+ On Dec 7, 5:52=A0pm, Josh from MassDOT <joshua.ro...@eot.state.ma.us>
247
+ wrote:
248
+ > Hi Everyone,
249
+ >
250
+ > I hope everyone is having a great holiday season. =A0It has been a few
251
+ > months since we released real-time data for all MBTA buses and the
252
+ > Red, Orange, and Blue Lines. =A0With these successes in 2010, we are
253
+ > making plans for 2011 and need your help!
254
+ >
255
+ > While we know everyone is busy this time of year, we will be hosting a
256
+ > developers meeting next Tuesday evening at 6pm at the State
257
+ > Transportation Building at 10 Park Plaza in Boston. =A0We promise to
258
+ > keep the meeting short but are planning to solicit your input on plans
259
+ > for 2011 including:
260
+ >
261
+ > =95 =A0 =A0 Our plans for releasing real-time commuter rail data. =A0We n=
262
+ eed your
263
+ > input on what the data format will be.
264
+ > =95 =A0 =A0 Our plan s for opening up an API to our customer comment form=
265
+ s so
266
+ > that riders can send in pictures of issues they see in the system.
267
+ > =95 =A0 =A0 Discuss the improvements made in the new T-Alerts RSS feed av=
268
+ ailable
269
+ > athttp://talerts.com/rssfeed2/alertsrss.aspx
270
+ > =95 =A0 =A0 Ideas on a tool for reporting poor predictions
271
+ > =95 =A0 =A0 We need your input on a marketing campaign for Spring 2011 to=
272
+ raise
273
+ > awareness of all your great apps!
274
+ > =95 =A0 =A0 Lastly, we need any other neat ideas you have! =A0Please resp=
275
+ ond to
276
+ > this tread with any items you would like added to the agenda.
277
+ >
278
+ > One place where you, the developer community, can help us is by
279
+ > providing us statistics on the use of your apps. =A0With more than 30
280
+ > apps launched, we want to be able to create a picture of the usage of
281
+ > apps. =A0Please use this form to let us know how your app is being used:h=
282
+ ttps://spreadsheets.google.com/viewform?formkey=3DdEtubURPV291UWFyM0hS...
283
+ >
284
+ > Again, next week=92s meeting will be on Tuesday, December 14th at 6pm at
285
+ > the State Transportation Building located at 10 Park Plaza in Boston.
286
+ > For directions please use this link:http://maps.google.com/maps?f=3Dd&sou=
287
+ rce=3Ds_d&saddr=3D&daddr=3D42.351829,-71...
288
+ >
289
+ > Thanks and looking forward to seeing you next week!
290
+ > Josh
291
+ >
292
+ > ____________________________________
293
+ > Joshua K. Robin
294
+ > Massachusetts Department of Transportation
295
+ > joshua.ro...@state.ma.us
296
+
297
+ --=20
298
+ You received this message because you are subscribed to the Google Groups "=
299
+ MassDOTDevelopers" group.
300
+ To post to this group, send email to massdotdevelopers@googlegroups.com.
301
+ To unsubscribe from this group, send email to massdotdevelopers+unsubscribe=
302
+ @googlegroups.com.
303
+ For more options, visit this group at http://groups.google.com/group/massdo=
304
+ tdevelopers?hl=3Den.
305
+
306
+ ------=_NextPart_000_020B_01CB9B2E.829914E7--