mkawalec / imap Goto Github PK
View Code? Open in Web Editor NEWA performant IMAP client library
License: Other
A performant IMAP client library
License: Other
I hear that people are now using crypton-connection
now that connection
is unmaintained and unsafe. Let's do the upgrade please
I need a tool to one-way sync an IMAP account to my home backup server. Every time the sync job runs it should update the local backup to reflect the state of the remote account. Local changes are not made.
I tried offlinesync and mbsync for this task but both programs fail when a folder gets deleted and recreated.
If you would write such a tool on top of your library I would be happy to test and use it and report back all issues I find.
Thanks for consideration.
and fails with a really weird parse error
Received an error that should not occur.
Executing a fetchG with a list of UIDs and FAST as the argument - the first line of the block below.
Any ideas how to proceed?
Working with commit: a80f9f1
"595320,595326,595332,595338,595344,595350,595356,595362,595368,595374 FAST"
Cannot dispatch a parse error without aLeft "Parse failed with error: 'Failed reading: takeWhile1' while reading an input chunk: '\"* 9503 FETCH (UID 595326 INTERNALDATE \\\"20-Feb-2017 17:24:18 +1100\\\" RFC822.SIZE 2576 FLAGS (\\\\Seen))\\r\\n* 9509 FETCH (UID 595332 INTERNALDATE \\\"20-Feb-2017 17:29:17 +1100\\\" RFC822.SIZE 2576 FLAGS (\\\\Seen))\\r\\n* 9515 FETCH (UID 595338 INTERNALDATE \\\"20-Feb-2017 17:34:20 +1100\\\" RFC822.SIZE 2576 FLAGS (\\\\Seen))\\r\\n* 9521 FETCH (UID 595344 INTERNALDATE \\\"20-Feb-2017 17:39:19 +1100\\\" RFC822.SIZE 2575 FLAGS (\\\\Seen))\\r\\n* 9527 FETCH (UID 595350 INTERNALDATE \\\"20-Feb-2017 17:44:19 +1100\\\" RFC822.SIZE 2576 FLAGS (\\\\Seen))\\r\\n* 9533 FETCH (UID 595356 INTERNALDATE \\\"20-Feb-2017 17:49:19 +1100\\\" RFC822.SIZE 3141 FLAGS (\\\\Seen))\\r\\n* 9539 FETCH (UID 595362 INTERNALDATE \\\"20-Feb-2017 17:54:17 +1100\\\" RFC822.SIZE 3138 FLAGS (\\\\Seen))\\r\\n* 9545 FETCH (UID 595368 INTERNALDATE \\\"20-Feb-2017 17:59:21 +1100\\\" RFC822.SIZE 3140 FLAGS (\\\\Seen))\\r\\n* 9551 FETCH (UID 595374 INTERNALDATE \\\"20-Feb-2017 18:04:21 +1100\\\" RFC822.SIZE 3140 FLAGS (\\\\Seen))\\r\\nfmnhksmna OK UID FETCH completed\\r\\n\"'.\n\nThis should never happen and is a library error. To open an issue please go to https://github.com/mkawalec/imap/issues"
n outstanding request
I'm getting:
Parse failed with error: 'Failed reading: takeWhile1' while reading an input chunk: '"* SEARCH\r\ngvuyrkepn OK Search completed (0.001 + 0.000 secs).\r\n"'.
This should never happen and is a library error. To open an issue please go to https://github.com/mkawalec/imap/issues
After executing:
simpleFormat $ uidSearch conn ("NOT KEYWORD CALLBACK_CALLED")
when there's no such email, when there's, it works.
I see that mailbox names aren't quoted or otherwise escaped while the command is being constructed; this fails for mailboxes whose names contain spaces or other characters which aren't valid in an IMAP atoms.
e.g.:
IMAP.select conn "[Gmail]/All Mail"
-> fails with a BAD "Could not parse command".
IMAP.select conn ""[Gmail]/All Mail""
-> works.
Why are FETCH response data items (msg-att) simple UntaggedResult
constructors instead of their own data type?
Given that msg-att can only appear in a FETCH response line, I think it makes sense for the fetch response to be something like Fetch Int [MessageAttr]
where MessageAttr
is something like:
data MessageAttr = MsgFlags ... | MsgEnvelope ... | MsgSize ... | MsgBody ...
derive is no longer supported and requires old GHC pieces too.
At least the LITERAL+ capabilty contains a +
and that breaks your parsing, since you only accept things matching isAtomChar
and +
is not among those.
I am not sure if it makes sense to modify isAtomChar
or add a special case for the parsing of capabilities.
An address string like this would fail to parse: ((NIL NIL "foo" "example.com"))
.
This represents an email that has no display name field (i.e. it'll show up in email clients as a raw email address), and entirely valid per spec:
address = "(" addr-name SP addr-adl SP addr-mailbox SP
addr-host ")"
addr-name = nstring
; If non-NIL, holds phrase from [RFC-2822]
; mailbox after removing [RFC-2822] quoting
nstring = string / nil
This comes up when fetching the ENVELOPE attribute of a message.
The existing code seems to be always matching the starting quote of the field (with my comments):
parseEmail :: Parser EmailAddress
parseEmail = do
string "(\"" -- quote is always being matched here, nilOrValue only gets applied to the body.
label <- nilOrValue $ AP.takeWhile1 (/= _quotedbl)
string "\" NIL \"" -- this being forced to nil is also suspicious...
emailUsername <- AP.takeWhile1 (/= _quotedbl)
string "\" \""
emailDomain <- AP.takeWhile1 (/= _quotedbl)
string "\")"
let fullAddr = decodeUtf8 $ BSC.concat [emailUsername, "@", emailDomain]
return $ EmailAddress (liftM decodeUtf8 label) fullAddr
The usual procedure is to provide version ranges, or at least to only pin major and not minor versions, under the understanding that dependencies should be PVP-compliant. If you pin even the minor versions, people will quickly find this package nearly entirely unusable.
So this is a bit nitpicky, but...
The CONDSTORE extension defines that the modseq value is a 64-bit int. However, UntaggedResult
uses HighestModSeq Int
, and there are Haskell systems where Ints are 32-bits long, which would cause... actually, I'm not sure what would happen, but it would be bad.
I don't know if this affects any real-life systems, but you should be aware.
Would you be able to bump the package dependencies? It's based on a pretty old version of base, network and containers
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.