Merge lp://staging/~nikwen/account-polld/imap-new into lp://staging/~ubuntu-push-hackers/account-polld/trunk
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ubuntu Push Hackers | Pending | ||
Review via email:
|
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:/
===================
Other branches which need to be merged before this one:
https:/
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
- 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
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 alternative
|__multipart/
| |__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.