Search code examples
phpdockersendmailpostfix-mtafpm

Use PHP sendmail from Docker container to send through host Postfix


I want to send mail from my Alpine-PHP-Fpm container using my host postfix installation.

RECAP

PHP-Fpm Container -> Sendmail -> PostFix on host -> Sending via SMTP

But I get

sendmail: can't connect to remote host (127.0.0.1): Connection refused

Here is the Postfix config:

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no

smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = MYDOMAIN.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost.com, localhost

# SMTP authentication settings
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = static:[email protected]:SECRETPSW
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = may
#header_size_limit = 4096000
relay_destination_concurrency_limit = 20

# Limit DOS Attacks
default_process_limit = 100
smtpd_client_connection_count_limit = 10
smtpd_client_connection_rate_limit = 30
queue_minfree = 20971520
header_size_limit = 51200
message_size_limit = 10485760
smtpd_recipient_limit = 100

# Default relayhost setting
relayhost = smtp.MYDOMAIN.com

mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 172.18.0.3 # Fpm container IP
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = 172.18.0.1 # Docker0 bridge IP
inet_protocols = all

And here is the php.ini mail section:

[mail function]
SMTP = localhost
smtp_port = 25
sendmail_path = "/usr/sbin/sendmail -t -i"
mail.add_x_header = On

Are there any ports that I need to open in my docker-compose file or in the host firewall settings?


Solution

  • I'm not sure about using the host's config/postfix however I can suggest an alternative solution that may work just as well. Add a postfix container and copy the configs from the host to the container:

    services:
      application:
        image: some-company/some-application
        environment:
          - APPLICATION_ENV
        ports:
          - 80:80
    
      smtp:
        image: namshi/smtp
        environment:
          - MAILNAME
          - SMARTHOST_USER
          - SMARTHOST_PASSWORD
        volumes:
          - /etc/postfix/main.cf:/etc/postfix/main.cf
        ports:
          - 25:25
    

    Then you can use smtp as your mailer host / transport and the user/pass from the environment.