vmail 0.0.7 → 0.0.8

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