<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>OfflineIMAP community&apos;s website</title>
    <description>OfflineIMAP community&apos;s website.
</description>
    <link>http://www.offlineimap.org/</link>
    <atom:link href="http://www.offlineimap.org/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Tue, 05 Nov 2024 20:17:28 +0000</pubDate>
    <lastBuildDate>Tue, 05 Nov 2024 20:17:28 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>v7.0 series is ready, deprecating the v6.7 series</title>
        <description>
&lt;p&gt;Near &lt;em&gt;8 months&lt;/em&gt; after the first v7.0.0 release the latest v7.0.14 is quite
reliable.&lt;/p&gt;

&lt;!--more--&gt;

&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#the-v70-series&quot; id=&quot;markdown-toc-the-v70-series&quot;&gt;The v7.0 series&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#time-to-deprecate-the-v67-series&quot; id=&quot;markdown-toc-time-to-deprecate-the-v67-series&quot;&gt;Time to deprecate the v6.7 series&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#welcoming-the-official-testers&quot; id=&quot;markdown-toc-welcoming-the-official-testers&quot;&gt;Welcoming the official testers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;the-v70-series&quot;&gt;The v7.0 series&lt;/h3&gt;

&lt;p&gt;The v7.0 series was born due to breaking changes. The main change was the move
to the SQLite backend driver by default.&lt;/p&gt;

&lt;p&gt;A good work have been done to improve this series in different areas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;the SQLite backend;&lt;/li&gt;
  &lt;li&gt;concurrency issues;&lt;/li&gt;
  &lt;li&gt;the structure algo comparison;&lt;/li&gt;
  &lt;li&gt;IMAP/IMAP syncs;&lt;/li&gt;
  &lt;li&gt;XOAUTH2;&lt;/li&gt;
  &lt;li&gt;mbnames;&lt;/li&gt;
  &lt;li&gt;some fixes for some other bugs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Actually, all the releases since v7.0.0 are small bugfix releases.&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;With this fresh new release of v7.0.14, we get a reliable version of
offlineimap.&lt;/p&gt;

&lt;h3 id=&quot;time-to-deprecate-the-v67-series&quot;&gt;Time to deprecate the v6.7 series&lt;/h3&gt;

&lt;p&gt;At the time of the release of v7.0.0 I’ve officially provided support for the
v6.7 series to make the transition as smooth as possible. There is not anymore
reasons to keep it and remain with the legacy text backend.&lt;/p&gt;

&lt;p class=&quot;DarkRed&quot;&gt;I plan to remove the &lt;em&gt;DEPRECATED&lt;/em&gt; legacy text backend in the near future. This
may happen for the next release.&lt;/p&gt;

&lt;h3 id=&quot;welcoming-the-official-testers&quot;&gt;Welcoming the official testers&lt;/h3&gt;

&lt;p&gt;We improved the release cycle by adding a new step. Before new releases, I
freeze the code and make a call for testing. The official testers are expected
to try and test the tip of the git branch called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;next&lt;/code&gt;.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;This is usually done &lt;strong&gt;after&lt;/strong&gt; I’ve tried it myself. Actually, I’m always
running the tip of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;next&lt;/code&gt; branch for all my offlineimap accounts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The distribution maintainers are already very involved for a long time&lt;/strong&gt;. I’m
happy some users decided to join our efforts. Here are the current official
testers:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Abdó Roig-Maranges&lt;/li&gt;
  &lt;li&gt;Ben Boeckel&lt;/li&gt;
  &lt;li&gt;Chris Coleman&lt;/li&gt;
  &lt;li&gt;Darshit Shah&lt;/li&gt;
  &lt;li&gt;Eygene Ryabinkin&lt;/li&gt;
  &lt;li&gt;Igor Almeida&lt;/li&gt;
  &lt;li&gt;Ilias Tsitsimpis&lt;/li&gt;
  &lt;li&gt;“J”&lt;/li&gt;
  &lt;li&gt;Łukasz Żarnowiecki&lt;/li&gt;
  &lt;li&gt;Rainer M Krug&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;Obviously, newcomers are welcome at any time. We provide better support to the
official testers. To become a member of this team you just have to declare you
intend to join. Let us know! ,-)&lt;/p&gt;

&lt;p&gt;We’ve written &lt;a href=&quot;http://www.offlineimap.org/doc/Testing.html&quot;&gt;documentation about testing
offlineimap&lt;/a&gt;.&lt;/p&gt;

</description>
        <pubDate>Sat, 11 Mar 2017 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/development/2017/03/11/v7.0-series-is-ready.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/development/2017/03/11/v7.0-series-is-ready.html</guid>
        
        
        <category>development</category>
        
      </item>
    
      <item>
        <title>tracking regressions</title>
        <description>
&lt;p&gt;Four days after v7.0.0 and v6.7.0.2, I’ve had to release v7.0.1 and v6.7.0.3.
One day later it was for v7.0.2. Again, I intend a v7.0.3 soon. Something gone
wrong, obviously.&lt;/p&gt;

&lt;!--more--&gt;

&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#the-release-cycle&quot; id=&quot;markdown-toc-the-release-cycle&quot;&gt;The release cycle&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#oops-this-failed&quot; id=&quot;markdown-toc-oops-this-failed&quot;&gt;Oops, this failed&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#imagine-yourself-the-maintainer&quot; id=&quot;markdown-toc-imagine-yourself-the-maintainer&quot;&gt;Imagine yourself the maintainer&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#responsability-is-shared-somewhat&quot; id=&quot;markdown-toc-responsability-is-shared-somewhat&quot;&gt;Responsability is shared, somewhat&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#a-call-for-enthusiasts&quot; id=&quot;markdown-toc-a-call-for-enthusiasts&quot;&gt;A call for enthusiasts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;the-release-cycle&quot;&gt;The release cycle&lt;/h3&gt;

&lt;p&gt;Our release cycle is efficient and quite standard. Once a stable is out, we
expect the release candidates (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-rcN&lt;/code&gt;). The more we move ahead, the more the
maintainers apply bug fixes only. This helps fixing most of the bugs in the new
features and fixing the regressions. Once the code stabilize, the stable is
tagged.&lt;/p&gt;

&lt;h3 id=&quot;oops-this-failed&quot;&gt;Oops, this failed&lt;/h3&gt;

&lt;p&gt;For the v7.0.0, I did not think I’ll have to tag little bugfix releases soon
after. And for sure not more than once.&lt;/p&gt;

&lt;p class=&quot;DarkRed&quot;&gt;So, what happened?&lt;/p&gt;

&lt;p class=&quot;DarkRed&quot;&gt;It appeared users did not help to test out the late candidates. Years ago, we had
offlineimap enthusiasts running the latest releases, including the intermediate
candidates. Some even used to work on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;next&lt;/code&gt; development branch. They were
doing a fucking good job at either fixing or reporting issues.&lt;/p&gt;

&lt;p&gt;Lately, it looks like we’ve “lost” most of them. At least, this “team” of
testers stopped to track on new patches and latest release to try and see. As a
result, the v7.0.0 was not stable enough while I’ve strictly applied the same
release cycle policy.&lt;/p&gt;

&lt;h3 id=&quot;imagine-yourself-the-maintainer&quot;&gt;Imagine yourself the maintainer&lt;/h3&gt;

&lt;p&gt;How you work is simple. Code changes as we move forward by applying patches. You
&lt;em&gt;(the maintainer)&lt;/em&gt; feel it’s time to stabilize the code. So, you release a
candidate and let the time go. At the rhythm of feedbacks you fix some issues
and postpone the stable until all are fixed.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;Side note: as a maintainer, you’re a tester too. You’re fixing the issues you
find.&lt;/p&gt;

&lt;p class=&quot;DarkRed&quot;&gt;But this time, you get very FEW to NO feedback at all.&lt;/p&gt;

&lt;p&gt;This might mean too things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;The users did not find issues. That’s good. It means you should release the
  stable.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;No users are testing your job. You’re out of luck. If you release a stable,
  you’ll likely release a crappy version.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is what happened for this v7.0.0.&lt;/p&gt;

&lt;p&gt;IOW, the implicit contract broke. We make our best to write code and test but we
&lt;em&gt;can’t&lt;/em&gt; do all the job. &lt;strong&gt;We just can’t try our own code in the wild and see if
this work for all the possible options and servers out there.&lt;/strong&gt;&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;We used to have enthusiasts. For whatever reasons, most are gone. I suspect some
left because they felt not usefull anymore at some point in time.&lt;/p&gt;

&lt;h3 id=&quot;responsability-is-shared-somewhat&quot;&gt;Responsability is shared, somewhat&lt;/h3&gt;

&lt;p&gt;From my point of view, nobody can expect offlineimap to “magically” work without
any issue for each and new release if few contributors help. We are a small
community. We &lt;em&gt;do&lt;/em&gt; rely on you.&lt;/p&gt;

&lt;p&gt;The implicit contract is that if nobody test the code, a crappy stable will get
out despite our good will. By installing and using it, you’re finally doing the
job that was not done in late.  No one is comfortable when this happen.  Users
tend to not trust much anymore. Maintainers work in a hurry to fix issues.
Reputation decrease.&lt;/p&gt;

&lt;h3 id=&quot;a-call-for-enthusiasts&quot;&gt;A call for enthusiasts&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Join us!&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We have a “testers” team in Github. By joining, your profile can be publicly
  linked to the OfflineIMAP organization (at your own preference).&lt;/li&gt;
  &lt;li&gt;I can add you in the copy list of the emailed announces when requested.&lt;/li&gt;
  &lt;li&gt;We try to take care to credit you when you report issues with your real name.&lt;/li&gt;
  &lt;li&gt;You’re wining close proximity to the hard core team. Your own issues become
  priority because we know we can trust you: you’re learning or you already know
  how to make proper bug reports. You’ll be one of the rare people we are
  willing to provide real &lt;em&gt;private support&lt;/em&gt; to fix or enhance your environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s teamwork we enjoy.&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;You’re reading this blog post. You might be subscribed to the RSS feed or you’re
subscribed to the mailing list in order to be aware of what’s happening.  I know
you can be more a bit more involved. ,-)&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;Drop me a note that you’re willing to test releases. The more I know about your
environemnt and configuration, the more you’ll help. Let me know if I can
request you on demand. Provide both negative and positive feedbacks, &lt;em&gt;especially
for late candidates&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Contrary to wrong belief, it’s not very harmful to your precious emails. There
are ways to prevent from hard issues:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;We make backups. E.g., I use a script that takes care to snapshot the
  (dedicated) filesystem storing both my mails and the local cache, prior to
  any sync.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;When we try a new version, we first try on non-critical accounts.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As one of the hard core testers, I’ve never had to restore a backup because of
breakage. The internal design of offlineimap is robust. I don’t pretend this
will never happen. I observe this didn’t happen for now. Also, since I’m used to
test, I’ve setup a reliable environment like above for all my accounts.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The side effect is that I’m prepared in case of troubles on my most precious
accounts, too. Probably more than the lambda offlineimap user. Not because I’m a
developer or a maintainer. Only because all the environment is up and ready in
case of strong issue.&lt;/em&gt; ,-)&lt;/p&gt;
</description>
        <pubDate>Fri, 29 Jul 2016 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/development/2016/07/29/tracking-regressions.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/development/2016/07/29/tracking-regressions.html</guid>
        
        
        <category>development</category>
        
      </item>
    
      <item>
        <title>how to ignore UIDs</title>
        <description>
&lt;p&gt;When offlineimap is on trouble, it’s now possible to ignore UIDs.&lt;/p&gt;

&lt;!--more--&gt;

&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#the-copy_ignore_eval-feature&quot; id=&quot;markdown-toc-the-copy_ignore_eval-feature&quot;&gt;The copy_ignore_eval feature&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#output-sample&quot; id=&quot;markdown-toc-output-sample&quot;&gt;Output sample&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;the-copy_ignore_eval-feature&quot;&gt;The copy_ignore_eval feature&lt;/h3&gt;

&lt;p&gt;If UIDs can’t be correctly synced for whatever reason, it might be usefull to
ignore them. This allows to workaround issues or postpone a bug report.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;This feature will be included in v7.0.0.&lt;/p&gt;

