Morphos – morphological solution in PHP for English and Russian

If you ever had to deal with morphology in English, you probably found one or two libraries to help you out.  But if you had to do that for Russian, than I’m sure you are missing a few hairs, and the ones that you still have are grayer than they used to be.  I’ve got some good news for you though, now there is Morphos (GitHub repository).

Morphos is a morphological solution written completely in the PHP language. Supports Russian and English. Provides classes to decline First/Middle/Last names/nouns and generate cardinal numerals.

Just look at this beauty!

var_dump($dec->getForms($user_name, $dec->detectGender($user_name)));
/* Will produce something like
  array(6) {
    string(8) "Иван"
    string(10) "Ивана"
    string(10) "Ивану"
    string(10) "Ивана"
    string(12) "Иваном"
    string(15) "об Иване"

Just this alone can make user interfaces and emails so much better.  But there is more to it than that.

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 proto imap:
  username "" is root here
  password "somepass"

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:


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:

* ^Date: .*28 Jul 2016.*|\
  ^Date: .*27 Jul 2016.*

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 script (multi-line for readability):

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

and here is the script (multi-line for readability):

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:

$ ./ 
fetchmail: WARNING: Running as root is discouraged.
410 messages for someuser@gmail.comat (folder [Gmail]/All Mail).
reading message of 410 (446 header octets) (222 body octets) not flushed
reading message of 410 (869 header octets) (230 body octets) not flushed
reading message 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


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.


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.