Tuesday, January 14, 2014

Modifying mail passing through Zimbra

I had a request to attach to (almost) each mail message that passes through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Zimbra mail server an image. Basically, what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 owner wanted is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is an image with advertisement in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mail that is sent by internal users. Additional requirements were:
  1. Image should be added only once!
  2. In case cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is new image, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is already on in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mail, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old one should be replaced!
  3. Image has to be at exact spot within a message.
There were some additional requirements from my POV:
  1. Not every mail should have image attached, e.g. automatically generated internal messages!
  2. I should be careful about impact on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 performance.
  3. Mali messages that are not modified should not have any noticeable marks about image that isn't added (this one will be more clear later).
  4. The solution should allow to define only certain senders to have mails modified.
  5. It has to have a DRY RUN mode so that it is easily disabled.
I immediately knew that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no way to place image somewhere on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Internet and put link into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mail message. Although cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most elegant solution, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem is that all mail clients don't show images by default, and that's it. So, image has to be within mail message itself. A bit of research showed up a potential solution. Namely, to embed image data within IMG tag itself, and mail messages are already altered by adding disclaimer which is HTML and a perfect place to add that IMG tag, so why not reuse disclaimer for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same purpose? In favor of that solution was also my intention not to add new scripts into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mail processing chain because of fear that it might impact performance. 

Unfortunately, that solution didn't work. The most important shortcoming is that Outlook and GMail don't handle IMG tag with embedded image data in it, in ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r words, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image isn't shown. To solve that, image has to be embedded as a MIME part within mail. Additionally, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r requirements aren't easy to achieve, especially, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one to replace old image with a new one. So, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end I had to resort to writing scripts.

I already wrote about how I managed to solve more complex requirements for a disclaimer than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functionality of Zimbra allows. So, it was natural place for me to add that additional processing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re. I called cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script to add image altermail.py and now altermime script has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following form:
#!/bin/bash
grep "DISCLAIMER:" ${1#--input=} > /dev/null 2>&1
if [ ! "$?" = 0 ]; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n
/opt/zimbra/altermime-0.3.10/bin/altermime-bin "$@"
fi
#echo "`date +%Y%m%d%H%M%S` $@" >> /tmp/altermime-args
/opt/zimbra/altermime-0.3.10/bin/altermail.py "$@" >> /tmp/altermail.log 2>&1
I'm calling altermial.py after altermime because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image placeholder is within disclaimer! Also, I removed exec keyword before altermime-bin call so that altermail.py is finished.

Additionally, note that altermail.py accepts cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same arguments as altermime! This is in order to simplify things a bit.

Obviously, I choose Python as a programming language of my choice. I could write all that in Perl too, but since I'm lately working a lot more with Python, Python was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way to go. Both languages have very good support for mail processing (MIME messages in particular).

The script is on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GitHub and you can fetch it cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re.

How cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script works

First of, script doesn't work for mail messages that aren't MIME. So, after loading a message cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first check if it is a multipart message. If not, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n script just exits.

Next, white and black lists are checked.

There are two passess over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mail message. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first pass, it searches through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mail message to see if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is already image attached. If so, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n it additionally checks if it is an older version of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image. If it is, it replaces cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image, but in both cases it doesn't do anything more and finishes execution.

The second pass is done when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no image in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mail message and it has to be added. Now, when adding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image it has to be added with HTML as html/related so that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are both shown. If you add it as html/alternative, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n only one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m will be shown!

All cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 configuration options are embedded within script itself. I chose not to have configuration file to reduce number of disk accesses, which is already very high (a lot of modules are necessary).


About Me

scientist, consultant, security specialist, networking guy, system administrator, philosopher ;)

Blog Archive