&lt;p&gt;Here is the configuration file extract:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# This option stands in the [Repository RemoteExample] section.
#
# If offlineiamp is having troubles to download some UIDS, it&apos;s possible to get
# them ignored in a list. This only ignore the download.
#
# The function must return the list of UIDs (integers), None otherwise. It is
# passed the folder name (using the remote name with the remote separator,
# likely &apos;/&apos;).
#
#copy_ignore_eval = lambda foldername: {&apos;INBOX&apos;: [2, 3, 4]}.get(foldername)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The UID numbers to ignore are in a list which is mapped to the folder name.&lt;/p&gt;

&lt;h3 id=&quot;output-sample&quot;&gt;Output sample&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Folder INBOX/sp&amp;amp;AOk-cial [acc: Test]:
 IGNORED: Copy message UID 2428 RemoteTest:INBOX/sp&amp;amp;AOk-cial -&amp;gt; LocalTest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Mon, 18 Jul 2016 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/configuration/2016/07/18/ignoring-UIDs.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/configuration/2016/07/18/ignoring-UIDs.html</guid>
        
        
        <category>configuration</category>
        
      </item>
    
      <item>
        <title>improving the policy about the imaplib2 library</title>
        <description>
&lt;p&gt;Since John left the project, many users and contributors asked why imaplib2 (the
IMAP library) is packaged within offlineimap.&lt;/p&gt;

&lt;!--more--&gt;

&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#code-duplication&quot; id=&quot;markdown-toc-code-duplication&quot;&gt;Code duplication?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#updating-imaplib2-only&quot; id=&quot;markdown-toc-updating-imaplib2-only&quot;&gt;Updating imaplib2 only?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#the-new-policy&quot; id=&quot;markdown-toc-the-new-policy&quot;&gt;The new policy&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#official-support&quot; id=&quot;markdown-toc-official-support&quot;&gt;Official support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In an ideal world, any Python dependency not in Python core is declared as
dependency and that’s all. Pypi helps handling the dependencies.&lt;/p&gt;

&lt;p&gt;In offlineimap, the main dependency is imaplib2. Since the early days, it is
packaged with offlineimap and I usually hear that users would benefit from
having imaplib2 packaged outside for mainly two reasons:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;imaplib2 could be updated wihout updating offlineimap.&lt;/li&gt;
  &lt;li&gt;This would avoid code duplication.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While this makes sense at the first glance, I don’t think this would benefit
most users.&lt;/p&gt;

&lt;h3 id=&quot;code-duplication&quot;&gt;Code duplication?&lt;/h3&gt;

&lt;p&gt;Well, if you actually &lt;strong&gt;install&lt;/strong&gt; any other software depending on imaplib2
&lt;strong&gt;and&lt;/strong&gt; that you care about &lt;strong&gt;92Ko&lt;/strong&gt; of disk space, then you might wonder about
this code duplication.&lt;/p&gt;

&lt;p&gt;In real life, few other projects are using imaplib2. Most distributions don’t
even package imaplib2.  In distributions packaging imaplib2, I’m not aware of
any other package depending on this library.&lt;/p&gt;

&lt;p&gt;Code duplication is not a real issue. The distributions having strong policies
in this area are already doing the job of removing imaplib2 in our sources and
packaging it outside.&lt;/p&gt;

&lt;p&gt;If imaplib2 were removed from our sources, I wonder that package maintainers
would not maintain it much wisely. They would not pay the attention it requires
because it’s a small file and it’s not widely used. They would likely spend
their time on other issues and more important packages.&lt;/p&gt;

&lt;h3 id=&quot;updating-imaplib2-only&quot;&gt;Updating imaplib2 only?&lt;/h3&gt;

&lt;p&gt;Hmm, let’s get the full picture.&lt;/p&gt;

&lt;p&gt;Offlineimap is built as a big wrapper on top of imaplib2. It is definetly very
tied to imaplib2. Offlineimap has always been shipped with imaplib2. Actually,
imaplib2 is a one file library to allow bundling it like we do. We don’t diverge
from upstream and we closely work with upstream.&lt;/p&gt;

&lt;p&gt;imaplib2 is moving slowly. At least, not as fast as offlineimap. Each time we
see a new version of imaplib2, we first check that the changes are fine and if
they are, we update it in our sources. When not sure, we integrate imaplib2 at
correct times in the release cycle so it can be tested enough and validate the
update. It already happened that imaplib2 was not updated or downgraded in our
sources. Some releases have been deliberately ignored for good reasons. Most
users (and even distribution maintainers) don’t know when there are issues in
imaplib2. Usually, they just pick a recent enough version and use it.&lt;/p&gt;

&lt;p&gt;Lot of changes in imaplib2 have been reported, initiated or even made by the
offlineimap contributors. I think we are in a good position to know which is the
best version of imaplib2 that offlineimap should work with. This policy is
working well.&lt;/p&gt;

&lt;p&gt;Removing imaplib2 would break historical assumptions that imaplib2 is bundled in
offlineimap.  This would not be an issue if all users knew how to handle Python
libraries correctly. I don’t think this is the case. We could learn them how to
do this but I’m pretty sure most just don’t care and don’t want to care about
that.&lt;/p&gt;

&lt;p&gt;Also, I know for sure that our users are used to download the tarball or simply
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git clone&lt;/code&gt; and run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./offlineimap.py&lt;/code&gt; directly. This is what we have everywhere
in our docs and what we request to do while helping and digging into issues. As
a maintainer, I like the idea of just downloading offlineimap and run it
directly.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;Since v7.0.0-rc2, this statement is not true anymore. With the support for
Python 3, we made the choice to use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;six&lt;/code&gt; dependency. We don’t package it.
However, contrary to imaplib2, six is widely used and I expect that all the
distributions are packaging this library.&lt;/p&gt;

&lt;p&gt;Finally, relying on an external imaplib2 would mean we would have to handle
different versions of imaplib2 in the code and the bug reports. This would be
much more additional work for our small team.&lt;/p&gt;

&lt;h3 id=&quot;the-new-policy&quot;&gt;The new policy&lt;/h3&gt;

&lt;p&gt;There’s no way in my mind we would benefice from removing the bundled imaplib2.&lt;/p&gt;

&lt;p&gt;However, we have ways to make the life easier for both the distribution
maintainers and users/developers wanting to play with other versions of
imaplib2.&lt;/p&gt;

&lt;p&gt;This is why “superseding” the bundled imaplib2 version is now allowed.&lt;/p&gt;

&lt;p&gt;Since v7.0.0-rc2, offlineimap imports a virtual imaplib2. This virtual library
is in charge of importing the real imaplib2. The policy is the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Try to load imaplib2 from the system (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PYTHONPATH&lt;/code&gt;). If found, check that the
version is allowed and recent enough and use it.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;If not found or if the version is not allowed, load the bundled imaplib2.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p class=&quot;note&quot;&gt;Currently, the code allows &lt;strong&gt;&lt;em&gt;any newer release&lt;/em&gt;&lt;/strong&gt; than the bundled imaplib2
version. I expect we will stick to this policy.&lt;/p&gt;

&lt;h3 id=&quot;official-support&quot;&gt;Official support&lt;/h3&gt;

&lt;p&gt;While loading and running a newer version is allowed, this does &lt;strong&gt;not&lt;/strong&gt; mean
this release is officialy supported for offlineimap.&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Actually, I decided we will only support offlineimap when it is using the exact
same version as the bundled version of imaplib2.&lt;/p&gt;

&lt;p&gt;This is not an offense. As said previously, offlineimap is a big wrapper of
imaplib2 and there are assumptions in the code regarding imaplib2. This is
historical heritage and it’s hard to get rid of this.&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;With this new policy, I think we are reaching enough flexibility for anyone
wanting/needing tuning while still providing the best by default.&lt;/p&gt;
</description>
        <pubDate>Tue, 14 Jun 2016 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/development/2016/06/14/dependencies-policy.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/development/2016/06/14/dependencies-policy.html</guid>
        
        
        <category>development</category>
        
      </item>
    
      <item>
        <title>offlineimap learns Python 3 support</title>
        <description>
&lt;!--more--&gt;

&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#what-to-expect&quot; id=&quot;markdown-toc-what-to-expect&quot;&gt;What to expect&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#what-not-to-expect&quot; id=&quot;markdown-toc-what-not-to-expect&quot;&gt;What NOT to expect&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#known-issues&quot; id=&quot;markdown-toc-known-issues&quot;&gt;Known issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the great work done by &lt;a href=&quot;https://github.com/dolohow&quot;&gt;Łukasz Żarnowiecki&lt;/a&gt;,
offlineimap starting from v7.0.0-rc2 can run with Python 3.&lt;/p&gt;

&lt;p&gt;This feature is marked &lt;em&gt;EXPERIMENTAL&lt;/em&gt; for now because it’s still very new.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;You’re very welcome to test this feature and report bugs in &lt;a href=&quot;https://github.com/OfflineIMAP/offlineimap/issues&quot;&gt;our issues
tracker&lt;/a&gt; and the &lt;a href=&quot;mailto:offlineimap-project@alioth-lists.debian.net&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;&lt;strong&gt;Thank you Łukasz!&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;what-to-expect&quot;&gt;What to expect&lt;/h3&gt;

&lt;p&gt;With Python 3, some bugs gets fixed. The ones that come to my mind are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/OfflineIMAP/offlineimap/issues/81&quot;&gt;lots of CPU wakeups&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/OfflineIMAP/offlineimap/issues/143&quot;&gt;Py2 ConfigParser doesn’t raise errors on multiple same-named sections&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;what-not-to-expect&quot;&gt;What NOT to expect&lt;/h3&gt;

&lt;p&gt;Improved encodings support. It is true that Python 3 has much better support for
Unicode than Python 2. However (you likely already know it), supporting
encodings other than UTF-7 with offlineimap is hard, very hard. So, I don’t
expect this feature to come while Python 2 is supported.&lt;/p&gt;

&lt;h3 id=&quot;known-issues&quot;&gt;Known issues&lt;/h3&gt;

&lt;p&gt;If you have enabled the &lt;em&gt;unsupported&lt;/em&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;decodefoldernames&lt;/code&gt; configuration option
or if your are using your own tricks to have other encodings than (IMAP) UTF-7
for your Maildirs, be aware that the FMD5 won’t match. This will cause issues
while syncing.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;Users following the expected usage of offlineimap are not concerned.&lt;/p&gt;
</description>
        <pubDate>Sat, 04 Jun 2016 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/development/2016/06/04/python3-support.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/development/2016/06/04/python3-support.html</guid>
        
        
        <category>development</category>
        
      </item>
    
      <item>
        <title>sqlite becomes the default</title>
        <description>
&lt;!--more--&gt;

&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#the-change&quot; id=&quot;markdown-toc-the-change&quot;&gt;The change&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#prevent-from-errors&quot; id=&quot;markdown-toc-prevent-from-errors&quot;&gt;Prevent from errors&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#other-considerations&quot; id=&quot;markdown-toc-other-considerations&quot;&gt;Other considerations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;the-change&quot;&gt;The change&lt;/h3&gt;

&lt;p&gt;After years of development and improvements, the sqlite database becomes the
default with v7.0.0-rc1. The database is used for offlineimap to track what was
already synced in the cache.&lt;/p&gt;

&lt;h3 id=&quot;prevent-from-errors&quot;&gt;Prevent from errors&lt;/h3&gt;

&lt;p&gt;This change means that downgrading from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v7.*&lt;/code&gt; to any previous release might be
prone to errors. While the migration from the (legacy) plain text database to
sqlite is seemingly handled, it is not the case the other way around. In other
words, this might lead to emails re-downloads and duplications.&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Before downgrading from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v7.*&lt;/code&gt; to any version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;6.*&lt;/code&gt;, users must make sure to
have the sqlite backend enabled in the configuration file.&lt;/p&gt;

&lt;h3 id=&quot;other-considerations&quot;&gt;Other considerations&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;While sticking to the plain text database is still possible as for now, users
  should expect this backend to become &lt;em&gt;deprecated and removed&lt;/em&gt; in the future.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Once switched of backend from plain to sqlite, you may want to manually
  delete the old cache directory in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;metadata
  directory&amp;gt;/Account-&amp;lt;account&amp;gt;/LocalStatus&lt;/code&gt; . The sqlite cache stands in the
  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalStatus-sqlite&lt;/code&gt; folder.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;
