Trying to use SMTP proxy, but there might be limitations?

Michael Shadle mike503 at gmail.com
Mon Sep 21 00:25:26 UTC 2015


The goal:

To use headers/metadata from the incoming mail message to determine if
delivery should be allowed based on the recipients of the message.
Example: development/test environments, only allow whitelisted
recipients to get messages. I couldn't find any packages, SaaS
services or other options out there (except Mandrill with their
"rules" capability, but there is no API to manage the whitelist...)

I discovered nginx SMTP proxy might actually be able to let me do this
though. It would be great to use PHP (since it's my language of
choice) to do this - a quick lookup in a database (or cache) - so I
liked the possibility of the auth_http option.

However, I can only test and prove the concept for a single "To:
destination" - if there are multiple recipients on the To: line, CC:
or Bcc:, nginx still only seems to see one of them. I don't think this
is only allowed in SMTP pipelining (which last I checked isn't
supported in nginx)

I'm not sure there is a way to make it work. It might simply not be supported.

Here's my config. It seems to pass things around properly and allow me
to send "Auth-Status OK" or "Auth-Status Denied" and properly allow or
deny the message. But it doesn't expand the recipient list.

http {
  server {
    listen 127.0.0.1:8080;
    server_name localhost;
    root /var/www;
    location ~ \.php$ {
      include snippets/fastcgi-php.conf;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
    }
  }
}

mail {
  server_name localhost;
  auth_http 127.0.0.1:8080/filter.php;
  xclient off;
  smtp_capabilities "SIZE 10240000" "VRFY" "ETRN"
"ENHANCEDSTATUSCODES" "8BITMIME" "DSN";
  smtp_auth none;
  proxy on;
  server {
    listen  25;
    protocol smtp;
  }
}

I examined $_SERVER in PHP:

    [HTTP_AUTH_METHOD] => none
    [HTTP_AUTH_USER] =>
    [HTTP_AUTH_PASS] =>
    [HTTP_AUTH_PROTOCOL] => smtp
    [HTTP_AUTH_LOGIN_ATTEMPT] => 1
    [HTTP_CLIENT_IP] => 1.2.3.4
    [HTTP_CLIENT_HOST] => [UNAVAILABLE]
    [HTTP_AUTH_SMTP_HELO] => client-hostname.com
    [HTTP_AUTH_SMTP_FROM] => MAIL FROM:<from at address.com> SIZE=418
    [HTTP_AUTH_SMTP_TO] => RCPT TO:<destination at address.com>
ORCPT=rfc822;destination at address.com

I was looking around to see if the body of the message or headers came
in via stdin, but I can't find much documentation about the SMTP
proxy. Also, I'm not sure ultimately it would help me, as I would have
to somehow "ignore" the recipients that aren't allowed (which could be
any combination, maybe only one is okay, maybe all are okay, maybe 3
out of 5 are okay, etc)

I guess at this point my question is ... any ideas?



More information about the nginx mailing list