Docker 환경의 MailDev에서 SMTP 인증하기

Docker 초보자이므로 개인적인 비망록으로. . .

소개



메일 전송은 Sendmail/SMTP 둘 다를 지원해야 합니다.
그리고 SMTP 배달을 사용하는 경우 SMTP Auth를 사용하여 인증을 사용하는 것이 필수적입니다.

이 때문에 SMTP Auth의 개발·테스트 환경을 만들어 갑니다.

마지막으로 작성한 Docker로 PHP-alpine 메일 전송 테스트(SMTP/sendmail) 환경 구축을 기반으로 step10-php5-xdebug-redis-mail3로 작성합니다.

TL;DR



GitHub의 샘플 코드 Step10을 참조하십시오.
step10-php5-xdebug-redis-mail3

MailDev의 SMTP Auth 지원



SMTP Auth에 대한 대응은 MailDev의 Usage에 쓰여져 있습니다.
MailDev의 기동 옵션에, 「--incoming-user」와「--incoming-pass」를 붙이면 좋다고 합니다.
maildev [options]

  -h, --help                      output usage information
  -V, --version                   output the version number
  -s, --smtp <port>               SMTP port to catch emails [1025]
  -w, --web <port>                Port to run the Web GUI [1080]
・・・省略・・・
  --incoming-user <user>          SMTP user for incoming emails
  --incoming-pass <pass>          SMTP password for incoming emails
・・・省略・・・
  -o, --open                      Open the Web GUI after startup
  -v, --verbose
  --silent

여기까지는 알겠습니다만, 그럼, Docker로서는 어떻게 하면 좋을까? 되었습니다.

MailDev의 DockerHub에 나열된 Dockerfile 를 보면, 마지막에 「CMD ["bin/maildev", "--web", "80", "--smtp", "25"]」라고 하는 기재가 있습니다.

MailDev의 기본 Dockerfile
FROM node:6-alpine
MAINTAINER "Dan Farrelly <[email protected]>"

ENV NODE_ENV production

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ADD package.json /usr/src/app/

RUN npm install && \
    npm prune && \
    npm cache clean \
    rm -rf /tmp/*

ADD . /usr/src/app/

EXPOSE 80 25

CMD ["bin/maildev", "--web", "80", "--smtp", "25"]

여기를 다시 써서 Image를 재작성할까? 라고도 생각했습니다.

추가 조사를 통해 docker-compose.yml에서 command라는 형식으로 지정할 수 있음을 발견했습니다.

  • Docker Compose file reference
  • 직접 링크가 없으므로 리펀리스 페이지에서 command로 검색하십시오.

  • 명령은 docker-compose-yml 또는 dockerfile에서 정의하는 것이 좋습니다.

  • step10의 docker-compose.yml을 다음과 같이 다시 작성합니다.
    SMTP AUTH의 ID/PW는 변경될 가능성이 있으므로 환경 변수 지정으로 합니다.

    docker-compose.yml
    version: '3'
    services:
    ・・・省略・・・
      maildev:
        image: kanemu/maildev-with-iconv
        command: bin/maildev -w 80 -s 25 --incoming-user ${SMTP_USER} --incoming-pass ${SMTP_PASSWORD}
        ports:
          - "1025:25"
          - "8025:80"
    ・・・省略・・・
    
    

    .env 파일에 ID/PW를 추가합니다.

    .env
    MYSQL_RANDOM_ROOT_PASSWORD=yes
    MYSQL_DATABASE=step3
    MYSQL_USER=db_user
    MYSQL_PASSWORD=password
    
    # REDIS関係
    REDIS_PORT=6379
    REDIS_PASSWORD=password
    
    # Mail <-ここ
    SMTP_USER=smtpuser
    SMTP_PASSWORD=password
    

    다음으로 sendmail의 역할을 담당하는 ssmtp.conf에도 SMTP Auth 설정을 추가합니다.
    덧붙여서, 직접 기술하고 있습니다만, 환경 변수로 지정을 할 수 있으면 좋겠습니다만, 좋은 방법은 없을까요?
    음, 최종 수단으로서 .env를 보고 ssmtp.conf를 생성하는 스크립트를 작성하면 됩니다만. . .

    app/ssmtp.conf
    root=postmaster
    mailhub=maildev:25
    hostname=app
    FromLineOverride=YES
    
    AuthUser=smtpuser
    AuthPass=password
    AuthMethod=LOGIN
    
    

    마지막으로 샘플 파일인 index.php의 SMTP 전송 부분을 다시 씁니다.
    sendmail의 분은, SMTP Auth를 ssmtp가 대응해 주었으므로, 수정은 없습니다.

    data/html/index.php
            use PHPMailer\PHPMailer\PHPMailer;
            use PHPMailer\PHPMailer\Exception;
    
            // Load Composer's autoloader
            require 'vendor/autoload.php';
    
            // Instantiation and passing `true` enables exceptions
            $mail = new PHPMailer;
    
            try {
                //Server settings
                echo '<pre class="log">';
                echo 'SMTPでメール配信' . PHP_EOL;
    
                $mail->SMTPDebug = 2;                                       // Enable verbose debug output
                $mail->isSMTP();                                            // Set mailer to use SMTP
                $mail->Host       = 'maildev';  // Specify main and backup SMTP servers
                $mail->SMTPAuth   = true;                                   // Enable SMTP authentication
                $mail->Username   = getenv('SMTP_USER');                     // SMTP username
                $mail->Password   = getenv('SMTP_PASSWORD');                               // SMTP password
                $mail->SMTPSecure = false;                                  // Enable TLS encryption, `ssl` also accepted
                $mail->SMTPAutoTLS = false;
                $mail->Port       = 25;                                    // TCP port to connect to
    
                //Recipients
                $mail->setFrom('[email protected]', mb_encode_mimeheader('日本語送信者名SMTP AUTH'));
                $mail->addAddress('[email protected]', mb_encode_mimeheader('日本語受信者名SMTP AUTH'));     // Add a recipient
    

    테스트



    127.0.0.1에 액세스하면 SMTP/Sendmail에서 메일이 한 번씩 전송됩니다.
    127.0.0.1:8025에 액세스를 하고, 2통의 메일의 수신을 할 수 있으면 OK입니다.



    요약



    이것으로 일반 메일의 테스트에 대응할 수 있다고 생각합니다.

    좋은 웹페이지 즐겨찾기