</description>
        <pubDate>Thu, 19 May 2016 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/configuration/2016/05/19/sqlite-becomes-default.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/configuration/2016/05/19/sqlite-becomes-default.html</guid>
        
        
        <category>configuration</category>
        
      </item>
    
      <item>
        <title>Our GSoC 2016 with Gentoo</title>
        <description>
&lt;p&gt;A sad story.&lt;/p&gt;

&lt;!--more--&gt;

&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#the-gsoc&quot; id=&quot;markdown-toc-the-gsoc&quot;&gt;The GSoC&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#why-gentoo&quot; id=&quot;markdown-toc-why-gentoo&quot;&gt;Why Gentoo?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#time-for-google-to-select-the-orgs&quot; id=&quot;markdown-toc-time-for-google-to-select-the-orgs&quot;&gt;Time for Google to select the orgs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#the-ranking&quot; id=&quot;markdown-toc-the-ranking&quot;&gt;The ranking&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#the-slots&quot; id=&quot;markdown-toc-the-slots&quot;&gt;The slots&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#the-accepted-projects&quot; id=&quot;markdown-toc-the-accepted-projects&quot;&gt;The accepted projects&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#after-the-facts&quot; id=&quot;markdown-toc-after-the-facts&quot;&gt;After the facts&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#our-experience&quot; id=&quot;markdown-toc-our-experience&quot;&gt;Our experience&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#why-this-blog-post&quot; id=&quot;markdown-toc-why-this-blog-post&quot;&gt;Why this blog post?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;the-gsoc&quot;&gt;The GSoC&lt;/h3&gt;

&lt;p&gt;Basically, the process is quite simple. Everybody follows the official
timeline provided by Google.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Students submit proposals based on their own ideas or the ideas provided in
  the public ideas page of the organization. Proposals describe their expected
  contributions for the project during summer.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Once the deadline for submitting proposals is reached, the mentors in the
  organization rank the proposals and the organization admins request slots to
  Google.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Google allocates a number of slots for the projects to the organizations.
  Next, the admin allocates the slots to the projects for their org.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;why-gentoo&quot;&gt;Why Gentoo?&lt;/h3&gt;

&lt;p&gt;That’s easy. They have been my first contact. Also, this was my first experience
in the GSoC program and since I’ve had a warm welcome from the admins, I decided
to rely on experienced people.&lt;/p&gt;

&lt;p&gt;Relying on an organization applying to the GSoC for several years would avoid us
some administrative tasks and allow us to learn how it’s done.&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;I was aware that there are other organizations. After all, if joining Gentoo was
incongruous they would have warned me about that.&lt;/p&gt;

&lt;h3 id=&quot;time-for-google-to-select-the-orgs&quot;&gt;Time for Google to select the orgs&lt;/h3&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;Later, I discovered that it’s not so obvious. &lt;em&gt;For example, admins at Gentoo are
having a hard time at motivating mentors to apply to the GSoC.&lt;/em&gt;&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;Having a good ideas page is definetly relevant for the org to be accepted by
Google.&lt;/p&gt;

&lt;p&gt;I’ve been surprised by the number of mentors/projects waiting for the
organization to be accepted by Google before they decide to join. Not all came
lately because of good reasons. &lt;strong&gt;There was 6 late projects for a total of 23.
This is more than 1/4!&lt;/strong&gt; The main org admin said most came lately by “pure
laziness”. I tend to agree with him on that.&lt;/p&gt;

&lt;h3 id=&quot;the-ranking&quot;&gt;The ranking&lt;/h3&gt;

&lt;p&gt;Each mentor has been requested to rank all the proposals before April 3rd to the
dashboard provided by Google:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;0: Invalid proposal.&lt;/li&gt;
  &lt;li&gt;1: Bad, I absolutely do not want this student with us this year.&lt;/li&gt;
  &lt;li&gt;2: Not good enough, we should not accept this student.&lt;/li&gt;
  &lt;li&gt;3: OK&lt;/li&gt;
  &lt;li&gt;4: Very good, we should accept this student.&lt;/li&gt;
  &lt;li&gt;5: Excellent, we absolutely have to have this student this year.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The deadline for requesting slots to Google was April 11th. During this
reviewing period, we are requested to communicate with the students and the
other mentors.&lt;/p&gt;

&lt;p&gt;Ranking is not so easy. This is mainly about the proposal but there are other
criteria to consider like the student interactions, the feedbacks from the other
mentors, the effective contributions, etc.&lt;/p&gt;

&lt;p&gt;This is a real job and I think all the mentors did their best to rank the
proposals.&lt;/p&gt;

&lt;p&gt;So far so good. We got the final results before the deadline requested by
Google. Here are the notations for the 7 best proposals, ranked in
order:&lt;/p&gt;

&lt;table class=&quot;DarkBlue&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Notation&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt; &lt;/th&gt;
      &lt;th&gt;Mentors&lt;/th&gt;
      &lt;th&gt; &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;4.14&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;em&gt;imapfw&lt;/em&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;2 mentors&lt;/em&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;(Abdó and me)&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4.125&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;gentoo&lt;/td&gt;
      &lt;td&gt;1 mentor&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;em&gt;imapfw&lt;/em&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;2 mentors&lt;/em&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;(Abdó and me)&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3.89&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;gentoo&lt;/td&gt;
      &lt;td&gt;1 mentor&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3.59&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;gentoo&lt;/td&gt;
      &lt;td&gt;4 mentors&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3.56&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;gentoo&lt;/td&gt;
      &lt;td&gt;2 mentors&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3.5&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;gentoo&lt;/td&gt;
      &lt;td&gt;1 mentor&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;This table is mine. We were asked to rank on the dashboard so it’s easy to
calculate the averages.&lt;/p&gt;

&lt;p&gt;Notice that since we are new to the GSoC, the org admin decided to allocate 1
slot at most to imapfw. This was clear since the beginning. Later, it appeared
that all the proposals for imapfw were too similar to get more than one student.
Similar proposals are hard to handle because student contributions would clash.
This would not fit well for a GSoC.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;imapfw had 4 proposals for a total of 17 (actually 20 but I’m excluding the most
obvious spams). This is not bad at all compared to the other projects of the org
having at most 2 proposals. Also, our applicants were all aware of the other
applicants before applying. &lt;strong&gt;I’m happy imapfw has good traction!&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;the-slots&quot;&gt;The slots&lt;/h3&gt;

&lt;p&gt;On April 13th, slots allocation was announced. &lt;strong&gt;Gentoo had 5 slots&lt;/strong&gt;. At the
next step, the org admin has to allocate the slots for the accepted projects on
the official dashboard. The deadline was April 20th.&lt;/p&gt;

&lt;p class=&quot;DarkRed&quot;&gt;I consider this job was far from easy. Especially to select the 4th and 5th
students.&lt;/p&gt;

&lt;p&gt;Because this was not so obvious for those, the org admin decided to poll the
mentors.&lt;/p&gt;

&lt;p&gt;Extract of the poll request:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I’m having second thoughts about picking among the 6 projects we have
for our 5 slots. So, I would like to ask each of you to send me an
email with your list of 5 preferred projects from the following
students: […]. No need to rank them, just the 5 you prefer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;Notice that there are 6 projects considered by the org admin for this poll, one
of the imapfw project was already excluded while highly ranked. Also, I’m not
sure this poll made sense to decide at the bottom of the scale because listing
the 5 &lt;strong&gt;“&lt;em&gt;preferred&lt;/em&gt;“&lt;/strong&gt; projects is obviously not objective…&lt;/p&gt;

&lt;p&gt;In the selection criteria, the org admin emphasized more than once that
“&lt;em&gt;planing to be involved with gentoo in the future&lt;/em&gt;” was a contributing factor
in the decision. We didn’t became aware of it until we got irreversibly
involved. However, I thought that it was clear for everybody that imapfw
students would be interested in becoming imapfw contributors and not much for
Gentoo. During the selection process, I was trusting the org admin to get this
in mind and balance the results.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;Now that they know they are &lt;em&gt;not&lt;/em&gt; accepted to the GSoC, two of our students
expressed they intend to contribute to imapfw once they are done with their
exams! We hope to see you later!&lt;/p&gt;

&lt;h3 id=&quot;the-accepted-projects&quot;&gt;The accepted projects&lt;/h3&gt;

&lt;p&gt;On April 20th, &lt;strong&gt;&lt;em&gt;one day before the deadline&lt;/em&gt;&lt;/strong&gt;, the results of the poll were
announced: &lt;strong&gt;the imapfw project in the course was the &lt;em&gt;last&lt;/em&gt; for the 6 projects
considered in this poll.&lt;/strong&gt;&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;While I was a bit worried, this was not much an issue for me. It was not clear
he would take those result as the only relevant criteria to select the projects.
I was trusting the org admin to put those &lt;strong&gt;late and surprising results&lt;/strong&gt; in
perspective.
And the results we got are quite surprising. Even the org admin said he was
surprised.&lt;/p&gt;

&lt;p class=&quot;warning DarkRed&quot;&gt;&lt;strong&gt;I was wrong to trust the org admin. He decided to accept the projects by only
considering those late results. Hence, &lt;em&gt;none of the imapfw projects got
accepted&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was &lt;strong&gt;obviously&lt;/strong&gt; unfair:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;1 imapfw project of the top 3 was ignored in this poll.&lt;/li&gt;
  &lt;li&gt;The poll was requesting a matter of &lt;em&gt;preference&lt;/em&gt; which is a quite
subjective notion.&lt;/li&gt;
  &lt;li&gt;There were grades of technical review already available to decide.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No constructive exchanges for allocating the slots. No team work. No open
process. Only a late opaque poll, discarding the most objective ranking and
all of the work done before. Erf…&lt;/p&gt;

&lt;h3 id=&quot;after-the-facts&quot;&gt;After the facts&lt;/h3&gt;

&lt;p&gt;As mentors for imapfw we were not expecting that students interested in imapfw
had to be interested into becoming a Gentoo contributor, too. That handicaped
us.&lt;/p&gt;

&lt;p&gt;Here is an extract of the last response I got from one of the org admin after
the deadline:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;And last, but not least, if you want to run GSoC your own way, apply
as an organization yourself (google accepts plenty of small projects),
or at least choose an organization that fits better with your project
goals (PSF maybe?). You can’t blame gentoo mentors for not selecting a
project that has nothing to do with gentoo, instead of another related
project with qualified student/proposal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So,&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;This late poll was uncalled for.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The results of this poll could be put in perspective to get the full
  picture but this was not done.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The accepted projects are explicitly neither the best quality according to
  the internal evluation of the projects nor the pairs of mentors/students with
  the best chances to succeed.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I don’t blame the mentors. I think anyone of us realized what was going
to happen while responding this late poll.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;Thanks to this org admin for the honest response.&lt;/p&gt;

&lt;h3 id=&quot;our-experience&quot;&gt;Our experience&lt;/h3&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;First, I’d like to thank all of our applicants for this GSoC. &lt;strong&gt;You did a good
job and we had real fun time with you. Please, accept the sincere apologies from
Abdó and I. We both would certainly not have make this GSoC with Gentoo if we
could imagine how it turned out to be.&lt;/strong&gt; We are sad this GSoC experience has
been biased like that.&lt;/p&gt;

&lt;p&gt;I’m not crying because we didn’t get a slot. I regret we didn’t get a slot while
we had 2 of the 3 best projects. As mentors, we obeyed all the requests from the
org admins in due time. We definetely applied all of them. Never heard
complaints either. I regret the mentors were finally not considered to evaluate
the success of the projects.&lt;/p&gt;

&lt;p&gt;Actually, I’m mainly blaming myself. I guess that what happened is part of the
game, at least at Gentoo.&lt;/p&gt;

&lt;p&gt;Perhaps I should have asked what are the exact criteria to select the projects.
I never asked if we could be handicaped by joining Gentoo as a sub-org, either.
I probably should have started discussions when I’ve had doubts on the selection
process. &lt;em&gt;Instead, I was trusting the org admins to draw the full picture by
themselves and encourage discussions to decide what projects to accept.&lt;/em&gt; I was
wrong.&lt;/p&gt;

&lt;p&gt;My apologies to the students.&lt;/p&gt;

&lt;h3 id=&quot;why-this-blog-post&quot;&gt;Why this blog post?&lt;/h3&gt;

