Happy New Year to you all.

This is a "best practices" question for other Postfix users who may be using
Postfix to send email to large opt-in mailing lists.

We have a subscriber list of 1MM+ registered members of a popular video game
website. The vast majority of them are also opted in for our monthly
newsletter (a separate checkbox during the registration process), but we
haven't sent out a newsletter in a few years. We've only been sending
transactional email to the "active" website members, as well as a few
thousand daily "new content" alerts to the users that have asked for them in
their notification options.

In getting our newsletter campaigns ready to send, we believe we've done
everything all the big ESPs ask: a relatively up-to-date version of Postfix
(2.3.3), a dedicated IP with a good reputation and no blacklists, valid SPF
record, valid DKIM signing, and we've signed up for every FBL we could find.

Before sending a newsletter to that large of a group, we decided to first
send out an account confirmation message to all our opted-in subscribers
which includes their name, login information, subscription date, and links
to unsubscribe and/or otherwise manage their delivery settings. The two
goals of this message were to a) do some much-needed housekeeping on our
list to clean out old addresses that bounce, and b) verify that the
addresses which don't bounce still want to hear from us and give them a
chance to unsubscribe if they don't.

We used Postfix to set up a number of virtual mailboxes for the FBL accounts
and one to receive unsubscribe requests from clients that support the
List-Unsubscribe: header. We also used Postfix to set up a virtual mail host
with a catchall address @bounce.ourdomain.com using virtual_mailbox_maps =
hash:/etc/postfix/vmailbox. We then sent out the account confirmation
messages using a custom Return-Path: for each message that is a combination
of the subscriber's user ID, then a plus sign as a delimiter, then an MD5
string (1234567+4s6d5f4a9s8d7f6a...@bounce.ourdomain.com). This is different
than the approach we've been taking with our transactional and alerts mails,
where we've been using a static Return-Path: to a virtual mailbox file
@ourdomain.com and then grep it nightly and unsubscribe any bounces we find
in there.

Sending is happening right now, and so far, everything seems to be working
nicely (we've only got a couple hundred thousand messages to go). Watching
the maillog in real-time, the ESPs are accepting our mails for delivery, the
FBL virtual mailboxes are receiving a moderate number of messages, the
List-Unsubscribe virtual mailbox is receiving a few, and the bounce catchall
is receiving A LOT of bounces. As expected, the older accounts are bouncing
the most.

So with all that explained, I have few questions:

1) What's the optimal way for us to process the bounces? Our plan is to grep
the catchall file and unsubscribe based on the user ID in the original
Return-Path. But will that get them ALL?

2) Should we also be grepping our /var/log/maillog* files and looking for
5xx errors? Or will those all end up in the catchall eventually, after
Postfix gives up trying to deliver? Should we be looking in our logs for
anything else to unsubscribe users?

3) Would we be better off using VERP instead of our custom Return-Path? I've
read through http://www.postfix.org/VERP_README.html but can't tell if that
gives us any advantage over the approach we're using.

4) We want to be good netizens and responsible senders, so can anyone see
any additional steps (general or specific) that we're NOT doing but should
be?

Thanks and Happy New Year,

Steve

Reply via email to