Kensei 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/.gitignore +6 -0
  2. data/Gemfile +4 -0
  3. data/README.md +24 -0
  4. data/Rakefile +7 -0
  5. data/bin/kensei +6 -0
  6. data/kensei.gemspec +29 -0
  7. data/lib/kensei.rb +217 -0
  8. data/test/fixture/Maildir/kensei-first/All Mail/cur/1356207330_0.15143.thomanil-VirtualBox,U=1,FMD5=883ba13d52aa35908bd3344dc0604026:2,S +70 -0
  9. data/test/fixture/Maildir/kensei-first/All Mail/cur/1356207331_0.15143.thomanil-VirtualBox,U=2,FMD5=883ba13d52aa35908bd3344dc0604026:2,S +79 -0
  10. data/test/fixture/Maildir/kensei-first/All Mail/cur/1356207332_0.15143.thomanil-VirtualBox,U=3,FMD5=883ba13d52aa35908bd3344dc0604026:2,S +81 -0
  11. data/test/fixture/Maildir/kensei-first/All Mail/cur/1356207332_2.15143.thomanil-VirtualBox,U=4,FMD5=883ba13d52aa35908bd3344dc0604026:2,S +9 -0
  12. data/test/fixture/Maildir/kensei-first/All Mail/cur/1356207333_1.15143.thomanil-VirtualBox,U=5,FMD5=883ba13d52aa35908bd3344dc0604026:2,S +9 -0
  13. data/test/fixture/Maildir/kensei-first/All Mail/cur/1356207334_0.15143.thomanil-VirtualBox,U=6,FMD5=883ba13d52aa35908bd3344dc0604026:2,S +9 -0
  14. data/test/fixture/Maildir/kensei-first/All Mail/cur/1356207334_1.15143.thomanil-VirtualBox,U=9,FMD5=883ba13d52aa35908bd3344dc0604026:2,S +9 -0
  15. data/test/fixture/Maildir/kensei-first/All Mail/cur/1356207334_2.15143.thomanil-VirtualBox,U=10,FMD5=883ba13d52aa35908bd3344dc0604026:2,S +9 -0
  16. data/test/fixture/Maildir/kensei-first/All Mail/cur/1356207335_0.15143.thomanil-VirtualBox,U=11,FMD5=883ba13d52aa35908bd3344dc0604026:2,S +9 -0
  17. data/test/fixture/Maildir/kensei-first/All Mail/cur/1356207336_0.15143.thomanil-VirtualBox,U=12,FMD5=883ba13d52aa35908bd3344dc0604026:2,S +55 -0
  18. data/test/fixture/Maildir/kensei-first/All Mail/cur/1356207336_1.15143.thomanil-VirtualBox,U=13,FMD5=883ba13d52aa35908bd3344dc0604026:2,S +12 -0
  19. data/test/fixture/Maildir/kensei-first/INBOX/cur/1356207332_1.15143.thomanil-VirtualBox,U=1,FMD5=7e33429f656f1e6e9d79b29c3f82c57e:2,S +70 -0
  20. data/test/fixture/Maildir/kensei-first/INBOX/cur/1356207333_0.15143.thomanil-VirtualBox,U=2,FMD5=7e33429f656f1e6e9d79b29c3f82c57e:2,S +79 -0
  21. data/test/fixture/Maildir/kensei-first/INBOX/cur/1356207333_2.15143.thomanil-VirtualBox,U=5,FMD5=7e33429f656f1e6e9d79b29c3f82c57e:2,S +55 -0
  22. data/test/fixture/Maildir/kensei-first/Sent Mail/cur/1356207337_0.15143.thomanil-VirtualBox,U=1,FMD5=af48cce153be383d91f6c4a7c19fe087:2,S +9 -0
  23. data/test/fixture/Maildir/kensei-first/Sent Mail/cur/1356207337_1.15143.thomanil-VirtualBox,U=2,FMD5=af48cce153be383d91f6c4a7c19fe087:2,S +9 -0
  24. data/test/fixture/Maildir/kensei-first/Sent Mail/cur/1356207338_0.15143.thomanil-VirtualBox,U=3,FMD5=af48cce153be383d91f6c4a7c19fe087:2,S +9 -0
  25. data/test/fixture/Maildir/kensei-first/Sent Mail/cur/1356207338_1.15143.thomanil-VirtualBox,U=5,FMD5=af48cce153be383d91f6c4a7c19fe087:2,S +9 -0
  26. data/test/fixture/Maildir/kensei-first/Sent Mail/cur/1356207339_0.15143.thomanil-VirtualBox,U=6,FMD5=af48cce153be383d91f6c4a7c19fe087:2,S +9 -0
  27. data/test/fixture/Maildir/kensei-first/Sent Mail/cur/1356207339_1.15143.thomanil-VirtualBox,U=7,FMD5=af48cce153be383d91f6c4a7c19fe087:2,S +9 -0
  28. data/test/fixture/Maildir/kensei-first/Sent Mail/cur/1356207340_0.15143.thomanil-VirtualBox,U=8,FMD5=af48cce153be383d91f6c4a7c19fe087:2,S +12 -0
  29. data/test/fixture/Maildir/kensei-first/Trash/cur/1356207341_0.15143.thomanil-VirtualBox,U=1,FMD5=a7e253cd8dd95da3e20daf45519a8dc2:2,S +75 -0
  30. data/test/fixture/Maildir/kensei-first/Trash/cur/1356207341_1.15143.thomanil-VirtualBox,U=2,FMD5=a7e253cd8dd95da3e20daf45519a8dc2:2,S +9 -0
  31. data/test/fixture/Maildir/kensei-first/misc/cur/1356207342_0.15143.thomanil-VirtualBox,U=1,FMD5=bc957e26ff41470c556ee5d09e96880b:2,S +81 -0
  32. data/test/fixture/Maildir/kensei-first/security/cur/1356207343_0.15143.thomanil-VirtualBox,U=1,FMD5=e91e6348157868de9dd8b25c81aebfb9:2,S +55 -0
  33. data/test/fixture/Maildir/kenseisecond/All Mail/cur/1356207346_1.15143.thomanil-VirtualBox,U=2,FMD5=883ba13d52aa35908bd3344dc0604026:2,S +79 -0
  34. data/test/fixture/Maildir/kenseisecond/All Mail/cur/1356207346_2.15143.thomanil-VirtualBox,U=3,FMD5=883ba13d52aa35908bd3344dc0604026:2,S +81 -0
  35. data/test/fixture/Maildir/kenseisecond/All Mail/cur/1356207347_1.15143.thomanil-VirtualBox,U=4,FMD5=883ba13d52aa35908bd3344dc0604026:2,S +12 -0
  36. data/test/fixture/Maildir/kenseisecond/All Mail/new/1356207346_0.15143.thomanil-VirtualBox,U=1,FMD5=883ba13d52aa35908bd3344dc0604026:2, +70 -0
  37. data/test/fixture/Maildir/kenseisecond/INBOX/cur/1356207347_2.15143.thomanil-VirtualBox,U=3,FMD5=7e33429f656f1e6e9d79b29c3f82c57e:2,S +81 -0
  38. data/test/fixture/Maildir/kenseisecond/INBOX/new/1356207347_0.15143.thomanil-VirtualBox,U=1,FMD5=7e33429f656f1e6e9d79b29c3f82c57e:2, +70 -0
  39. data/test/fixture/Maildir/kenseisecond/Sent Mail/cur/1356207349_0.15143.thomanil-VirtualBox,U=1,FMD5=af48cce153be383d91f6c4a7c19fe087:2,S +12 -0
  40. data/test/fixture/Maildir/kenseisecond/help/cur/1356207351_0.15143.thomanil-VirtualBox,U=1,FMD5=657f8b8da628ef83cf69101b6817150a:2,S +81 -0
  41. data/test/fixture/Maildir/kenseisecond/nagging/cur/1356207351_1.15143.thomanil-VirtualBox,U=1,FMD5=be0b69d13a0baed63cc899dc05b36d80:2,S +79 -0
  42. data/test/test_helper.rb +14 -0
  43. data/test/test_kensei.rb +76 -0
  44. metadata +153 -0
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ /.keeptesting
6
+ test/fixture/current-tested-Maildir
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in keeptesting.gemspec
4
+ gemspec
@@ -0,0 +1,24 @@
1
+
2
+ DESCRIPTION:
3
+ ===========
4
+
5
+ The ruby "backend" of Kensei - the email major mode for Emacs.
6
+
7
+ The Kensei rubygem is basically glue code and provides an easy-to-use
8
+ API facade for the Emacs frontend code. The kensei emacs lisp code
9
+ calls the kensei gem as a standard CLI tool, passing the name of the
10
+ API method and any params as regular arguments. The kensei gem returns
11
+ results as json.
12
+
13
+ INSTALL:
14
+ ========
15
+
16
+ `sudo gem install kensei`. However it also depends on other CLI tools,
17
+ and is just meant to be called by the Kensei Emacs mode - see the
18
+ actual Kensei homepage for the full story.
19
+
20
+ LICENSE:
21
+ ========
22
+
23
+ Kensei is free software licensed under the
24
+ [GNU Affero General Public License (AGPL)](http://www.gnu.org/licenses/agpl-3.0.html).
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |i|
5
+ i.test_files = FileList['test/test_*.rb']
6
+ #i.verbose = true
7
+ end
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'kensei'
4
+
5
+ k = Kensei.new
6
+ k.call_from_cli
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "kensei"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "Kensei"
7
+ s.version = Kensei::VERSION
8
+ s.authors = ["Thomas Kjeldahl Nilsson"]
9
+ s.email = ["thomas@kjeldahlnilsson.net"]
10
+ s.homepage = "https://kenseimail.org"
11
+ s.summary = %q{Rubygem backend for Kensei, the Emacs mail major mode}
12
+ s.description = %q{Rubygem backend for Kensei, the Emacs mail major mode}
13
+
14
+ s.rubyforge_project = "kensei"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+
24
+ s.add_runtime_dependency "mail"
25
+
26
+ s.add_development_dependency "minitest"
27
+ s.add_development_dependency "shoulda"
28
+ s.add_development_dependency "shoulda-context"
29
+ end
@@ -0,0 +1,217 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'mail'
4
+ require 'json'
5
+ require 'pathname'
6
+
7
+ class Kensei
8
+ VERSION = "0.0.2"
9
+ DEFAULT_MAILDIR = File.expand_path("~/Maildir")
10
+
11
+ attr_accessor :maildir_path
12
+
13
+ def initialize
14
+ maildir_path = DEFAULT_MAILDIR
15
+ end
16
+
17
+ def call_from_cli
18
+ if ARGV.length == 0
19
+ puts "Usage: kensei API_METHOD [PARAMS...]"
20
+ exit 1
21
+ end
22
+
23
+ method = ARGV[0].to_sym
24
+ params = ARGV[1..(ARGV.length-1)]
25
+
26
+ if !self.respond_to? method
27
+ raise "No method '#{method}' currently present in Kensei rubygem API'"
28
+ end
29
+
30
+ puts self.send(method, *params).to_json
31
+ end
32
+
33
+ def version
34
+ Kensei::VERSION
35
+ end
36
+
37
+ def account_ids
38
+ Dir[maildir_path+"/*"].map do |path|
39
+ Pathname.new(path).basename.to_s
40
+ end
41
+ end
42
+
43
+ def unread_count(account_id)
44
+ d = Dir[maildir_path+"/"+account_id+"/"+"INBOX/new/*"]
45
+ d.entries.count
46
+ end
47
+
48
+ def unified_unread_count
49
+ account_ids.map {|id| unread_count(id) }.reduce(:+)
50
+ end
51
+
52
+ def folder_list(account_id)
53
+ d = Dir[maildir_path+"/"+account_id+"/"+"*"]
54
+ folders = d.entries.map {|path| Pathname.new(path).basename.to_s}.sort
55
+ end
56
+
57
+ def email_list(account_id, folder_id, ordered_by)
58
+ raise "not implemented yet"
59
+ end
60
+
61
+ def unified_inbox_email_list(ordered_by)
62
+ #TODO fetch INBOX contents, read and unread, of all account_ids
63
+ raise "not implemented yet"
64
+ end
65
+
66
+ def email_data(email_id)
67
+ raise "not implemented yet"
68
+ end
69
+
70
+ def synchronize_now
71
+ `offlineimap`
72
+ end
73
+
74
+ def synchronize_every(minute_interval)
75
+ # TODO update kensei crontab
76
+ raise "not implemented yet"
77
+ end
78
+
79
+ def from_address(account_id)
80
+ accounts = `cat ~/.msmtprc | grep "^account"`.split("\n")
81
+ account_number = accounts.index{|account| account =~ /#{account_id}/}
82
+ from_lines = `cat ~/.msmtprc | grep "^from"`.split("\n")
83
+ from_address = from_lines[account_number].gsub(/^from/, "").strip
84
+ end
85
+
86
+ def new_email_body(account_id, to, subject, body)
87
+ from = from_address(account_id)
88
+ email = <<EMAIL_BODY
89
+ To: #{to}
90
+ From: #{from}
91
+ Subject: #{subject}
92
+ #{body}
93
+ EMAIL_BODY
94
+ end
95
+
96
+ def send_email(account_id, to, subject, body)
97
+ email = new_email_body(account_id, to, subject, body)
98
+ File.open("/tmp/last-sent", 'w') { |file| file.write(email) }
99
+ `cat /tmp/last-sent | msmtp -a #{account_id} #{to}`
100
+ end
101
+
102
+ def delete_email(email_id)
103
+ raise "not implemented yet"
104
+ end
105
+
106
+ def archive_email(email_id)
107
+ raise "not implemented yet"
108
+ end
109
+
110
+ def move_email(email_id, new_folder)
111
+ raise "not implemented yet"
112
+ end
113
+
114
+ def search_email(query)
115
+ raise "not implemented yet"
116
+ end
117
+
118
+
119
+
120
+ # Creating/updating config files for new gmail accounts
121
+
122
+ def add_gmail_account(address, password, account_name)
123
+ sanitized_acct_name = account_name.gsub(" ", "")
124
+ update_offlinemap_cfg(address, password, sanitized_acct_name)
125
+ update_msmtp_cfg(address, password, sanitized_acct_name)
126
+ end
127
+
128
+
129
+ def imap_cfg_general_section(account_name)
130
+ <<GENERALCONFIG
131
+ # Generated by Kensei.
132
+
133
+ [general]
134
+ accounts = #{account_name}
135
+ ui = quiet
136
+
137
+
138
+ GENERALCONFIG
139
+ end
140
+
141
+ def imap_cfg_acct_section(address, password, account_name)
142
+ <<CONFIG
143
+ [Account #{account_name}]
144
+ localrepository = #{account_name}-local
145
+ remoterepository = #{account_name}-remote
146
+ status_backend = sqlite
147
+ maxconnections=3
148
+
149
+ [Repository #{account_name}-local]
150
+ type = Maildir
151
+ localfolders = ~/Maildir/#{account_name}
152
+
153
+ [Repository #{account_name}-remote]
154
+ type = Gmail
155
+ remoteuser = #{address}
156
+ remotepass = #{password}
157
+ nametrans = lambda foldername: foldername.replace("[Gmail]/","")
158
+ realdelete = no
159
+
160
+
161
+ CONFIG
162
+ end
163
+
164
+ def update_offlinemap_cfg(address, password, account_name)
165
+ `touch ~/.offlineimaprc && chmod 600 ~/.offlineimaprc`
166
+ `mkdir -p ~/Maildir/#{account_name}`
167
+
168
+ curr_cfg = `cat ~/.offlineimaprc`
169
+ if curr_cfg =~ /\[general\]/
170
+ current_account_list = `grep "accounts =" ~/.offlineimaprc`.chomp
171
+ updated_account_list = current_account_list+", "+account_name
172
+ `sed -i "s/^.*accounts.*$/#{updated_account_list}/" ~/.offlineimaprc`
173
+ else
174
+ `echo '#{imap_cfg_general_section(account_name)}' > ~/.offlineimaprc`
175
+ end
176
+
177
+ `echo '#{imap_cfg_acct_section(address, password, account_name)}' >> ~/.offlineimaprc`
178
+ end
179
+
180
+ def smtp_cfg_general_section()
181
+ <<GENERALCONFIG
182
+ # Generated by Kensei.
183
+
184
+ defaults
185
+ auth on
186
+ tls on
187
+
188
+
189
+ GENERALCONFIG
190
+ end
191
+
192
+ def smtp_cfg_acct_section(address, password, account_name)
193
+ <<CONFIG
194
+ account #{account_name}
195
+ host smtp.gmail.com
196
+ port 587
197
+ from #{address}
198
+ user #{address}
199
+ password #{password}
200
+ tls_trust_file /etc/ssl/certs/ca-certificates.crt
201
+
202
+
203
+ CONFIG
204
+ end
205
+
206
+ def update_msmtp_cfg(address, password, account_name)
207
+ `touch ~/.msmtprc && chmod 600 ~/.msmtprc`
208
+
209
+ curr_cfg = `cat ~/.msmtprc`
210
+ if !(curr_cfg =~ /defaults/)
211
+ `echo '#{smtp_cfg_general_section}' >> ~/.msmtprc`
212
+ end
213
+
214
+ `echo '#{smtp_cfg_acct_section(address, password, account_name)}' >> ~/.msmtprc`
215
+ end
216
+
217
+ end
@@ -0,0 +1,70 @@
1
+ MIME-Version: 1.0
2
+ Received: by 10.112.4.227; Sat, 10 Nov 2012 07:18:48 -0800 (PST)
3
+ Date: Sat, 10 Nov 2012 07:18:48 -0800
4
+ Message-ID: <CABQd01MhrVLEspALKVNvfK8v=jf+_JhAqyb4VRRzi+gfBOhXrw@mail.gmail.com>
5
+ Subject: Get Gmail on your mobile phone
6
+ From: Gmail Team <mail-noreply@google.com>
7
+ To: Kensei Test Account <kensei.test@gmail.com>
8
+ Content-Type: multipart/alternative; boundary=f46d0421a8c1c0866204ce259508
9
+
10
+ --f46d0421a8c1c0866204ce259508
11
+ Content-Type: text/plain; charset=ISO-8859-1
12
+ Content-Transfer-Encoding: quoted-printable
13
+
14
+ [image: Access Gmail on your mobile phone]
15
+ <http://www.google.com/intl/en/mobile/mail/#utm_source=3Dwel-eml&utm_medium=
16
+ =3Deml&utm_campaign=3Den>
17
+
18
+ The days of needing your computer to get to your inbox are long gone. You
19
+ can now use Gmail on your mobile phone to access your email from anywhere.
20
+ Get Gmail for your phone
21
+ =BB<http://www.google.com/intl/en/mobile/mail/#utm_source=3Dwel-eml&utm_med=
22
+ ium=3Deml&utm_campaign=3Den>
23
+
24
+ --f46d0421a8c1c0866204ce259508
25
+ Content-Type: text/html; charset=ISO-8859-1
26
+
27
+ <html>
28
+ <font face="Arial, Helvetica, sans-serif">
29
+ <p>
30
+ <a href="http://www.google.com/intl/en/mobile/mail/#utm_source=wel-eml&utm_medium=eml&utm_campaign=en">
31
+ <img src="https://mail.google.com/mail/images/phones.png"
32
+ alt="Access Gmail on your mobile phone"
33
+ style="border:0px;"/>
34
+ </a>
35
+ </p>
36
+ <p>The days of needing your computer to get to your inbox are long gone. You can
37
+ now use Gmail on your mobile phone to access your email from anywhere.</p>
38
+
39
+ <table cellpadding="0" cellspacing="0">
40
+ <col style="width: 1px;"/>
41
+ <col/>
42
+ <col style="width: 1px;"/>
43
+ <tr>
44
+ <td></td>
45
+ <td height="1px" style="background-color: #ddd"></td>
46
+ <td></td>
47
+ </tr>
48
+ <tr>
49
+ <td style="background-color: #ddd"></td>
50
+ <td background="https://mail.google.com/mail/images/welcome-button-background.png"
51
+ style="background-color: #ddd; background-repeat: repeat-x;
52
+ padding: 10px; font-size: larger">
53
+ <a href="http://www.google.com/intl/en/mobile/mail/#utm_source=wel-eml&utm_medium=eml&utm_campaign=en"
54
+ style="font-weight: bold; color: #000; text-decoration: none;
55
+ display: block;">
56
+ Get Gmail for your phone &#187;</a>
57
+ </td>
58
+ <td style="background-color: #ddd"></td>
59
+ </tr>
60
+ <tr>
61
+ <td></td>
62
+ <td height="1px" style="background-color: #ddd"></td>
63
+ <td></td>
64
+ </tr>
65
+ </table>
66
+ </p>
67
+ </font>
68
+ </html>
69
+
70
+ --f46d0421a8c1c0866204ce259508--
@@ -0,0 +1,79 @@
1
+ MIME-Version: 1.0
2
+ Received: by 10.112.4.227; Sat, 10 Nov 2012 07:18:48 -0800 (PST)
3
+ Date: Sat, 10 Nov 2012 07:18:48 -0800
4
+ Message-ID: <CABQd01N+VFn89guaFCcBu+x=rJudno+yarZPZF1=CqWDz=sQnw@mail.gmail.com>
5
+ Subject: Import your contacts and old email
6
+ From: Gmail Team <mail-noreply@google.com>
7
+ To: Kensei Test Account <kensei.test@gmail.com>
8
+ Content-Type: multipart/alternative; boundary=00151748de9ec3315804ce259570
9
+
10
+ --00151748de9ec3315804ce259570
11
+ Content-Type: text/plain; charset=ISO-8859-1
12
+ Content-Transfer-Encoding: quoted-printable
13
+
14
+ You can import your contacts and mail from Yahoo!, Hotmail, AOL, and many
15
+ other web mail or POP accounts. If you want, we'll even keep importing your
16
+ mail for the next 30 days.
17
+ Import contacts and mail
18
+ =BB<https://mail.google.com/mail/#settings/accounts>
19
+
20
+ We know it can be a pain to switch email accounts, and we hope this makes
21
+ the transition to Gmail a bit easier.
22
+
23
+ - The Gmail Team
24
+
25
+ Please note that importing is not available if you're using Internet
26
+ Explorer 6.0. To take advantage of the latest Gmail features, please upgrad=
27
+ e
28
+ to a fully supported
29
+ browser<http://support.google.com/mail/bin/answer.py?answer=3D6557&hl=3Den&=
30
+ utm_source=3Dwel-eml&utm_medium=3Deml&utm_campaign=3Den>
31
+ .
32
+
33
+ --00151748de9ec3315804ce259570
34
+ Content-Type: text/html; charset=ISO-8859-1
35
+
36
+ <html>
37
+ <font face="Arial, Helvetica, sans-serif">
38
+ <p>You can import your contacts and mail from Yahoo!, Hotmail, AOL, and many
39
+ other web mail or POP accounts. If you want, we'll even keep importing your
40
+ mail for the next 30 days.</p>
41
+
42
+ <table cellpadding="0" cellspacing="0">
43
+ <col style="width: 1px" /><col /><col style="width: 1px" />
44
+ <tr>
45
+ <td></td>
46
+ <td height="1px" style="background-color: #ddd"></td>
47
+ <td></td>
48
+ </tr>
49
+ <tr>
50
+ <td style="background-color: #ddd"></td>
51
+ <td background="https://mail.google.com/mail/images/welcome-button-background.png"
52
+ style="background-color: #ddd; background-repeat: repeat-x"
53
+ ><a href="https://mail.google.com/mail/#settings/accounts"
54
+ style="font-weight: bold; color: #000; text-decoration: none; display: block; padding: 0.5em 1em"
55
+ >Import contacts and mail &#187;</a></td>
56
+ <td style="background-color: #ddd"></td>
57
+ </tr>
58
+ <tr>
59
+ <td></td>
60
+ <td height="1px" style="background-color: #ddd"></td>
61
+ <td></td>
62
+ </tr>
63
+ </table>
64
+
65
+ <p>We know it can be a pain to switch email accounts, and we hope this makes
66
+ the transition to Gmail a bit easier.</p>
67
+
68
+ <p>- The Gmail Team</p>
69
+
70
+ <p><font size="-2" color="#999">Please note that importing is not available if
71
+ you're using Internet Explorer 6.0. To take advantage of the latest Gmail
72
+ features, please
73
+ <a href="http://support.google.com/mail/bin/answer.py?answer=6557&hl=en&utm_source=wel-eml&utm_medium=eml&utm_campaign=en"><font color="#999">
74
+ upgrade to a fully supported browser</font></a>.</font></p>
75
+
76
+ </font>
77
+ </html>
78
+
79
+ --00151748de9ec3315804ce259570--