&lt;p&gt;I’m having a hard time to explain our students what they did wrong and why they
are not accepted. I’d rather be honest about what happened and why they are
disqualified. It’s not easy task to do right in my position.&lt;/p&gt;

&lt;p&gt;Also, I want the org admins to get a chance to catch what I’m saying to the
students so they can provide their own feedbacks. It’s well possible we did
things wrong as mentors while we didn’t got hints about that. Maybe this
feedback can help them to improve their internal process while accepting
sub-orgs, too.&lt;/p&gt;

&lt;p&gt;I believe that sharing our experience might be beneficial to other umbrella and
sub-orgs in the future. This experience was not a pleasure.&lt;/p&gt;

&lt;p&gt;Finally, most of us didn’t started contributing in open source via the GSoC
program. The main reason for me to be involved was to help students being
involved. I’ll continue outside of the GSoC.&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;&lt;strong&gt;Thanks a lot to Abdó&lt;/strong&gt; who spent quite some time for this GSoC!&lt;/p&gt;
</description>
        <pubDate>Sat, 23 Apr 2016 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/gsoc2016/2016/04/23/GSoC2016-with-Gentoo.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/gsoc2016/2016/04/23/GSoC2016-with-Gentoo.html</guid>
        
        
        <category>GSoC2016</category>
        
      </item>
    
      <item>
        <title>Why Github pull requests suck so hard</title>
        <description>
&lt;p&gt;One thing that really irritates me at Github is the pull request feature.
&lt;strong&gt;Almost all about this feature is done wrong.&lt;/strong&gt;&lt;/p&gt;

&lt;!--more--&gt;

&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#signing-the-patches&quot; id=&quot;markdown-toc-signing-the-patches&quot;&gt;Signing the patches&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#managing-pull-requests&quot; id=&quot;markdown-toc-managing-pull-requests&quot;&gt;Managing pull requests&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#notifications&quot; id=&quot;markdown-toc-notifications&quot;&gt;Notifications&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#tracking-changes&quot; id=&quot;markdown-toc-tracking-changes&quot;&gt;Tracking changes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#inter-diffs&quot; id=&quot;markdown-toc-inter-diffs&quot;&gt;Inter-diffs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#history-deletions&quot; id=&quot;markdown-toc-history-deletions&quot;&gt;History deletions&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#addressing-pr-to-reviewers&quot; id=&quot;markdown-toc-addressing-pr-to-reviewers&quot;&gt;Addressing PR to reviewers&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#granting-reviewers-and-testers&quot; id=&quot;markdown-toc-granting-reviewers-and-testers&quot;&gt;Granting reviewers and testers&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#pr-by-email&quot; id=&quot;markdown-toc-pr-by-email&quot;&gt;PR by email&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#continous-integration&quot; id=&quot;markdown-toc-continous-integration&quot;&gt;Continous Integration&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#encouraging-good-practices&quot; id=&quot;markdown-toc-encouraging-good-practices&quot;&gt;Encouraging good practices&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#conlusion&quot; id=&quot;markdown-toc-conlusion&quot;&gt;Conlusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;signing-the-patches&quot;&gt;Signing the patches&lt;/h3&gt;

&lt;p&gt;Github offers no way to add your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Signed-off-by&lt;/code&gt; line to the patches you merge
from the webapp. “Signing off” the patches at merge time is relevant information
and it means something. This is a rather common practice in communities.&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Not being able to signing off the patches on a merge is a pity.&lt;/p&gt;

&lt;h3 id=&quot;managing-pull-requests&quot;&gt;Managing pull requests&lt;/h3&gt;

&lt;p&gt;When a contributor sends a pull request it is stacked to the list of PR.&lt;/p&gt;

&lt;p&gt;Tracking changes in this list is a pain. New pull requests since your previous
visit aren’t highlighted. The list of pull request is lacking lot of features
like personal &lt;em&gt;prioritization, bookmarking, etc&lt;/em&gt;.&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Expect to consume a lot of time only for managing your pull requests at Github.&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;@Github: shared labels can’t address everything.&lt;/p&gt;

&lt;h3 id=&quot;notifications&quot;&gt;Notifications&lt;/h3&gt;

&lt;p&gt;The most important task before merging any change is the peer review. Skipping
this process is &lt;em&gt;very &lt;strong&gt;very&lt;/strong&gt;&lt;/em&gt; bad. Hence, proper notifications are critical.
However, the way Github has PR implemented is the best way for skipping it.&lt;/p&gt;

&lt;p&gt;Email notifications are randomly served. Sometimes you’ll get notifications,
sometimes not.&lt;/p&gt;

&lt;p&gt;Online notifications are a bit better while the &lt;a href=&quot;https://github.com/notifications&quot;&gt;notifications
page&lt;/a&gt; happily mix everything.&lt;/p&gt;

&lt;p&gt;The best workaround would be to associate an issue to each PR. Not very glorious
when you know it doesn’t address all the points above and that it can’t be
created automatically by enabling a configuration setting.&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Github notifications for PR are a joke.&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;@Github, this issue is know for YEARS.&lt;/p&gt;

&lt;h3 id=&quot;tracking-changes&quot;&gt;Tracking changes&lt;/h3&gt;

&lt;p&gt;Contributors learn this soon. Getting changes merged upstream might require far
more than one shot. Hence, the first simplest feature one &lt;strong&gt;needs&lt;/strong&gt; is to go
back and forth accross the different versions of the submissions. Comparing
revisions of the submissions is &lt;strong&gt;required&lt;/strong&gt; to make a proper review.&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Forget about that. Github is in no help. It lacks the notion of &lt;strong&gt;“topics”&lt;/strong&gt;.
What a pain, again.&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;@Github: implementing topics (almost tags, BTW) for PR is so hard to implement?&lt;/p&gt;

&lt;h3 id=&quot;inter-diffs&quot;&gt;Inter-diffs&lt;/h3&gt;

&lt;p&gt;On top of this, the reviewing process is made much more easy when inter-diffs
are available. When working on a new submission, you usually only have the
previous submission in mind.  This is because that’s where the most relevant
information stand. Also, it’s a brain saver to work incrementally…&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Here again, Github won’t help you. All provided diffs are against the base of
the changes. You have &lt;strong&gt;no way&lt;/strong&gt; to get inter-diff generated for you easily.
While critical, it is missing.&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;@Github: of course, when the basic pre-requisites to implement this feature are
missing (the notion of topics), no one will expect inter-diffs to become reality
one day or another.&lt;/p&gt;

&lt;h3 id=&quot;history-deletions&quot;&gt;History deletions&lt;/h3&gt;

&lt;p&gt;This one is &lt;strong&gt;big&lt;/strong&gt;. You can actually lose all your reviewing job. All comments
are &lt;strong&gt;deleted&lt;/strong&gt; and &lt;strong&gt;lost&lt;/strong&gt; if the sender erase the PR with another one having
the same branch name. 👏&lt;/p&gt;

&lt;p&gt;I wonder if Github offers other ways to lose your job…&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Big thanks to Github for this one! Losing work is always a pleasure.&lt;/p&gt;

&lt;h3 id=&quot;addressing-pr-to-reviewers&quot;&gt;Addressing PR to reviewers&lt;/h3&gt;

&lt;p&gt;When changing code, it’s welcome to address the changes you wrote to the
original authors and the others contributors who made changes around yours. It’s
easy to retrieve their name and emails with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git blame&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tig blame&lt;/code&gt; and cc’
them by mail. However, that’s unhelpful with Github.&lt;/p&gt;

&lt;p&gt;The best workaround would be to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@mention&lt;/code&gt; the other contributors but this would
require you to know the nick names for all of them. This is not something you’re
going to remember nor easily retrieve, really. Finally, the contributors won’t
call for reviews.&lt;/p&gt;

&lt;p&gt;Also, not everyone agree to use your service, Github. Thanks for considering
them, too.&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Hence, adressing a PR to the best reviewers is yet another true pain.&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;@Github: why don’t you provide a form when the user make a PR to send email
notifications, including those not subscribed?&lt;/p&gt;

&lt;h3 id=&quot;granting-reviewers-and-testers&quot;&gt;Granting reviewers and testers&lt;/h3&gt;

&lt;p&gt;When working in teams, it’s important to grant the contributors for their work.
When it comes to reviewing, the standard way of doing so is by adding
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Reviewed-by&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Acked-by&lt;/code&gt; and the likes to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Signed-off-by&lt;/code&gt; lines.&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Github lacks a way to grant reviewers and testers.&lt;/p&gt;

&lt;h3 id=&quot;pr-by-email&quot;&gt;PR by email&lt;/h3&gt;

&lt;p&gt;What about hooks? I know so many organizations and maintainers out-there would
love to get the patches from pull requests automatically sent to their mailing
list. &lt;strong&gt;This would FIX almost all of the above issues in ONE SHOT!&lt;/strong&gt;&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Github was requested for this feature FOR YEARS and never made the first step to
support it. Thank you.&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;@Github: how long are you going to ignore the feedbacks of you users?&lt;/p&gt;

&lt;h3 id=&quot;continous-integration&quot;&gt;Continous Integration&lt;/h3&gt;

&lt;p&gt;One thing Github has usefull is integration of third services. For example,
Travis CI greatly helps testing PR. What is missing is a way to append the
&lt;strong&gt;commit message&lt;/strong&gt; with the success/failure information.&lt;/p&gt;

&lt;p&gt;Also, people tend to rely on the tests blindly. However, having the tests pass
is not enough and won’t replace peer review.&lt;/p&gt;

&lt;h3 id=&quot;encouraging-good-practices&quot;&gt;Encouraging good practices&lt;/h3&gt;

&lt;p&gt;Contributors are willing to send pull requests with Github. &lt;em&gt;I’d even say some
users don’t understand anymore why I’m in favor of sending patches by emails.&lt;/em&gt;
The service supports the feature… Why not use it?&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Sending patches to the mailing list is still a best because Github support of PR
is &lt;strong&gt;wrong by many ways&lt;/strong&gt;.&lt;/p&gt;

&lt;p class=&quot;DarkRed&quot;&gt;To go a bit further, I’d even say &lt;strong&gt;the current implementation is a team
killer&lt;/strong&gt;. &lt;strong&gt;If most users don’t get the patches in their INBOX, they just won’t
take the pain to provide reviews.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, I know. Github displays the commands to fetch the patches on the PR page.
&lt;strong&gt;Do you really expect all the reviewers to connect, checkout each PR one by
one, execute those commands, checkout the changes locally, return online to the
pull request page and find all the relevant excepts to add comments?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As a side effect, some long-term contributors get discouraged to provide
feedbacks and stop to provide reviews when they don’t just leave the project.
While the &lt;strong&gt;interactions between members are critical, Github’s way of handling
pull requests will perversely turn down all the emulation of the community
members quickly. Fun is lost. Motivation gets lost.&lt;/strong&gt; A lot of contributors (not
comfortable with the provided process for reviews) will stop contributing soon.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I am CERTAIN this is HOW we lost MOST of our OCCASIONAL but LONG-TERM
contributors. Still, NOBODY but the maintainer does code review in our projects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;@Github: Thank you Github. Their feedbacks were very usefull and greatly
appreciated. While peer review was the norm is our community, it is completely
lost today.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I’m aware of the integration services. No one can revamp the peer review
process correctly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;conlusion&quot;&gt;Conlusion&lt;/h3&gt;

&lt;p class=&quot;DarkRed&quot;&gt;&lt;strong&gt;Working with PR and encouraging code reviews in teams is a nightmare with
Github©.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not using this feature at all is the best. You know why.&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Finally, removing the support for pull requests is not available. THAT SUCKS
HARD.&lt;/p&gt;

