5

I've got several production servers running a LAMP stack. They each have a local Postfix server catching any mail from the system and from PHP, and relaying it via a smarthost (the SendGrid SMTP service).

I'd like to add a custom header to every outgoing message sent to the smarthost. This allows me to filter statistics per server in SendGrid. Something like:

X-SMTPAPI: {"category": "www1"}

The Postfix docs mention using the PREPEND action in a Postfix 'access' table. So, I added the following line to /etc/postfix/access:

PREPEND X-SMTPAPI: {"category": "www1"}

and hashed the access file with postmap.

However, I have no idea how to use the map. Something like the following doesn't work:

smtp_client_restrictions = check_client_access hash:/etc/postfix/access

How do I make Postfix prepend this header?

sysadmin1138
  • 131,083
  • 18
  • 173
  • 296
Martijn Heemels
  • 7,438
  • 6
  • 39
  • 62

3 Answers3

6

This answers your exact question: https://web.archive.org/web/20150706131729/http://hoursofop.tumblr.com/post/17760274650

Quick steps reported here:

  • create a file /etc/postfix/sendgrid_headers and add this line to it:

    /^From:/ PREPEND X-SMTPAPI: {“category” : “Category Name”}
    
  • update your master.cf file with the following lines:

    smtp      unix  -       -       n       -       -       smtp -o smtp_header_checks=regexp:/etc/postfix/sendgrid_header
    

It applies to a Ubuntu system and worked perfectly for me. Be careful to choose the right "smtp" line in master.cf. I used a tab to indent the -o line.

Also note that SendGrid strips out the X-SMTPAPI header from the email before it is sent on - so you won't find it there but you will see the category appear within the SendGrid dashboard.

WiseOwl9000
  • 161
  • 1
  • 4
2

You seem to have mis-spelled header_checks as smtp_client_restrictions, which isn't even the correct spelling of the wrong parameter. ☺

This sort of thing is far better done with a simple shim around sendmail, that your PHP (or whatever) scripts are configured to use, you know. The shim script would be a simple exercise in the use of the cat and echo commands. The MTS is really the wrong place to be doing this.

AlexD
  • 8,179
  • 2
  • 28
  • 38
JdeBP
  • 3,970
  • 17
  • 17
  • Couldn't get it working with header_checks either. Also, that processes every single header so appears to be overkill for such a simple task. Thanks for the suggestion of using a wrapper, but that also seems like a kludge for something an MTA should be able to do with ease. Is there really no 'easy' way? – Martijn Heemels Jun 17 '11 at 20:38
  • Yes, there's an easy way, and it's the way of the shim script. Concocting application-layer message content like this _is the job of the MUA_, not the MTS. This task is fully and squarely within the realm of PHP and the agents that it uses to concoct messages before submission, not in the MTS. – JdeBP Jun 18 '11 at 10:03
0

I had a similar problem with Sparkpost: I needed to add their custom header in order to set some delivery options.

This problem (adding a custom header to all emails) has many different solutions.

My solution is using Postfix header_checks and prepending the custom header to the "From" header.

  • Create a new file, named /etc/postfix/my_custom_header:

    /^From:/i X-MSYS-API: { "options" : {"transactional": true} }
    
  • Edit /etc/postfix/main.cf (appending to the bottom):

    # Add custom Sparkpost X-MSYS-API header to all mails
    header_checks = regexp:/etc/postfix/my_custom_header
    
  • reload Postfix configuration (this command is for Debian Wheezy, and may be different on your OS)

    service postfix reload
    

EDIT: Unfortunately, this method adds the header to all emails (incoming and outgoing). I am still searching for a method that adds the header only to outbound emails.

gog
  • 135
  • 6