docker 컨테이너에서 PHP에서 이메일을 보내고 https에 대응

5818 단어 MailHogPHP도커HTTPS
Docker를 사용하여 로컬 환경을 조심스럽게 준비하려고합니다.
불편(?)이었던 개소를 어떻게든 시도하려고 여러가지 시행착오한 메모입니다.

환경 구성



컨테이너는 Docker Hub의 공식 리포지토리로부터 가져온 PHP와 MySQL을 사용,
이런 구성으로 해 보았습니다.
  • 데비안 9.5
  • PHP 7.2.11
  • Apache 2.4
  • MySQL 5.7.24

  • 대응하고 싶은 몇 가지



    공식 리포지토리에서 가져온 채로 몇 가지 불편한 곳이 있었지만,
    이번 대응하고 싶은 것은 이 두 가지입니다.
  • PHP에서 메일을 보낼 수 없음
  • https에 대응하고 싶다 (자기 서명 증명서로 좋다)

  • PHP에서 메일 보내기



    PHP의 mail 함수로 메일을 보내려고 하면, 에러가 되어 어디에도 도착하지 않고. .
    글쎄, 그렇다.
    어쩔 수 없기 때문에 SMTP 서버를 세울까라고 생각했습니다만, MailHog 가 편리해 보였으므로 도입해 보았습니다.

    소개



    이쪽의 기사를 참고로 했습니다.
    MailHog를 사용하여 메일 전송 테스트 환경을 docker 컨테이너에 만듭니다.
    여기에 쓰여진 대로, docker-compose.yml 에 컨테이너를 추가하고, build 다시 한번만 하면 됩니다.
    간단하네요.

    docker-compose.yml
    mailhog:
        image: mailhog/mailhog
        ports:
          - "8025:8025"
          - "1025:1025"
    

    그러나, 이대로는 SMTP 서버의 설정을 해주지 않으면 송신할 수 없습니다.
    단순히 mail 함수로 보내고 싶었기 때문에, 좀 더 조사해 보면, sendmail 를 옮겨놓는 것으로 mhsendmail 라고 하는 것이 준비되어 있었습니다.
    이쪽은 빌드된 바이너리가 있으므로, 떨어뜨리면 그대로 사용할 수 있을 것 같습니다.
    Dockerfile에 다음을 추가하여 build를 다시 시도합니다.

    Dockerfile
    RUN curl -sSLO https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64 \
        && chmod +x mhsendmail_linux_amd64 \
        && mv mhsendmail_linux_amd64 /usr/local/bin/mhsendmail \
        && echo 'sendmail_path = "/usr/local/bin/mhsendmail --smtp-addr=mailhog:1025"' > /usr/local/etc/php/conf.d/sendmail.ini
    

    선택적 --smtp-addr=은 SMTP 서버와 포트를 지정합니다.mailhogdocker-compose.yml에 설정된 서비스 이름입니다.

    이제 mail 함수에서 보냅니다.
    mail('[email protected]', 'テストだよ', '届いてるかな?', 'From: [email protected]');
    

    브라우저에서 http://localhost:8025/에 액세스하여 확인하면 안전하게 도착했습니다.
    확실합니다.



    메일 데이터가 사라지지 않도록 하고 싶습니다.



    MailHog는 기본적으로 메일 데이터를 메모리에 저장하므로 컨테이너를 중지하거나 삭제하면 데이터가 사라집니다.
    따라서 저장 대상을 파일로 변경하면 사라지지 않습니다.

    환경 변수의 MH_STORAGEmaildir를 지정하여 파일에 저장합니다.MH_MAILDIR_PATH에 저장할 디렉터리를 설정합니다.
    게다가, volumes 의 설정으로, 로컬의 mailhog 디렉토리에 파일을 보존하도록 해 주면 OK입니다.

    docker-compose.yml
    mailhog:
        image: mailhog/mailhog
        ports:
            - "8025:8025"
            - "1025:1025"
        environment:
            MH_STORAGE: maildir
            MH_MAILDIR_PATH: /tmp
        volumes:
            - "./mailhog:/tmp"
    

    https에 대응



    프로덕션 환경은 https라는 것이 기본값이되고 있기 때문에,
    로컬로 개발할 때도 https에 대응해 두고 싶다고.
    Let's Encrypt등도 생각했습니다만, 로컬이고 자기 서명으로 좋은가라고.

    여러가지 조사해 보았습니다만, 단순히 자기 서명 증명서를 만들어 주면 좋을 것 같습니다.Dockerfile에 다음을 추가하여 build를 다시 시도합니다.

    Dockerfile
    RUN openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/ssl-cert-snakeoil.key -out /etc/ssl/certs/ssl-cert-snakeoil.pem -subj "/C=AT/ST=Vienna/L=Vienna/O=Security/OU=Development/CN=localhost"
    RUN a2enmod rewrite \
        && a2enmod headers \
        && a2ensite default-ssl \
        && a2enmod ssl
    

    자기 서명이므로 브라우저의 에러는 나와 버립니다만, 무사 https 에 대응할 수 있었습니다!



    자, 여기까지 할 수 있으면, 나머지는 이제 개발할 뿐입니다!

    좋은 웹페이지 즐겨찾기