&lt;p&gt;It’s easy to understand why Github don’t enable this feature. If you make your
repository public and people want to contribute, they will likely use the
integrated PR feature. Hence, you’re almost forced to use Github if you don’t
want to discard contributions for your project. IOW, publicing your project on
Github is far more than just open your work to the public: you have to connect
to the webapp or use whatever client at some point in time. In pratice, rather
often than occasionaly. &lt;strong&gt;The more a maintainer will use a platform, the more
contributors feel the need of using it, too.&lt;/strong&gt; The result is that this strongly
increases the number of users for Github. &lt;strong&gt;This is the real reason why we can’t
disable PR. &lt;em&gt;You&lt;/em&gt; are used as a &lt;em&gt;marketing promoter&lt;/em&gt;. Not by what you could say,
but by what you actually DO.&lt;/strong&gt;&lt;/p&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;@Github: is there no other way to convince new users to sign up to your website
than almost &lt;strong&gt;forcing maintainers&lt;/strong&gt; to accept PR in their public repositories?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One day or another, we will move away from github. This will be for good
reasons.&lt;/strong&gt;&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;A meaningful blog post on this topic: &lt;a href=&quot;http://blog.wikichoon.com/2014/04/github-doesnt-support-pull-request.html&quot;&gt;Github doesn’t support pull-request
notifications to mailing
lists&lt;/a&gt;,
by Cole Robinson&lt;/p&gt;

&lt;p&gt;Feel free to join the chat and provide your point of you!&lt;/p&gt;
</description>
        <pubDate>Tue, 08 Mar 2016 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/github/2016/03/08/github-pr-suck.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/github/2016/03/08/github-pr-suck.html</guid>
        
        
        <category>github</category>
        
      </item>
    
      <item>
        <title>GSoC 2016, we are accepting students to work on imapfw!</title>
        <description>
&lt;p&gt;This year, we applied to the &lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code 2016&lt;/a&gt; via the &lt;a href=&quot;https://wiki.gentoo.org/wiki/Google_Summer_of_Code/2016/Ideas&quot;&gt;Gentoo organization&lt;/a&gt;, our umbrella organization.&lt;/p&gt;

&lt;p&gt;Since Gentoo is accepted, students interested to work on &lt;a href=&quot;http://imapfw.offlineimap.org&quot;&gt;imapfw&lt;/a&gt; should contact us!&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Know more:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.offlineimap.org/gsoc/&quot;&gt;ideas list&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.offlineimap.org/gsoc/helpers.html&quot;&gt;helpers&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://imapfw.offlineimap.org&quot;&gt;imapfw&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Mon, 29 Feb 2016 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/imapfw/gsoc2016/2016/02/29/students-welcome.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/imapfw/gsoc2016/2016/02/29/students-welcome.html</guid>
        
        
        <category>imapfw</category>
        
        <category>GSoC2016</category>
        
      </item>
    
      <item>
        <title>A tale of FMD5 (or upgrading offlineimap from 6.3.4 to 6.6.1)</title>
        <description>
&lt;p&gt;While upgrading my Debian machine from jessie to stretch, offlineimap was upgraded from 6.3.4 to 6.6.1 and it had a unexpected effect in my case.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p class=&quot;note&quot;&gt;&lt;i class=&quot;fa fa-flag fancy&quot; style=&quot;color:DarkBlue&quot;&gt; &lt;/i&gt;
&lt;br /&gt;
Since the time of this writing, &lt;strong&gt;OfflineIMAP v6.7.0 learned the CLI option
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--migrate-fmd5-using-nametrans&lt;/code&gt;.  You should use this feature for your
updates!&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;
For versions from 6.3.5 up to 6.7.0, check out if your distribution
maintainer has backported this feature for you: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;offlineimap -h&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;initial-configuration-and-decision-to-upgrade&quot;&gt;Initial configuration and decision to upgrade&lt;/h2&gt;

&lt;p&gt;I saw the big warning in the Debian NEWS file about the “nametrans” change:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  Reverse nametrans
    +++++++++++++++++

    Starting with v6.4.0, OfflineImap supports the creation of folders
        on the remote repostory. This change means that people that
        only had a nametrans option on the remote repository
        (everyone) will need to have a nametrans setting on the local
        repository too that will reverse the name transformation.

    For further information, see documentation about this feature at:

      file:///usr/share/doc/offlineimap/html/nametrans.html#reverse-nametrans
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But after reading carefully the linked documentation my configuration seemed to be Ok. To be clear my configuration includes the following snippets.&lt;/p&gt;

&lt;p&gt;For Local repositories:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;    &lt;span class=&quot;n&quot;&gt;folderfilter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foldername&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foldername&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;startswith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;localprefix.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;nametrans&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foldername&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;trans_local&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foldername&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;localprefix&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;For Remote repositories:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;    &lt;span class=&quot;n&quot;&gt;nametrans&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foldername&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;trans_remote&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foldername&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;localprefix&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;which use those functions&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;trans_local&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foldername&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prefix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foldername&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;startswith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prefix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foldername&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prefix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;#raise AssertionError(&quot;config of nametrans with prefix &apos;&quot;+prefix+&quot;&apos; is not good&quot;)
&lt;/span&gt;            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;notfound_&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prefix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;_&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foldername&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;trans_remote&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foldername&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prefix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
           &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prefix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foldername&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;the-unexpected-effect&quot;&gt;The unexpected effect&lt;/h2&gt;

&lt;p&gt;So far so good.&lt;/p&gt;

&lt;p&gt;I upgrade, modify the completely unrelated ssl parameters, and just wait for my automatic mail process (I have offlineimap in a crontab) to continue business as usual.&lt;/p&gt;

&lt;p&gt;And I wait, and I wait, and after some time I just wonder what the hell offlineimap is doing. And I found out that it was completely re-uploading all my mails. I have some accounts with more than 5G of mails and with the crappy connexion I had, it took forever.&lt;/p&gt;

&lt;p&gt;I stopped offlineimap, deactivated all my crontabs and investigated the problem.&lt;/p&gt;

&lt;p&gt;I think that the problem comes from the use of nametrans in visiblename for Maildir folder (commit &lt;a href=&quot;https://github.com/OfflineIMAP/offlineimap/commit/6b2ec956cfe8e356d3ffd54eee34773deb73279f&quot;&gt;Apply nametrans to all Foldertypes&lt;/a&gt;) because it leads to change the &lt;a href=&quot;http://docs.offlineimap.org/en/latest/FAQ.html#id32&quot;&gt;FMD5 part&lt;/a&gt; of the filename calculated by offlineimap.&lt;/p&gt;

&lt;p&gt;Offlineimap thus believed that I removed all my mails and added it back. With no way for it to detect it was the same mails. It then reuploaded all the “new” mail before deleting all the “old” mail which is really inefficient.&lt;/p&gt;

&lt;p&gt;My problem was exactly the inverse of the one in &lt;a href=&quot;https://kdecherf.com/blog/2015/09/12/how-not-to-migrate-emails-between-gmail-accounts/&quot;&gt;this blog post&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;how-i-avoided-to-do-some-reupload&quot;&gt;How I avoided to do some reupload&lt;/h2&gt;

&lt;p&gt;Once the problem was understood I came up with a workaround which seems to work.  The principle is to rename all filenames with the new expected name (with the new calculated md5sum) by offlineimap in concerned Maildirs.&lt;/p&gt;

&lt;p&gt;With my setup I used this dirty hack in shell:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;    &lt;span class=&quot;nv&quot;&gt;MYPREFIX&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;localprefix
    &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;box &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/Maildir/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;MYPREFIX&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;.&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do
        &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$box&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;oldmd5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;pwd&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;s!.*/!!&apos;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;tr&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;\n&apos;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;md5sum&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;s/ *-$//&apos;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;newmd5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;pwd&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;s!.*/!!;s!^&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;MYPREFIX&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\.&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;!!&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;tr&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;\n&apos;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;md5sum&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;s/ *-$//&apos;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;dir &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;cur new &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do
            &lt;/span&gt;rename &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;s/FMD5=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;oldmd5&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/FMD5=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;newmd5&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;dir&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;done
    done&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p class=&quot;warning&quot;&gt;Note that this only works if done after the last use of offlineimap 6.3.4 and before the first use of offlineimap 6.6.1. If done at other moments I think we risk loss of mails and duplicates of mails.&lt;/p&gt;

&lt;p&gt;I opened one &lt;a href=&quot;http://bugs.debian.org/812108&quot;&gt;Debian bug&lt;/a&gt; on this matter and wait for any idea to work up this upgrade cleanly.&lt;/p&gt;
</description>
        <pubDate>Fri, 12 Feb 2016 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/configuration/2016/02/12/debian-upgrade-from-jessie-to-stretch.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/configuration/2016/02/12/debian-upgrade-from-jessie-to-stretch.html</guid>
        
        
        <category>configuration</category>
        
      </item>
    
      <item>
        <title>No, I&apos;m not using maxconnections</title>
        <description>
&lt;p&gt;I’m not using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maxconnections&lt;/code&gt; feature in the configuration file. Here is why.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h2 id=&quot;why-it-hurts&quot;&gt;Why it hurts&lt;/h2&gt;

&lt;p&gt;In the good old days of OfflineIMAP, you were probably told to enable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maxsyncaccounts&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maxconnections&lt;/code&gt; to either synchronize multiple accounts or improve performance. I would not ask you to use this feature anymore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is something hard to say but it’s true that nowadays nobody has good/full understanding on multithreading in the code.&lt;/strong&gt; Multithreading was introduced early but it appears that it badly supported all the later changes. IMAP connections internally requires locks that have to be correctly handled everywhere. While it’s commonly known to be a hard task by itself, things are currently worse because the same chunks of code can be used in different contexts (e.g.: with/without IDLE).&lt;/p&gt;

&lt;h2 id=&quot;a-workaround&quot;&gt;A workaround&lt;/h2&gt;

&lt;p&gt;Those configuration options were the only way to synchronize multiple accounts because of a &lt;strong&gt;global lock&lt;/strong&gt;. OfflineIMAP used to allow only one instance of the program. For some years, things have changed: locking is done at the account level.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;See &lt;a href=&quot;https://github.com/OfflineIMAP/offlineimap/commit/45782ca3ac72119ac3af276cbfc763c72fada86f&quot;&gt;this commit&lt;/a&gt; and &lt;a href=&quot;https://github.com/OfflineIMAP/offlineimap/commit/1b85e3525678e6038614e0510c0be7f7bc179f88&quot;&gt;this one&lt;/a&gt; for details.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks to Sebastian Spaeth&lt;/em&gt;, running OfflineIMAP more than once is fine &lt;em&gt;as long as it’s not with the same account(s)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That’s what greatly helps: running multiple instances is a good workaround of the messing code. This way, you only rely on code about locking at the account level &lt;em&gt;which required only &lt;a href=&quot;https://github.com/OfflineIMAP/offlineimap/commit/1b85e3525678e6038614e0510c0be7f7bc179f88&quot;&gt;23 lines of change&lt;/a&gt; when introduced&lt;/em&gt;. Much better than having to rely on locks spread all over the code about IMAP sessions, each handled by one Python thread.&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Because OfflineIMAP proved to have some glitches with multithreading, my advice is you should &lt;strong&gt;make your best to avoid weird errors&lt;/strong&gt; and tracebacks: simply avoid &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maxsyncaccounts&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maxconnections&lt;/code&gt; if you can.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;That’s why I’m much more confident with multiple instances running at the same time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;note&quot;&gt;&lt;i class=&quot;fa fa-flag fancy&quot; style=&quot;color:DarkBlue&quot;&gt; This advice is not always possible &lt;/i&gt;
If you want to enable IDLE with &lt;strong&gt;more than one folder&lt;/strong&gt;, you can’t apply. &lt;em&gt;Each IDLE folder requires a dedicated IMAP connection&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;running-more-than-one-offlineimap-instance&quot;&gt;Running more than one OfflineIMAP instance&lt;/h2&gt;

&lt;p&gt;In order to synchronize all my accounts in one command, I wrote a shell script with this kind of tricks:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;offlineimap &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; account_one &amp;amp; &lt;span class=&quot;nv&quot;&gt;pid1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$!&lt;/span&gt;
offlineimap &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; account_two &amp;amp; &lt;span class=&quot;nv&quot;&gt;pid2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$!&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;wait&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$pid1&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;wait&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$pid2&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Last execution: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p class=&quot;DarkBlue&quot;&gt;Ok, I agree with you this full thing is not glorious. But it’s effective. And if you hit weird errors, you might like to be aware it’s possible to improve stability. ,-)&lt;/p&gt;
</description>
        <pubDate>Fri, 29 Jan 2016 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/configuration/2016/01/29/why-i-m-not-using-maxconnctions.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/configuration/2016/01/29/why-i-m-not-using-maxconnctions.html</guid>
        
        
        <category>configuration</category>
        
      </item>
    
      <item>
        <title>Does not have a message with UID 15541</title>
        <description>
