Merge lp://staging/~nikwen/account-polld/imap-new into lp://staging/~ubuntu-push-hackers/account-polld/trunk

Proposed by Niklas Wenzel
Status: Work in progress
Proposed branch: lp://staging/~nikwen/account-polld/imap-new
Merge into: lp://staging/~ubuntu-push-hackers/account-polld/trunk
Prerequisite: lp://staging/~nikwen/account-polld/more-flexible-plugin-initialization
Diff against target: 190295 lines (+189636/-2)
116 files modified
cmd/account-polld/main.go (+9/-1)
plugins/imap/go-imap/LICENSE (+29/-0)
plugins/imap/go-imap/README (+11/-0)
plugins/imap/go-imap/goimap/client.go (+638/-0)
plugins/imap/go-imap/goimap/command.go (+367/-0)
plugins/imap/go-imap/goimap/doc.go (+116/-0)
plugins/imap/go-imap/goimap/enum.go (+161/-0)
plugins/imap/go-imap/goimap/field.go (+272/-0)
plugins/imap/go-imap/goimap/imap.go (+538/-0)
plugins/imap/go-imap/goimap/reader.go (+542/-0)
plugins/imap/go-imap/goimap/response.go (+355/-0)
plugins/imap/go-imap/goimap/sasl.go (+78/-0)
plugins/imap/go-imap/goimap/seqset.go (+294/-0)
plugins/imap/go-imap/goimap/server.go (+49/-0)
plugins/imap/go-imap/goimap/strings.go (+268/-0)
plugins/imap/go-imap/goimap/transport.go (+346/-0)
plugins/imap/go-imap/goimap/utf7.go (+191/-0)
plugins/imap/go-imap/goimap/util.go (+206/-0)
plugins/imap/go-qprintable/COPYING (+15/-0)
plugins/imap/go-qprintable/README.md (+85/-0)
plugins/imap/go-qprintable/qprintable.go (+424/-0)
plugins/imap/goenmime/LICENSE (+20/-0)
plugins/imap/goenmime/README.md (+24/-0)
plugins/imap/goenmime/base64.go (+43/-0)
plugins/imap/goenmime/charsets.go (+256/-0)
plugins/imap/goenmime/doc.go (+29/-0)
plugins/imap/goenmime/header.go (+394/-0)
plugins/imap/goenmime/mail.go (+213/-0)
plugins/imap/goenmime/match.go (+107/-0)
plugins/imap/goenmime/part.go (+241/-0)
plugins/imap/imap.go (+341/-0)
plugins/imap/text/.fr-MSkUok/text-master/transform/transform.go (+616/-0)
plugins/imap/text/.fr-YyFm0g/text-master/transform/transform.go (+616/-0)
plugins/imap/text/AUTHORS (+3/-0)
plugins/imap/text/CONTRIBUTING.md (+31/-0)
plugins/imap/text/CONTRIBUTORS (+3/-0)
plugins/imap/text/LICENSE (+27/-0)
plugins/imap/text/PATENTS (+22/-0)
plugins/imap/text/README (+3/-0)
plugins/imap/text/encoding/charmap/charmap.go (+209/-0)
plugins/imap/text/encoding/charmap/maketables.go (+415/-0)
plugins/imap/text/encoding/charmap/tables.go (+5116/-0)
plugins/imap/text/encoding/encoding.go (+179/-0)
plugins/imap/text/encoding/htmlindex/gen.go (+166/-0)
plugins/imap/text/encoding/htmlindex/htmlindex.go (+86/-0)
plugins/imap/text/encoding/htmlindex/map.go (+106/-0)
plugins/imap/text/encoding/htmlindex/tables.go (+350/-0)
plugins/imap/text/encoding/ianaindex/ianaindex.go (+64/-0)
plugins/imap/text/encoding/internal/identifier/gen.go (+137/-0)
plugins/imap/text/encoding/internal/identifier/identifier.go (+80/-0)
plugins/imap/text/encoding/internal/identifier/mib.go (+1621/-0)
plugins/imap/text/encoding/internal/internal.go (+60/-0)
plugins/imap/text/encoding/japanese/all.go (+12/-0)
plugins/imap/text/encoding/japanese/eucjp.go (+210/-0)
plugins/imap/text/encoding/japanese/iso2022jp.go (+284/-0)
plugins/imap/text/encoding/japanese/maketables.go (+161/-0)
plugins/imap/text/encoding/japanese/shiftjis.go (+188/-0)
plugins/imap/text/encoding/japanese/tables.go (+26971/-0)
plugins/imap/text/encoding/korean/euckr.go (+177/-0)
plugins/imap/text/encoding/korean/maketables.go (+143/-0)
plugins/imap/text/encoding/korean/tables.go (+34152/-0)
plugins/imap/text/encoding/simplifiedchinese/all.go (+12/-0)
plugins/imap/text/encoding/simplifiedchinese/gbk.go (+280/-0)
plugins/imap/text/encoding/simplifiedchinese/hzgb2312.go (+228/-0)
plugins/imap/text/encoding/simplifiedchinese/maketables.go (+161/-0)
plugins/imap/text/encoding/simplifiedchinese/tables.go (+43999/-0)
plugins/imap/text/encoding/testdata/candide-gb18030.txt (+510/-0)
plugins/imap/text/encoding/testdata/candide-utf-8.txt (+510/-0)
plugins/imap/text/encoding/testdata/candide-windows-1252.txt (+510/-0)
plugins/imap/text/encoding/testdata/rashomon-euc-jp.txt (+178/-0)
plugins/imap/text/encoding/testdata/rashomon-iso-2022-jp.txt (+178/-0)
plugins/imap/text/encoding/testdata/rashomon-shift-jis.txt (+178/-0)
plugins/imap/text/encoding/testdata/rashomon-utf-8.txt (+178/-0)
plugins/imap/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-hz-gb2312.txt (+107/-0)
plugins/imap/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-utf-8.txt (+107/-0)
plugins/imap/text/encoding/testdata/sunzi-bingfa-simplified-gbk.txt (+107/-0)
plugins/imap/text/encoding/testdata/sunzi-bingfa-simplified-utf-8.txt (+107/-0)
plugins/imap/text/encoding/testdata/sunzi-bingfa-traditional-big5.txt (+106/-0)
plugins/imap/text/encoding/testdata/sunzi-bingfa-traditional-utf-8.txt (+106/-0)
plugins/imap/text/encoding/testdata/unsu-joh-eun-nal-euc-kr.txt (+175/-0)
plugins/imap/text/encoding/testdata/unsu-joh-eun-nal-utf-8.txt (+175/-0)
plugins/imap/text/encoding/traditionalchinese/big5.go (+198/-0)
plugins/imap/text/encoding/traditionalchinese/maketables.go (+140/-0)
plugins/imap/text/encoding/traditionalchinese/tables.go (+37142/-0)
plugins/imap/text/encoding/unicode/override.go (+82/-0)
plugins/imap/text/encoding/unicode/unicode.go (+333/-0)
plugins/imap/text/language/Makefile (+16/-0)
plugins/imap/text/language/common.go (+36/-0)
plugins/imap/text/language/coverage.go (+223/-0)
plugins/imap/text/language/gen_common.go (+40/-0)
plugins/imap/text/language/go1_1.go (+38/-0)
plugins/imap/text/language/go1_2.go (+11/-0)
plugins/imap/text/language/language.go (+863/-0)
plugins/imap/text/language/lookup.go (+486/-0)
plugins/imap/text/language/maketables.go (+1712/-0)
plugins/imap/text/language/match.go (+819/-0)
plugins/imap/text/language/parse.go (+824/-0)
plugins/imap/text/language/tables.go (+2757/-0)
plugins/imap/text/language/tags.go (+153/-0)
plugins/imap/text/transform/transform.go (+616/-0)
plugins/imap/text/unicode/norm/composition.go (+514/-0)
plugins/imap/text/unicode/norm/forminfo.go (+256/-0)
plugins/imap/text/unicode/norm/input.go (+105/-0)
plugins/imap/text/unicode/norm/iter.go (+450/-0)
plugins/imap/text/unicode/norm/maketables.go (+978/-0)
plugins/imap/text/unicode/norm/normalize.go (+527/-0)
plugins/imap/text/unicode/norm/readwriter.go (+126/-0)
plugins/imap/text/unicode/norm/tables.go (+7587/-0)
plugins/imap/text/unicode/norm/transform.go (+88/-0)
plugins/imap/text/unicode/norm/trie.go (+54/-0)
plugins/imap/text/unicode/norm/triegen.go (+117/-0)
plugins/imap/text/unicode/rangetable/gen.go (+126/-0)
plugins/imap/text/unicode/rangetable/merge.go (+260/-0)
plugins/imap/text/unicode/rangetable/rangetable.go (+70/-0)
plugins/imap/text/unicode/rangetable/tables.go (+5105/-0)
plugins/plugins.go (+2/-1)
To merge this branch: bzr merge lp://staging/~nikwen/account-polld/imap-new
Reviewer Review Type Date Requested Status
Ubuntu Push Hackers Pending
Review via email: mp+287420@code.staging.launchpad.net

