Child pages
  • Using postfix header_checks to re-write From headers
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »


This page explains how to use postfix header_checks to re-write "From:" headers, specifically to adjust the display name.

It was developed and tested on a Debian 6 Squeeze system running postfix 2.7.1 using POSIX regular expressions.


The terms used for address components on this page are taken from RFC2822 (  Using example address

"Mr Foo" <>

  • display-name is "Mr Foo"
  • angle-addr is <>

The essential steps

Create /etc/postfix/header_checks (discussed below) then run these commands

cd /etc/postfix
postmap header_checks
postconf -e 'smtp_header_checks = regexp:/etc/postfix/header_checks'
/etc/init.d/postfix reload

Developing the header_checks file

Line format

For present purposes, each effective line of the header_checks file is of the form

/pattern/ REPLACE text...

The pattern

The /pattern/ is a POSIX regular expression matching the "FROM:" header.  So it always begins with


The pattern should always be anchored to the start of the line using ^.  This ensures no false positives (such as matching "From:" in some other header such as the subject) and gives better postfix performance (postfix does not have to scan the whole of each header looking for the match).

The rest of the pattern depends on local requirements – what you want to match.

Any whitespace in the pattern should be represented by [[:space:]].  This avoids warnings from postmap such as "record is in "key: value" format; is this an alias file?" and "duplicate entry".

The text

  • display-name needs to include enclosing double quotes.
  • angle-addr needs to include enclosing < and > characters.

Development techniques

To find out what's after the "From:":

  1. If the regex matches the "From:" header, it can be seen in /var/log/ using  grep -o 'replace: header .*$' /var/log/
  2. It can be replicated to the re-written header using ("me" is an arbitrary choice):  /^From:[[:space:]]+(.*) REPLACE From: ">${1}<" me



There are few HOWTO pages on the Internet about this topic.  The ones found most useful were:


  • No labels