&lt;p&gt;A message refuse to be downloaded despite reported as a mail with an UID. Server or OfflineIMAP then say that the account does not have that UID, and fetch of the message fails.&lt;/p&gt;

&lt;!--more--&gt;

&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#background&quot; id=&quot;markdown-toc-background&quot;&gt;Background&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#installed-offlineimap-and-got-trouble&quot; id=&quot;markdown-toc-installed-offlineimap-and-got-trouble&quot;&gt;Installed OfflineIMAP and got trouble&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#is-this-a-problem-of-offlineimap&quot; id=&quot;markdown-toc-is-this-a-problem-of-offlineimap&quot;&gt;Is this a problem of OfflineIMAP?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#manual-imap-session&quot; id=&quot;markdown-toc-manual-imap-session&quot;&gt;Manual imap session&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#well-described-in-the-net&quot; id=&quot;markdown-toc-well-described-in-the-net&quot;&gt;Well described in the net&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#openssl&quot; id=&quot;markdown-toc-openssl&quot;&gt;openssl&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#openssl-mail-server-session&quot; id=&quot;markdown-toc-openssl-mail-server-session&quot;&gt;openssl mail server session&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#kill-the-culprit-message&quot; id=&quot;markdown-toc-kill-the-culprit-message&quot;&gt;Kill the culprit message&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#conclusion&quot; id=&quot;markdown-toc-conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;

&lt;p&gt;My private mail accounts are served by remote servers. One of them (one of two) is a remain from my studies at the university KTH in Stockholm Sweden. They kindly let you keep the mail address and also they are not tight-fisted on storage space.&lt;/p&gt;

&lt;p&gt;I’m a Mutt user. Starting out with Mutt, I was using it’s built-in functionality to connect to the server and read my mail. Being curious on other mail user agents, (to make fast mail body searches), I started to understand that a maildir is a good thing to have, because a number of agents work with maildirs out of the box.&lt;/p&gt;

&lt;p&gt;Through the documentation of Notmuch, OfflineIMAP was suggested as something descent for pulling down and synchronizing your mail in and out of a maildir. So let’s try with OfflineIMAP.&lt;/p&gt;

&lt;h2 id=&quot;installed-offlineimap-and-got-trouble&quot;&gt;Installed OfflineIMAP and got trouble&lt;/h2&gt;

&lt;p&gt;Or, I got half way. I got an error traceback such as&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Thread &apos;Copy message 15541 from INBOX&apos; terminated with exception:
Traceback (most recent call last):
  File &quot;/usr/lib/pymodules/python2.7/offlineimap/threadutil.py&quot;, line 140, in run
    Thread.run(self)
  File &quot;/usr/lib/python2.7/threading.py&quot;, line 763, in run
    self.__target(*self.__args, **self.__kwargs)
  File &quot;/usr/lib/pymodules/python2.7/offlineimap/folder/Base.py&quot;, line 250, in copymessageto
    message = self.getmessage(uid)
  File &quot;/usr/lib/pymodules/python2.7/offlineimap/folder/IMAP.py&quot;, line 215, in getmessage
    raise OfflineImapError(reason, severity)
OfflineImapError: IMAP server &apos;remote_kth&apos; does not have a message with UID &apos;15541&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and from there, OfflineIMAP gave up and only some mails where pulled. It turned out my OfflineIMAP version was not really the shiny new thing (a vanilla apt-get install), so I installed version 6.6.1.&lt;/p&gt;

&lt;p&gt;With that newer version, a similar traceback was given, but now OfflineIMAP persisted, so everything but some culprit mail was downloaded.&lt;/p&gt;

&lt;h2 id=&quot;is-this-a-problem-of-offlineimap&quot;&gt;Is this a problem of OfflineIMAP?&lt;/h2&gt;

&lt;p&gt;Mailing list to the rescue. On my first post to the mailing list, Nicolas responded:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If the issue is not solve, I would ask to the Microsoft support or a
forum. If OfflineIMAP wants to download this UID, it’s because the
server pretend to have this UID. IOW, I’d say it really looks like a
server issue.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gave me comfort. I was easily convinced it was an issue with the server. It was like, I sort of &lt;em&gt;wanted&lt;/em&gt; it to be an issue with the server. I mean, rather than it would be a problem with a tool made by developers who maintain a dialog with it’s users. On the other hand, in that case the problem could have been addressed properly of course, but anyway…&lt;/p&gt;

&lt;p&gt;The mailing list dialog continued:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;On Thu, Jan 21, 2016 at 08:26:15PM +0100, Tomas Nordin wrote:&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;I am in contact with the IT people there. They are not aware of UID:s.
Do you have a suggestion on how I can guide them in helping me
trouble-shoot this.&lt;/p&gt;

    &lt;p&gt;I mean, is there a suggestion of a way they can query the Imap server so
as to see the UID being reported?&lt;/p&gt;
  &lt;/blockquote&gt;

  &lt;p&gt;Manual IMAP sessions are well described in the net. ,-)&lt;/p&gt;

  &lt;p&gt;I’m pretty sure the issue comes from the exchange server. We had another
report of this in github:&lt;/p&gt;

  &lt;p&gt;https://github.com/OfflineIMAP/offlineimap/issues/296&lt;/p&gt;

  &lt;p&gt;–
Nicolas Sebrecht&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well thank you Nicolas, “Manual IMAP sessions are well described in the net”. Is that so? IMAP sessions huh? Well, OK.&lt;/p&gt;

&lt;p&gt;That other reported issue by the way, seem to share my problem also in that it was with the same kind of server.&lt;/p&gt;

&lt;h2 id=&quot;manual-imap-session&quot;&gt;Manual imap session&lt;/h2&gt;

&lt;p&gt;So it seems I was up to the task to somehow debug the mail server myself.
Because, it seemed to me I’m not going to be able to get the people over there to do it. Even if they know how to, I guess they have to say they cannot because my credentials are needed.&lt;/p&gt;

&lt;h3 id=&quot;well-described-in-the-net&quot;&gt;Well described in the net&lt;/h3&gt;

&lt;p&gt;I did not search and research that very much. This is interesting indeed, but I feel that I have other things to do than to spend days on learning much and plenty about IMAP servers and mail. Those are the links that I found and read from to get somewhere:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;http://seeit.org/2010/01/31/debug-your-imap-server-with-telnet/&quot;&gt;debug-your-imap-server-with-telnet&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.faqs.org/rfcs/rfc3501.html&quot;&gt;rfc3501&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first one was actually found by quack’ing the term “manual imap session”.
The second one is from the people trying to maintain some interoperability in the digital world, by maintaining specifications on how stuff should work.&lt;/p&gt;

&lt;h3 id=&quot;openssl&quot;&gt;openssl&lt;/h3&gt;

&lt;p&gt;On my system there is a tool preinstalled I think, at least I don’t remember installing it explicitly, called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;openssl&lt;/code&gt;. From the top of the manual:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;OpenSSL is a cryptography toolkit implementing the Secure Sockets Layer (SSL
v2/v3) and Transport Layer Security (TLS v1) network protocols and related
cryptography standards required by them.&lt;/p&gt;

  &lt;p&gt;The openssl program is a command line tool for using the various cryptography
functions of OpenSSL’s crypto library from the shell.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It comes with a sub command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s_client&lt;/code&gt;. The top of it’s manual:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The s_client command implements a generic SSL/TLS client which connects to a
remote host using SSL/TLS. It is a very useful diagnostic tool for SSL
servers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;openssl-mail-server-session&quot;&gt;openssl mail server session&lt;/h3&gt;

&lt;p&gt;I used the program &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;script&lt;/code&gt; to log my sessions with openssl, they tend to be lengthy. One need to be aware that the script program logs each and every key-press. So when viewing the log in a text editor, it might look more or less weird depending on how the editor render non-visible things, and how many back-spaces and none-charecter key-strokes was done.&lt;/p&gt;

&lt;p&gt;The connecting command of openssl was this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;openssl s_client -connect webmail.kth.se:993 -crlf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-crlf&lt;/code&gt; option translates a line feed from the terminal into CR+LF. Totally required in my case, the server I am talking to require it, and I think it is required by the RFC too.&lt;/p&gt;

&lt;p&gt;Now a lot of output is given, ending with:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;* OK The Microsoft Exchange IMAP4 service is ready.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To talk to the server, one has to adhere to a communication protocol. It is required to make up a (unique?) command identifier for each command. I went with a001, a002, and so on. I don’t know if it is strictly required to iterate the identifier, but I did that for each command or request. The session started with a log in:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;a001 login &amp;lt;user&amp;gt; &amp;lt;passwd&amp;gt;
a001 OK LOGIN completed.
a002 select INBOX
* 1233 EXISTS
* 0 RECENT
* FLAGS (\Seen \Answered \Flagged \Deleted \Draft $MDNSent)
* OK [PERMANENTFLAGS (\Seen \Answered \Flagged \Deleted \Draft $MDNSent)] Permanent flags
* OK [UNSEEN 1045] Is the first unseen message
* OK [UIDVALIDITY 14] UIDVALIDITY value
* OK [UIDNEXT 16124] The next unique identifier value
a002 OK [READ-WRITE] SELECT completed.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As a client I say &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a001&lt;/code&gt; followed by some command. The server finally responds with something, prefixed with the client command identifier. Like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a001 OK LOGIN completed.&lt;/code&gt; I can reveal already that the information given on the first unseen message, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OK [UNSEEN 1045]&lt;/code&gt;, is the culprit message.&lt;/p&gt;

&lt;p&gt;The first step was to figure out if the culprit message exist, since it was not certain given the error traceback:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;a004 fetch 1040:1050 (uid)
* 1040 FETCH (UID 15500)
* 1041 FETCH (UID 15507)
* 1042 FETCH (UID 15514)
* 1043 FETCH (UID 15516)
* 1044 FETCH (UID 15523)
* 1045 FETCH (UID 15541)
* 1046 FETCH (UID 15544)
* 1047 FETCH (UID 15545)
* 1048 FETCH (UID 15553)
* 1049 FETCH (UID 15561)
* 1050 FETCH (UID 15562)
a004 OK FETCH completed.
a005 logout
* BYE Microsoft Exchange Server 2013 IMAP4 server signing off.
a005 OK LOGOUT completed.
read:errno=0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;note&quot;&gt;When I do the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fetch&lt;/code&gt; command, I give as an argument not the UID number but something I think is referred to as the index number or message number. This number is consecutive and is not the same for one message always. It will be different when the folder is rearranged by deleting messages.&lt;/p&gt;

&lt;p&gt;The command fetch (commands are specified in the RFC spec as linked to above) take a set as an argument followed with what to fetch, (UID) in this case. Now it was clear that the message with UID 15541 is reported. Gossip on the mailing list:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;On Sun, Jan 24, 2016 at 05:13:20PM +0100, Tomas Nordin wrote:&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;So now I am hacking around with openssl s_client. Here is some output of
my session:&lt;/p&gt;

    &lt;p&gt;…&lt;/p&gt;

    &lt;p&gt;It seems to me the UID 15541 is reported. Does that prove something.
What should I do now?&lt;/p&gt;
  &lt;/blockquote&gt;

  &lt;p&gt;It seems there’s really a mail with UID 15541. Try fetching this one
alone. OfflineIMAP is doing something like&lt;/p&gt;

  &lt;p&gt;tagx FETCH 15541 (‘BODY.PEEK[]’)&lt;/p&gt;

  &lt;p&gt;–