Description of the change

WIP branch for IMAP notifications

Note that a lot of changes here result from adding libraries for communicating with an IMAP server

Currently used account plugin (will change): https://code.launchpad.net/~nikwen/+junk/imap-accounts

===================

Other branches which need to be merged before this one:

https://code.launchpad.net/~nikwen/account-polld/trim-message

To post a comment you must log in.
160. By Niklas Wenzel

Merge lp:~nikwen/account-polld/trim-message

161. By Niklas Wenzel

Performance improvements achieved by using UIDNEXT and UIDVALIDITY and removing the old uid reporting

162. By Niklas Wenzel

Rename ServerStatus to InboxStatus

163. By Niklas Wenzel

Add comments, sort uids and clean code up

164. By Niklas Wenzel

Add constant for the inbox name

165. By Niklas Wenzel

Fix UID search by adding the UID keyword

Revision history for this message
Dan Chapman  (dpniel) wrote :

This works pretty nicely. One concern I have is the request for the full message body you make here http://bazaar.launchpad.net/~nikwen/account-polld/imap-new/view/head:/plugins/imap/imap.go#L224

Firstly the call to BODY[] could result in the \Seen flag being implicitly set on the message. You need to use BODY.PEEK[] to instruct the server not to open the message and avoid the implicit setting of the \Seen flag.

