Kensei 0.0.2

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