Nicolas Sebrecht&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I made some trials to fetch the mail “manually”. Another session looked like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;a00 OK LOGIN completed.
a01 select INBOX
* 1234 EXISTS
* 0 RECENT
* FLAGS (\Seen \Answered \Flagged \Deleted \Draft $MDNSent)
* OK [PERMANENTFLAGS (\Seen \Answered \Flagged \Deleted \Draft $MDNSent)] Permanent flags
* OK [UNSEEN 1045] Is the first unseen message
* OK [UIDVALIDITY 14] UIDVALIDITY value
* OK [UIDNEXT 16130] The next unique identifier value
a01 OK [READ-WRITE] SELECT completed.
a02 fetch 1045 (uid rfc822.size flags body.peek[header.fields (date to cc from subject x-priority content-type)])
a02 OK FETCH completed.
a03 fetch 1045 (body)
* 1045 FETCH (BODY (&quot;text&quot; &quot;plain&quot; (&quot;charset&quot; &quot;iso-8859-1&quot;) NIL NIL &quot;quoted-printable&quot; 1 1) FLAGS ())
a03 OK FETCH completed.
a04 fetch 1045 (body.peek[header.fields (from subject)])
* 1045 FETCH (BODY[HEADER.FIELDS (from subject)] {127}
From: Microsoft Exchange Server 2010
Subject: Retrieval using the IMAP4 protocol failed for the following message:
15541
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There is a lot to learn in communicating with a mail server. For example, I thought that the command above &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a03 fetch 1045 (body)&lt;/code&gt;, would spit out the body of the message, but not so. (My idea of the body of the message is the part containing the human readable message). He just say some details of the message like the charset and so on and then &lt;em&gt;completed&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Then I tried to get some information out from the message like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from:&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;subject:&lt;/code&gt; (a04). It seems the message was from the server. Concerning the subject my conclusion is that the query fails. If the subject would really be “Retrieval using the IMAP4 protocol failed for the following message: 15541”, this is a recursive mind-blower for me.&lt;/p&gt;

&lt;p&gt;At &lt;a href=&quot;http://seeit.org/2010/01/31/debug-your-imap-server-with-telnet/&quot;&gt;debug-your-imap-server-with-telnet&lt;/a&gt;, a problem was described about some over-sized mail that crashed the mail box. The manual IMAP session was used to delete that one mail. This occurred very tempting to me.&lt;/p&gt;

&lt;p&gt;Nicolas said on the mailing list that it would be very interesting to fetch that whole message in raw to see what is going on. Of course I agree, but with my limited knowledge about this, and the output of my sessions, did not give me an idea how to do that. On the contrary, it seemed not possible to me. It failed even to serve the subject.&lt;/p&gt;

&lt;h3 id=&quot;kill-the-culprit-message&quot;&gt;Kill the culprit message&lt;/h3&gt;

&lt;p&gt;What to do when there is a problem with something? Kill it. And here goes the killing session:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;a02 select INBOX
* 1234 EXISTS
* 0 RECENT
* FLAGS (\Seen \Answered \Flagged \Deleted \Draft $MDNSent)
* OK [PERMANENTFLAGS (\Seen \Answered \Flagged \Deleted \Draft $MDNSent)] Permanent flags
* OK [UNSEEN 1045] Is the first unseen message
* OK [UIDVALIDITY 14] UIDVALIDITY value
* OK [UIDNEXT 16133] The next unique identifier value
a02 OK [READ-WRITE] SELECT completed.
a03 fetch 1045 (uid)
* 1045 FETCH (UID 15541)
a03 OK FETCH completed.
a04 uid fetch 15541 (uid flags)
* 1045 FETCH (UID 15541 FLAGS ())
a04 OK FETCH completed.
a05 store 1045 +flags (\Deleted)
* 1045 FETCH (FLAGS (\Deleted))
a05 OK STORE completed.
a06 fetch 1045 (uid)
* 1045 FETCH (UID 15541)
a06 OK FETCH completed.
a07 expunge
* 1045 EXPUNGE
* 1233 EXISTS
a07 OK EXPUNGE completed.
a08 fetch 1040:1050 (uid)
* 1040 FETCH (UID 15500)
* 1041 FETCH (UID 15507)
* 1042 FETCH (UID 15514)
* 1043 FETCH (UID 15516)
* 1044 FETCH (UID 15523)
* 1045 FETCH (UID 15544)
* 1046 FETCH (UID 15545)
* 1047 FETCH (UID 15553)
* 1048 FETCH (UID 15561)
* 1049 FETCH (UID 15562)
* 1050 FETCH (UID 15585)
a08 OK FETCH completed.
a09 logout
* BYE Microsoft Exchange Server 2013 IMAP4 server signing off.
a09 OK LOGOUT completed.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The killing was done by first tagging the message for deletion, (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a05 store 1045 +flags (\Deleted)&lt;/code&gt;). Then by expunging it: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a07 expunge&lt;/code&gt;. This was the most scary part, expunge take no arguments, just expunge. It kills the messages flagged for deletion, similar to the behavior in popular user agents. The RFC said that this is how it works, so I trusted them.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Since the culprit message has been killed, there is no more tracebacks raised on me. That is a relief bigger than the disappointment by not understanding what was going on with that message.&lt;/p&gt;

&lt;p&gt;I can have a theory on what this mail is, and maybe I would guess that it is a sort of auto-reply that happens when a mail cannot be sent. What do I know?&lt;/p&gt;

&lt;p&gt;However, next time I am better armed to discuss with the IT department. I will have a manual IMAP session and give them the output. Maybe then they can extract that message and see what it is. We will see.&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;Happy OfflineIMAPing!&lt;/p&gt;

&lt;hr /&gt;
&lt;blockquote&gt;
  &lt;p&gt;Update: since this post was published, the issue got further details about
&lt;a href=&quot;https://github.com/OfflineIMAP/offlineimap/issues/62&quot;&gt;what’s going on&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        <pubDate>Wed, 27 Jan 2016 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/server/imap/error/2016/01/27/error-no-such-number.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/server/imap/error/2016/01/27/error-no-such-number.html</guid>
        
        
        <category>server</category>
        
        <category>imap</category>
        
        <category>error</category>
        
      </item>
    
      <item>
        <title>users of Gmail, my mails might go to your SPAM folder</title>
        <description>
&lt;p&gt;Becare Gmail users, my emails might go to your SPAM folder! This includes those sent to the mailing list.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;It appears that Google is getting things wrong to the war against spam. While I never made spam and never got my address spoofed, I’ve had reports from users of Gmail that they are seing my mails going to the spam box.&lt;/p&gt;

&lt;p&gt;I’m not going to detail the reasons here. I am well aware about what’s going on. That’s not the point of this post. &lt;strong&gt;As a mail user complying to the netiquette, I expect my mails to reach the INBOX of the recipients. Not having them marked as spam.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don’t get me wrong, war against spam is hard. Still, false positive in spam filtering is wrong, bad and hurting for the users. This might even cause serious damages into your economy.&lt;/p&gt;

&lt;p&gt;Google appears to have very strong policies. As a consequence, many respectable mail users trying to reach you at Gmail might be discarded from your eyes.&lt;/p&gt;

&lt;p&gt;It looks like the &lt;em&gt;big company&lt;/em&gt; decided to rely on automatic rules only. At least, Google makes no efforts to fix their spam filtering issues since it is well known for years. Their policy massively affects millions of users.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;In my opinion Google Intelligence Agency makes no point into making mails right. They are too much obsessed to build and own the &lt;strong&gt;Algorithm That Will Change The World&lt;/strong&gt;.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;Also, it’s clearly not the first time that Google breaks things. Even the IMAP protocol is not correctly implemented/extended.&lt;/p&gt;

&lt;p&gt;The sad news: in this case there’s not much I can do but let you know the best way I can.&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;So, if you use Gmail, you might need to add a &lt;a href=&quot;https://support.google.com/mail/answer/6579?hl=en&quot;&gt;filtering rule&lt;/a&gt;.&lt;/p&gt;

&lt;!--
vim: ts=2 expandtab spelllang=en :
--&gt;
</description>
        <pubDate>Mon, 25 Jan 2016 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/project/2016/01/25/gmail-users-my-mails-goes-to-spam.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/project/2016/01/25/gmail-users-my-mails-goes-to-spam.html</guid>
        
        
        <category>project</category>
        
      </item>
    
      <item>
        <title>imapfw is now open to contributions</title>
        <description>
&lt;p&gt;imapfw is reaching an interesting stage for the developers. Also, I made a screencast for starting with imapfw.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;While &lt;a href=&quot;https://github.com/OfflineIMAP/imapfw&quot;&gt;imapfw&lt;/a&gt; won’t still synchronize your accounts, the framework is reaching an insteresting stage for developers.&lt;/p&gt;

&lt;p&gt;To know more about imapfw usage and internals, screencasts are available in &lt;a href=&quot;http://www.dailymotion.com/offlineimap-project&quot;&gt;this channel&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;current-state&quot;&gt;Current state&lt;/h2&gt;

&lt;p&gt;Since the publication (2 months ago), the main internals and features have either been started or done: imapfw earned 8677 physical lines through 173 commits.&lt;/p&gt;

&lt;h5 id=&quot;the-features&quot;&gt;The features&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;enable the rascal, allows key frame redefinitions.&lt;/li&gt;
  &lt;li&gt;support both multiprocessing and threading via unified internal interfaces.&lt;/li&gt;
  &lt;li&gt;asynchronous and synchronous communication between workers.&lt;/li&gt;
  &lt;li&gt;started the syncing engines, repositories, drivers and controllers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;actions&quot;&gt;Actions&lt;/h5&gt;

&lt;p&gt;Actions are real softwares packaged within the framework, actually.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;unitTests&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;syncAccounts&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;shell&lt;/code&gt;: run code with predefined contexts, optionally in interactive mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;internals&quot;&gt;Internals&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;wrapper on top of the IMAP library to work with high-level objects.&lt;/li&gt;
  &lt;li&gt;supporting python 3 hints/annotations is partially done. Will be expanded everywhere with code stabilization.&lt;/li&gt;
  &lt;li&gt;architect modules to set up the running code with workers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;what-next&quot;&gt;What next?&lt;/h2&gt;

&lt;p&gt;I expect to write code more slowly. This should benefit both myself to get more free time and contributors to not be disturbed by code changing too fast.&lt;/p&gt;

&lt;p&gt;I’m planning to start writing a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;offlineimap&lt;/code&gt; action to allow imapfw to become an alternative to the current offlineimap software in a legacy compatible way.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;This suppose supporting both the configuration file and the cache. Full compatibility is not a goal. For example, using the sqlite cache format will be a pre-requisite.&lt;/p&gt;

&lt;p&gt;A website, like the one used for OfflineIMAP (from where you’re reading this page). :-)&lt;/p&gt;

&lt;h2 id=&quot;what-you-can-do&quot;&gt;What you can do&lt;/h2&gt;

&lt;h4 id=&quot;developers&quot;&gt;Developers&lt;/h4&gt;

&lt;p&gt;There are things that are more time consuming than hard to achieve, actually. Involve yourself would greatly help to get the first stable release out. E.g.:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Complete the internal APIs.&lt;/li&gt;
  &lt;li&gt;Write drivers, controllers, engines.&lt;/li&gt;
  &lt;li&gt;Write tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more details, the &lt;a href=&quot;https://gist.github.com/nicolas33/003f1b7184c7dfb26192&quot;&gt;TODO list&lt;/a&gt; is online.&lt;/p&gt;

&lt;h4 id=&quot;users&quot;&gt;Users&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Try features out.&lt;/li&gt;
  &lt;li&gt;Run the tests from time to time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;the-sceencasts&quot;&gt;The sceencasts&lt;/h2&gt;

&lt;p&gt;First, &lt;strong&gt;screencasts won’t ever replace documentation&lt;/strong&gt;. However, there are some cases where they can be usefull like introducing features or concepts. That’s why I’ve started to make some. I intend to make more with time and code advance.&lt;/p&gt;

&lt;h4 id=&quot;dailymotion-vs-youtube&quot;&gt;Dailymotion vs Youtube&lt;/h4&gt;

&lt;p&gt;There might be other media out there but I’ve only looked at the most well-known (to me, at least). I’ve started by creating an acount for Youtube and tried to publish my first video on it. Up to my surprise, &lt;strong&gt;the video has been refused&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In order to post videos longer than 15 minutes, &lt;a href=&quot;https://support.google.com/accounts/answer/114129?hl=en&quot;&gt;I have to give my phone number to Google&lt;/a&gt;. The reason given is that &lt;strong&gt;it effectively &lt;a href=&quot;https://support.google.com/youtube/answer/171664?hl=en&quot;&gt;avoids spams&lt;/a&gt; and abuses&lt;/strong&gt;. &lt;em&gt;It’s obviously well-known that robots and spammers are only uploading videos longer than 15 minutes&lt;/em&gt;…&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;I consider that my phone number is private data and I don’t want to offer it to Google, the NSA or whatever. They might already have it via other ways but that’s not the point. &lt;strong&gt;I’m strongly against such practices&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Hence, I’ve decided to use Dailymotion only. The latter doesn’t requires me to expose them anything other than a mail address while they have much less ressources than Google to make war against spammers.&lt;/p&gt;