Also requesting the complete body could potentially be *alot* of data, which from this plugins point of view is just wasting bandwidth. What I think could be better is to request the ENVELOPE & BODYSTRUCTURE for the new uid seq. i.e c.UIDFetch(set, "UID", "ENVELOPE", "BODYSTRUCTURE")

The ENVELOPE will return the rfc-2822 header and provide you the From, Subject, Date etc. Which is the equivalent of RFC822.HEADER but with some unneeded cruft removed. So you could replace RFC822 with ENVELOPE in you fetch command.

With BODYSTRUCTURE the response can be used to parse the messages mime structure without downloading the parts content, from this you can look for the body part you would display in the notification. I'm not sure if enmime can do this for you but it's not difficult to deduce the part you want for each message. Also if the subject line is pretty long you won't even need to parse it at all due to the limited space in a notification.

If you do need to fetch a part because there is still some room left in the notification string then you only really need a preview of the beginning of that part. You should make the server do the hard work for you here and only return the first X bytes of the message part. You can do this using UID FETCH uid BODY.PEEK[section]<0.numbytes> where 'section' is the deduced mime part location

Take a mime structure like this:

multipart/mixed
|__multipart/alternative
| |__text/plain
| |__text/html
|__text/plain
|__image/png

To fetch the first 100 bytes of the text/html part you would do BODY.PEEK[1.1.2]<0.100>
If you have determined the uid sequence (or a subset) have their interesting part in the same location, you can then request them all in a single command

UID FETCH 100:134 BODY.PEEK[1.1]<0.100> .

or for a mixture of individual uid's and a sequence

UID FETCH 14,15,27,100:143,165 BODY.PEEK[1]<0.100>

Which is nice as you can batch up commands and avoid individual requests of BODY.PEEK for every message in a sequence.

The end result in this approach is you have only requested the info you need when you need it, and not changed any message state/flags on the server.

Revision history for this message
Niklas Wenzel (nikwen) wrote :

Wow, Dan! Thanks a lot for the extensive review. :)

I'll dig into that when I have some time on hand and try to adjust it to your suggestions. They sound very reasonable after all and your detailed description will help me a lot.

Thanks again!

Unmerged revisions

165. By Niklas Wenzel

Fix UID search by adding the UID keyword

164. By Niklas Wenzel

Add constant for the inbox name

163. By Niklas Wenzel

Add comments, sort uids and clean code up

162. By Niklas Wenzel

Rename ServerStatus to InboxStatus

161. By Niklas Wenzel

Performance improvements achieved by using UIDNEXT and UIDVALIDITY and removing the old uid reporting

160. By Niklas Wenzel

Merge lp:~nikwen/account-polld/trim-message

159. By Niklas Wenzel

Merge changes from the more-flexible-plugin-initialization branch

158. By Niklas Wenzel

Initial commit for the cleaned up IMAP plugin

157. By Niklas Wenzel

Remove old general TODO that I accidentally copied over from the imap-mails branch

156. By Niklas Wenzel

Make plugin initialization more flexible, easing the addition of new plugins in the future

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
The diff is not available at this time. You can reload the page or download it.

Subscribers

People subscribed via source and target branches