1

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?

4

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.

| improve this answer | |
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.

| improve this answer | |
  • 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.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.