Docker e Sendmail: testare in locale l'invio di email da un'applicazione php

Problema: come testare in locale con Docker l'invio di email da un'applicazione PHP?

Soluzione: utilizzando MailHog!
E che diavolo è MailHog?? E' un tool per sviluppatori che permette proprio di testare l'invio di mail (tutto in locale) e in accoppiata con mhsendmail permette di far funzionare il tutto con poche righe di configurazione, in 3 semplici step.

STEP 1: aggiungere un container dedicato per MailHog

Nel nostro file docker-compose.yml aggiungiamo un nuovo container

mailhog:
  image: mailhog/mailhog:v1.0.0
  ports:
    - "1025:1025"
    - "8025:8025"

 

STEP 2: creare un nuovo Dockerfile

Aggiungiamo in un Dockerfile (all'interno della directory "mailhog") la configurazione

#
# MailHog Dockerfile
#

FROM golang:1.18-alpine as builder

# Install MailHog:
RUN apk --no-cache add --virtual build-dependencies \
    git \
  && mkdir -p /root/gocode \
  && export GOPATH=/root/gocode \
  && go install github.com/mailhog/MailHog@latest

FROM alpine:3
# Add mailhog user/group with uid/gid 1000.
# This is a workaround for boot2docker issue #581, see
# https://github.com/boot2docker/boot2docker/issues/581
RUN adduser -D -u 1000 mailhog

COPY --from=builder /root/gocode/bin/MailHog /usr/local/bin/

USER mailhog

WORKDIR /home/mailhog

ENTRYPOINT ["MailHog"]

# Expose the SMTP and HTTP ports:
EXPOSE 1025 8025

 

STEP 3: modificare il Dockerfile di PHP

Alla fine nel Dockerfile di PHP aggiungiamo il seguente codice, per poter utilizzare mhsendmail e configurare correttamente la funzione mail() di PHP

RUN apt-get install --no-install-recommends --assume-yes --quiet ca-certificates curl git &&\
    rm -rf /var/lib/apt/lists/*
RUN curl -Lsf 'https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz' | tar -C '/usr/local' -xvzf -
ENV PATH /usr/local/go/bin:$PATH
RUN go get github.com/mailhog/mhsendmail
RUN cp /root/go/bin/mhsendmail /usr/bin/mhsendmail
RUN echo 'sendmail_path = /usr/bin/mhsendmail --smtp-addr mailhog:1025' > /usr/local/etc/php/php.ini

 

FINITO!

Con questi semplici passaggi ora è possibile utilizzare la funzione mail 

mail("test@demo.it", "Oggetto mail", "Il mio messaggio", "From: Sender");

e all'indirizzo http://localhost:8025/ troveremo l'interfaccia di MailHog in cui vedremo tutte le mail inviate dall'applicazione.

 

SOURCES:

  • https://registry.hub.docker.com/r/mailhog/mailhog/Dockerfile
  • https://phauer.com/2017/test-mail-server-php-docker-container/
 


Commenti