Since writing this post I've learned a better way. If you're using a personal account or only need to relay 1 server the below may be sufficient. If you're managing more than one server and can manage your Office365 domain please see my updated post Better Use of Office 365 as a Smart Host with Postfix.
One great thing about Linux systems is that we can get automagic reporting on
so many things just by setting up a mail server. Want to run a command and find
out if it failed? Throw it in
cron and redirect the output to
to write a script to generate a report? Save it as ASCII text and run the
In the Sendmail world we could set this up fairly easily using a SmartHost. Even authenticated is not that big a deal, though truthfully that's mostly because I worked out a successful config aeons ago that is easily modified. These days, however, I'm working in an Ubuntu environment which now has a pretty strong preference for postfix. Fortunately I was a somewhat easy grognard to retrain, the syntax is certainly easier. Just as with sendmail you start with setting your SmartHost, now called a relayhost
relayhost = [smtp.office365.com]:587
Next up we'll need to define the user credentials necessary to send mail through
our relayhost. Just as with sendmail we'll create a file containing the
/etc/postfix/sasl_passwd, with the contents of
In order to turn this into a file that postfix can use we'll run it through a processor.
This generates a BerkDB file based on the raw text file we created before. Now
we tell postfix to use it by adding this to the
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
In theory this should be sufficient but it's actually not. If you'll notice I'm relaying through Office365. Their mailers have an additional restriction, first you must authenticate using a valid username and password then your user must be allowed to send messages as the email address given in the From header.
Mail coming from Linux services can be all over the map. Typically
root@servername, webapps may send as
like logwatch, may use
application@servername. All of those will be rejected
by the relayhost since our service account user doesn't have those permissions.
Postfix lets us do this using what they call a
Create the map file, here
Then just as above we'll turn it into a database
main.cf to look for the file.
smtp_generic_maps = hash:/etc/postfix/generic
Now all outgoing messages will have the From field replaced in both the
envelope and header. The first field, the
/.*/, is a regular expression that
defines everything. You can replace that with more specific addresses, more
details are in the official docs.
Now you can just restart the postfix service and start routing your mail. Well... nearly. Office365 has some additional settings so I'll include a full config at the bottom.
All we've done so far is just set up relaying for outgoing messages. Almost
all applications that prompted this work send their messages to
isn't really all that grand since in order to read the messages you'll have to
log into the host directly. What we really want to do is have these go
someplace else. Edit the file
/etc/aliases and look for a line where the first
root. Make it look like this.
Next run the command
/usr/bin/newaliases and all messages sent to
get forwarded to my system reports address. If the applications you want to get
messages from send do a different address, for example
apt-mirror really likes
sending mail to itself, then add additional lines for each local user name. Just
make sure to run
newaliases each time you save the file.
Now, with the rest of the changes to your
main.cf listed below, you should
start getting all those great email alerts all routed through your spiffy O365
relayhost = [smtp.office365.com]:587 smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_generic_maps = hash:/etc/postfix/generic smtp_tls_security_level = may smtp_sasl_security_options = noanonymous