Exporting messages from Gmail with fetchmail and procmail

One of the projects that I am involved in has a requirement of importing all the historical emails from a number of Gmail accounts into another system.  It’s not the most challenging of tasks, but since I spent a bit of time on it, I figured I should blog it here too, just in case a similar need will arise in the future.

In my particular case, I need two different solutions.  One for exporting all of the messages from all folders of all Gmail accounts in question (Gmail for Work).  And the other is for exporting only the messages from the “Sent Mail” folder, which were sent on specific dates.

The solution that I derived is based on the classic tools for this purpose – fetchmail and procmail.  Fetchmail is awesome at fetching emails using all kinds of protocols.  Procmail is amazing at sorting, filtering, and otherwise processing the email messages.

So, here we go.  First of all, we need to tell fetchmail where to get the messages from.  I didn’t want to create to separate configurations for each of my tasks, so I left only the options common between them in the configuration file, and the rest I will be passing as command line arguments, depending on scenario.

Note that I’ve been running these tests from a dedicated environment, where I only had the root user.  You don’t have to run it as root – it’ll work as any other just fine.  Also, keep in mind that I used “/root/fetchmail-test/” folder for my test runs.  You might need to adjust the paths if you have it any different.

Here’s my fetchmail.rc file, which I used to test a single mailbox.  A new “poll” section will go into this file later, for each mailbox that I’ll need to export.

poll imap.gmail.com proto imap:
  username "someuser@gmail.com" is root here
  password "somepass"
  fetchall
  keep
  ssl

If you are not root, you might need to adjust the second line, replacing “root” with your username. Also, for testing purposes, you can use “fetchlimit 1” instead of “fetchall“.

Now, we need two configuration files for procmail.  The first one is super simple – I’ll use this for simply pushing all downloaded messages into a single giant mbox file.  Here’s the procmail-all.rc:

VERBOSE=0
DEFAULT=/root/fetchmail-test/fetchmail.all.mbox

As you can see, it only defines the verbosity level and the default mailbox.  The second configuration file is a bit more complicated.  I’ll use it for the sent items only.  The sent items folder limit will be done with fetchmail.  But I want to do further is disregard all messages, which were not sent on a specific date.  Here is my procmail-sent.rc:

VERBOSE=0
DEFAULT=/dev/null
:0
* ^Date: .*28 Jul 2016.*|\
  ^Date: .*27 Jul 2016.*
/root/fetchmail-test/fetchmail.sent.mbox

Again, we have the verbosity level and the default mailbox to save messages to.  Since I want to disregard them unless they match a certain condition, I specify /dev/null.   Then, I specify my condition, which is simply a bunch of regular expressions for the Date header.  Usually, Date header is a not very reliable as different MUAs (Mail User Agents) use different formats, time zones, etc.  In this particular case test results seemed consistent (maybe Gmail fixes the header), and I didn’t have any other more reliable criteria to use.

As you can see, I use a very basic condition for date matching. So, if the Date header matches either “28 Jul 2016” or “27 Jul 2016“, the message is saved in the mbox file, rather than being thrown into the default mailbox.

Now, all I need is a way to tie fetchmail and procmail together, as well as provide some additional options.  For that I created the two one-liner shell scripts, just so that I won’t need to figure out the command line arguments if I look at this whole thing six month later.

Here is the check-all.sh script (multi-line for readability):

#!/bin/bash
fetchmail -f fetchmail.rc \
          -r "[Gmail]/All Mail" \
          --mda "procmail /root/fetchmail-test/procmail-all.rc"

and here is the check-sent.sh script (multi-line for readability):

#!/bin/bash
fetchmail -f fetchmail.rc \
          -r "[Gmail]/Sent Mail" \
          --mda "procmail /root/fetchmail-test/procmail-sent.rc"

If you run either one of these scripts, you’ll see the output similar to this:

$ ./check-all.sh 
fetchmail: WARNING: Running as root is discouraged.
410 messages for someuser@gmail.comat imap.gmail.com (folder [Gmail]/All Mail).
reading message someuser@gmail.com@gmail-imap.l.google.com:1 of 410 (446 header octets) (222 body octets) not flushed
reading message someuser@gmail.com@gmail-imap.l.google.com:2 of 410 (869 header octets) (230 body octets) not flushed
reading message someuser@gmail.com@gmail-imap.l.google.com:3 of 410 (865 header octets) (230 body octets) not flushed
...

Here are a few resources that you might find helpful:

Emails, WordPress, and lots of Archives

I’ve been running this blog for a very long time now.  The Archives page links back to all the months and years (all the way to the first post back on October 21, 2001) of all kinds of posts – random rants, movie reviews, technical posts, and day summaries.  But who does read the archives ever, right?

Well, if you are running a WordPress site with lots of content, and you want to rediscover some of your old gems, there is an excellent plugin that helps with that – “This Day in History“.  I have a widget, powered by that very plugin, both on the front page of the site (showing posts from the same day in previous years), and on every post page (showing posts from the same day of the post in different years).

Today I found this short post about email and Microsoft Outlook:

There was a time, when I used to love email.  I loved receiving email, and reading it.  Replying to email.  Or just writing up some new email.  Occasionally, forward email.  I loved searching through email.  Or categorizing it.  Or archiving email.  I loved quoting email.  And I loved email with attachments.  But now, I pretty much hate all of that.  Thank you, MS Outlook.

Which made me think of the IT Crowd TV series, the very first episode of the very first season, where Jen was going through the interview:

I’ve always been a big fan of IT Crowd, in particular for its accurate take on the corporate culture.  Obviously, I thought of myself more like the Roy character, not Jen:

Given that the post was written in 2012, and this episode came out in 2006, I was probably mocking it, but I don’t remember for sure. Anyways, it’s fun.

Oh, and by the way, if you were wondering what’s a better email client, here is the post just for you.

RainLoop – simple, modern, and fast web-based email client

rainloop

For those of you who want something more than the classic-looking RoundCube, here’s the RainLoop – simple, modern, and fast web-based email client.  The feature list is very comparable, yet the interface is somewhat different, looking more like Gmail, than the Outlook Express.

SugarCRM, RoundCube and Request Tracker integration on a single domain

In my years of working as a system administrator I’ve done some pretty complex setups and integration solutions, but I don’t think I’ve done anything as twisted as this one recently.  The setup is part of the large and complex client project, built on their infrastructure, with quite a few requirements and a whole array of limitations.  Several systems were integrated together, but in this particular post I’m focusing primarily on the SugarCRM, RoundCube and Request Tracker.  Also, I am not going to cover the integration to full extent – just the email related parts.

Continue reading “SugarCRM, RoundCube and Request Tracker integration on a single domain”

Mail::RFC822::Address: regexp-based address validation

This is pure gold!  Check out the regular expression for an RFC822 email address validation. I’m not going to paste it here, being concerned that it will open the gates of hell or something, but here is a sneak preview of about the first third or so.

regex

500 miles email limit

I’ve read this story a while ago, but this is a beautiful piece of the system administration reality, so here it goes again.

“We’re having a problem sending email out of the department.”
“What’s the problem?” I asked.
“We can’t send mail more than 500 miles,” the chairman explained.
I choked on my latte. “Come again?”
“We can’t send mail farther than 500 miles from here,” he repeated. “A
little bit more, actually. Call it 520 miles. But no farther.”

More stories here.

MailWise – Email for Exchange & Hotmail

If you are one of those poor souls stuck with MS Exchange (like yours truly), here is one application you would absolutely love on your Android device – MailWise.  This app replaces your default email client with all the same functionality, except it makes those horribly long, backward-quoted emails and disclaimerified signatures much much shorter.  Like this:

MailWise

It’s one of those things that you constantly try to learn to ignore, but which comes back to annoy you on a daily basis.  And now, it’s solved.  Awesome!