&lt;h4 id=&quot;monetization&quot;&gt;Monetization&lt;/h4&gt;

&lt;p&gt;Be aware that I’ve activated monetization on some videos. &lt;strong&gt;I hate having to watch ads myself&lt;/strong&gt; and I intend to limit such practice to &lt;strong&gt;some&lt;/strong&gt; of the available contents only. I don’t want advertising to become rule.&lt;/p&gt;

&lt;!--
vim: ts=2 expandtab spelllang=en :
--&gt;
</description>
        <pubDate>Fri, 04 Dec 2015 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/imapfw/development/2015/12/04/opening-imapfw-to-contributors.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/imapfw/development/2015/12/04/opening-imapfw-to-contributors.html</guid>
        
        
        <category>imapfw</category>
        
        <category>development</category>
        
      </item>
    
      <item>
        <title>imapfw is made public</title>
        <description>
&lt;p&gt;I’m publishing &lt;strong&gt;imapfw&lt;/strong&gt;, a new IMAP tool which I intend to replace OfflineIMAP. ,-)&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Some months passed since my previous announce to make a deep refactoring of OfflineIMAP. While doing this job, I realized it was something very hard and it would be better to write a new software. That’s what I’m currently doing and it’s called &lt;a href=&quot;https://github.com/OfflineIMAP/imapfw&quot;&gt;imapfw&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;note&quot;&gt;This tool won’t do much for now. This is still in very early development stage.&lt;/p&gt;

&lt;p class=&quot;warning&quot;&gt;Because it’s &lt;strong&gt;WORK IN PROGRESS&lt;/strong&gt; and &lt;strong&gt;EXPERIMENTAL&lt;/strong&gt; stuff, it won’t make anything good. Expect it to have strong failures.&lt;/p&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;Here are the main goals I have in mind for imapfw:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;use the last Python 3 technologies;&lt;/li&gt;
  &lt;li&gt;clean and beautifull code;&lt;/li&gt;
  &lt;li&gt;easily extensible;&lt;/li&gt;
  &lt;li&gt;fully &lt;em&gt;(aggressively?)&lt;/em&gt; concurrent;&lt;/li&gt;
  &lt;li&gt;fit the needs to both novice and experts;&lt;/li&gt;
  &lt;li&gt;support &lt;strong&gt;a lot&lt;/strong&gt; of use cases;&lt;/li&gt;
  &lt;li&gt;safe and with embedded unit tests;&lt;/li&gt;
  &lt;li&gt;fucking good documentation;&lt;/li&gt;
  &lt;li&gt;IDLE mode? I’m still not sure about this one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Believe me, those goals altogether are very ambitious.&lt;/p&gt;

&lt;p&gt;That’s why I decided to make imapfw a &lt;strong&gt;framework&lt;/strong&gt; &lt;em&gt;(hence the name imap&lt;strong&gt;fw&lt;/strong&gt;)&lt;/em&gt; which I want both &lt;strong&gt;simple&lt;/strong&gt; and &lt;strong&gt;powerfull&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Beginners shouldn’t be scared, though. All the framework architecture only requires &lt;em&gt;ONE&lt;/em&gt; file which is called the &lt;strong&gt;rascal&lt;/strong&gt;. It won’t require the user to write one line of Python code.&lt;/p&gt;

&lt;h2 id=&quot;a-call-for-feedbacks&quot;&gt;A call for feedbacks&lt;/h2&gt;

&lt;p&gt;I’m publishing this tool today in order to get your feedbacks. Any constructive comment is always welcome but keep it in mind this is WIP, please!&lt;/p&gt;

&lt;p&gt;Also, feel free to give your opinion about anything.&lt;/p&gt;

&lt;h3 id=&quot;users-of-offlineimap&quot;&gt;Users of OfflineIMAP&lt;/h3&gt;

&lt;p&gt;Since I intend imapfw to replace OfflineIMAP in the long term, you might want to follow the development and give your feedbacks. My best guess is that you will mostly be interested by the &lt;a href=&quot;https://github.com/OfflineIMAP/imapfw/tree/next/rascals&quot;&gt;&lt;strong&gt;rascal&lt;/strong&gt;&lt;/a&gt;: how it looks, is it hard, etc.&lt;/p&gt;

&lt;h3 id=&quot;developers&quot;&gt;Developers&lt;/h3&gt;

&lt;p&gt;This call for feedbacks is mostly for you! Please, do fork the project and read a bit of code. Early feedbacks about code are very important.&lt;/p&gt;

&lt;p&gt;I don’t expect patches, for now. However, let me know if you’d like to contribute soon. I’ll share more about what I have in mind.&lt;/p&gt;

&lt;h2 id=&quot;how-it-looks&quot;&gt;How it looks&lt;/h2&gt;

&lt;p class=&quot;warning&quot;&gt;This section is partially obsolete.&lt;/p&gt;

&lt;p&gt;A good start is to fork the project and look at the CLI options:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;./imapfw.py &lt;span class=&quot;nt&quot;&gt;-h&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The main argument is the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACTION&lt;/code&gt;. It tells what imapfw must do. I’ve started the implementation of the most expected feature: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;syncAccounts&lt;/code&gt;. For now, it won’t sync anything and you can run it safely.&lt;/p&gt;

&lt;h3 id=&quot;the-rascal&quot;&gt;The rascal&lt;/h3&gt;

&lt;p&gt;Here’s an extract of the &lt;a href=&quot;https://github.com/OfflineIMAP/imapfw/tree/next/rascals&quot;&gt;rascal&lt;/a&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;n&quot;&gt;__VERSION__&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.1&lt;/span&gt;


&lt;span class=&quot;c1&quot;&gt;##########
# GLOBAL #
##########
&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;#
# The main configuration options are set in this dict.
#
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MainConf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;concurrency_backend&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;multiprocessing&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;max_sync_accounts&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;


&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;imapfw.api&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;actions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;engines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;controllers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;types&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;drivers&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Support for contributor&apos;s backends. ,-)
#from imapfw.api import contrib
&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;################
# REPOSITORIES #
################
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ImapExampleConf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;dns&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;      &lt;span class=&quot;s&quot;&gt;&apos;imap.gmail.com&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;port&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;s&quot;&gt;&apos;143&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;username&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;myname&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;max_connections&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;MaildirExampleConf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;path&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;~/Maildir&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;max_connections&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MaildirRepositoryExample&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;types&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Maildir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;conf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MaildirExampleConf&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;driver&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;drivers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Maildir&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Default: drivers.Maildir.
&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ImapRepositoryExample&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;types&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Imap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;conf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ImapExampleConf&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;driver&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ImapDriverExample&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Default: drivers.Imap.
&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_getPassword&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;conf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;password&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;credentials&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;conf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_getPassword&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uid_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;conditions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getTitle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;startswith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;spam&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;mail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deleteRemote&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;deleting spam&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;startswith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;offlineimap&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;mail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setTitle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;filtered: %s&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;mail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;moveTo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;INBOX.offlineimap&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# IMAP MOVE.
&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Continue proceeding to the folder.
&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getFolders&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;sample&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;of&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;static&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;remote&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;folder&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;list&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;



&lt;span class=&quot;c1&quot;&gt;############
# ACCOUNTS #
############
&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AccountExample&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;types&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Account&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;left&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MaildirRepositoryExample&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;right&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ImapRepositoryExample&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Optional. The folders considered for a sync.
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# Arguments:
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# - folder_list: list of folder names to sync.
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# Returned values: the new list of folders to sync.
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;syncFolders&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foldersList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;folderA&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;folderB&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;folderC&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;The first thing to notice is that configuration options are dictionnaries. Forget the INI style. I aim simple users to not have to write ONE line of Python code.&lt;/li&gt;
  &lt;li&gt;OfflineIMAP users should feel comfortable reading this file. It follows almost the same semantic and the same logic around &lt;strong&gt;accounts&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;Most experienced users will notice the classes. Here is the hierarchy and how
they are logically linked:
    &lt;ul&gt;
      &lt;li&gt;an account is defined (derivates from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;types.Account&lt;/code&gt;) with both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;left&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;right&lt;/code&gt; “repositories”.&lt;/li&gt;
      &lt;li&gt;a “repository” &lt;em&gt;(I’m about to fully remove this term)&lt;/em&gt; maps to a configuration dictionary and a driver to actually access it. It derivates from the associated type (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;types.Maildir&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;types.Imap&lt;/code&gt;, etc) and the drivers are similar (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;drivers.Maildir&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;drivers.Imap&lt;/code&gt;, etc).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On top of this, each &lt;strong&gt;type&lt;/strong&gt; acts as a controller for the underlying driver. I expect experimented users to make most of their &lt;em&gt;“crappy”&lt;/em&gt; things^W^W tuning here. ,-) Think about filtering folders, nametrans, etc.&lt;/p&gt;

&lt;p&gt;How everything is linked is important: it’s possible to decide what type uses which driver for what account.&lt;/p&gt;

&lt;p&gt;Now, look at the imports:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;imapfw.api&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;actions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;engines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;types&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;drivers&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;actions&lt;/strong&gt; are the actions available from the command line.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;engines&lt;/strong&gt; allows to define the default engine to use for the action (if this action supports more than one engine). It can be redefined at the CLI!&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;types&lt;/strong&gt; are the little sisters of the OfflineIMAP’s repositories: Maildir, Imap, Gmail, etc, in the sense they hold a driver and some configuration options &lt;em&gt;(like the credentials)&lt;/em&gt; to access it.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;drivers&lt;/strong&gt; are the low-level drivers to use for the types (didn’t exist in OfflineIMAP).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The imports are what makes the framework so powerfull. They allow users to &lt;strong&gt;redefine&lt;/strong&gt; the default behaviour, or even write their own new full backends.&lt;/p&gt;

&lt;p&gt;Because actions, engines, types and drivers are well orthogonal and distinct concepts, extending imapfw should be much easier than it was with OfflineIMAP.&lt;/p&gt;

&lt;h2 id=&quot;a-brief-introduction-about-imapfws-internals&quot;&gt;A brief introduction about imapfw’s internals&lt;/h2&gt;

&lt;p&gt;Internally, there are other implementation concepts that some of you might like to be aware of. The most important are the &lt;strong&gt;concurrency&lt;/strong&gt;, the &lt;strong&gt;workers&lt;/strong&gt; and the &lt;strong&gt;managers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;concurrency&lt;/strong&gt; is a module to use a single and very simple API whatever the Python backend in use (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;multiprocessing&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;threading&lt;/code&gt;). Yes, I’m aware they are already very similar but they still have some subtil differences it’s better to avoid introducing in the long run. We force using a subset of them.&lt;/p&gt;

&lt;p&gt;Because the conccurency backend is easily switchable, &lt;strong&gt;worker&lt;/strong&gt; is a simple term to refer to either a process (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;multiprocessing&lt;/code&gt;) or a thread (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;threading&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;managers&lt;/strong&gt; are objects to nicely handle concurrency. It takes inspiration from the managers of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;multiprocessing&lt;/code&gt; library. They allow to have an intuitive usage for the “passing by message” design.&lt;/p&gt;

&lt;h2 id=&quot;final-note-&quot;&gt;Final note !&lt;/h2&gt;

&lt;p&gt;It’s time for me to write the last words. I’d rather let you to discover imapfw more in details by yourself.&lt;/p&gt;

&lt;p&gt;This post is long enough for today! Also, I’m getting very tired (I ddin’t sleep this night to polish the code, publissh it and write this bloog post). I hope nobody have noticcce…. :-D&lt;/p&gt;

&lt;!--
vim: ts=2 expandtab spelllang=en :
--&gt;
</description>
        <pubDate>Thu, 08 Oct 2015 00:00:00 +0000</pubDate>
        <link>http://www.offlineimap.org/development/2015/10/08/imapfw-is-made-public.html</link>
        <guid isPermaLink="true">http://www.offlineimap.org/development/2015/10/08/imapfw-is-made-public.html</guid>
        
        
        <category>development</category>
        
      </item>
    
  </channel>
</rss>
