Adding a References Header in Postfix: Better Gmail Conversation View

Background

If you didn’t know, Google recently changed the way it groups emails into threads, or as it calls them, conversations. Previously Gmail used the subject and sender information to group emails. This new method relies on explicit linking through the References header, which is much better.

Lots of our network equipment sends email notifications without the References header, and this confuses conversation view when the emails have the same subject. This causes problems especially when an appliance sends emails about different events all with the same subject line. It makes it hard to group the separate events.

My Solution

All we have to do is somehow add a References header with a random value (random because if a References header exists but is unique, the message won’t be threaded even if it has the same subject and is from the same sender as another message). I decided to use part of the Message-ID header as my source of random data (not being able to generate random data the way this solution works). Message-ID is a unique id for each message. This suits my purpose as only when the References header matches up with a previously sent message’s corresponding Message-ID header will threading occur.

If you use an on-premises SMTP server you may be in luck, because you might be able to process the messages before they are sent.

At work we use an onsite Postfix SMTP server for handling the sending emails from photocopiers, network appliances, web filters etc. None of them use the References header which is painful. Using the header_checks config statement in /etc/postfix/main.cf, we can easily add this in.

According to RFC 2076 the References header has the following purpose:

In email: reference to other related messages, in Usenet News: reference to replied-to-articles.

According to RFC 822, the References header is a phrase or msg-id. A msg-id is something that looks like an email address surrounded by angled brackets, eg: <12345.12345@somedomain.com.au>. What I decided to do was to take the value of the Message-ID header and mash it up a bit then use that as the value for the new References header. The resulting config is reproduced below:

In the file /etc/postfix/main.cf:

...
header_checks=pcre:/etc/postfix/header_checks
...

In the file /etc/postfix/header_checks (which you may have to create):

/^Message-ID:\s+<([0-9])\.([0-9])@mydomain.com.au>/ PREPEND References: <$2$1@unique.dummy.id.com.au>

This statement starts with a regular expression that looks for a Message-ID header and captures the required information out of it. Then there is the PREPEND command which prepends the following text to the header. The prepended text is itself a regex which pieces together the parts extracted in the first regex. The effect of this is to insert a dummy References header.

So far this is working in testing as expected and will be moved to the production SMTP server soon.

Limitations

The solution I present above has a few limitations:

  • if the Message-ID header doesn’t exist this won’t work
  • it doesn’t check for the existence of a References header before making a modification. In my case I know the References header doesn’t exist so I am ok for now. This may break in the future
  • I can’t limit the application of this modification by sender or any other value
  • If the Message-ID header is not made up of two strings of digits separated by a full stop, this won’t work.

Other ways this could work is a Postfix filter or milter. I am not sure about them, but they warrant further investigation. When my solution breaks, I will have a look into it.

Fin

I hope this helps someone who, like me, likes conversation view in Gmail, but has to deal with many emails a day that get grouped into conversations when they really shouldn’t.

References

https://support.plesk.com/hc/en-us/articles/115004515714-How-to-rewrite-headers-in-outgoing-mail-messages

Advertisements

Tagged vs. Untagged VLANs

I finally got it through my head today the difference between adding a port to a VLAN in tagged vs. untagged mode.

Tagged means that traffic with the VLAN ID already attached—that is tagged traffic—will be passed. Untagged means that traffic without the VLAN ID already attached will have the VLAN ID inserted—that is, it will be tagged—and then passed. That way if there is a device that you want to be on a particular VLAN, put the port the device is connected to into untagged mode for whatever VLAN you want, and the traffic from that device will be tagged with the VLAN ID. Tagged ports are trunked ports, that is you can assign multiple VLANs to a port and it will allow all traffic with the appropriate tags to pass.

Please feel free to correct me in the comments if you think this is incorrect.

Manny in Hospital

Relay for Life

Some months ago, almost my entire family took part in the Relay for Life, a 24-hour fundraising event. I posted about it beforehand. We raised over AU$20,000. Below is a speech I gave during the formalities.

On Fighting Back

Since my son Emmanuel was diagnosed with liver cancer when he was 11 months old, I have been reflecting on the idea of the ‘battle with cancer’ and how it could apply to one so young. Was he too young to be able to battle anything, let alone cancer? Does he even know what is going on? Is he capable of fighting back? I am not sure if Little Manny is in the way you or I are, but that doesn’t matter because I am not really a good fighter, I give up too easily. But Manny has shown me what it means to be a good fighter. He has shown me to always be positive, to keep keeping on, not lie down and let things overwhelm me, to walk forward with my head held high and my eyes on the horizon. Live in the moment, don’t wallow in misery for too long or you’ll miss out on what’s happening now, which you may never be able to get back. After our experiences with Manny, I know that if I ever have to go through what he has, I will know what to do. He has been the example for me.

He has been poked, pricked, prodded, pushed, pulled, and pumped full of more drugs than I care to remember. He has had major surgery which has left him with half a liver (the only organ that is capable of regenerating). I’ve never had a general anaesthetic; Manny’s had about 5. He’s been through the wash, wrung out and hung to dry. Multiple times. But he’s not let that stop him. Cancer? Pah, he says! Chemotherapy? Bring it on, he cries! All Manny cares about are his broom-brooms and throwing balls around the house. And milk from Mummy, but that’s another story. Nothing has stopped him smiling and laughing up at us for too long, or waving at the nurses and doctors, or at any random person for that matter. He still gets sick with excitement when he gets his favourite truck to play with, or when its time to read ‘Where is the Green Sheep?’ or any of his other favourite books (again). Manny has the resilience of children, but he also has a friendly and outgoing nature that makes the battles faced by friends and family more easy to bear.

We are all fighters, all of us here. Just by being here, taking part in an event such as this, we are all part of the global search, the fight for a cure for cancer. Everyone that donated or helped or supported is part of the fight. And the greatest weapon we have is hope. We must never lose hope. We must never lose hope.

May the Fourth

Image from Wikipedia.

May the Fourth Be With You!

Hooray! Today is Star Wars day, May the fourth. Which is what a Jedi Knight would say if he or she had a bad lisp. I thought I’d share with you my most and least favourite Star Wars moments.

By far my least favourite moment is in Episode 3, when the newly cyborg-ified Darth Vader learns of his belovéd’s death at his own hands, and getting really, really angry, things start breaking and falling over and steam escapes from pipes, and he lets out an almightily corny, ‘Noooooooo…’. That’s my least favourite moment.

Choosing a most favourite moment is much more difficult. It has to be from the first three movies, or wait, no… is that the last three? Anyway. I think that among all my favourite bits, like when C3-PO and R2-D2 meet the Jawas, and when Qui-gon Jinn, young Obi-wan Kenobi, and Jar-jar Binks walk calmly into the Nubian lake to swim to the underwater Gungan city while fitting little underwater  breathing apparatus to their mouths, and all the bits with the Ewoks, my favourite Star Wars moment is, in Episode 5, The Empire Strikes Back, the snow battle with the AT-ATs. I think they are my favourite machine in all the movies too. I made one from Lego once! I can’t actually pinpoint one favourite moment out of all the cool moments.

So what is your most or least favourite Star Wars moment?