LoginSignup
1
1

More than 1 year has passed since last update.

Raspberry Pi 3でDockerコンテナを使ってメールを送信する

Last updated at Posted at 2021-01-01

はじめに

LAN内から認証無しでメール送信が行えるDockerイメージを見つけたので、"Dockerの「マルチCPUアーキテクチャ」に対応したイメージをビルドする"を参考にlinux/amd64,linux/arm64,linux/arm/v7に対応したイメージを作成しRaspberry Pi 3 Model B+上でDockerコンテナを動かしてみました。
作成したDockerイメージは Docker Hubに置いています。
NASや家電製品、Raspberry Pi上のアプリケーションからPostfix Dockerコンテナを介してメールを送信できます。

OP25B(Outbound Port 25 Blocking) の制約があるため、Dockerコンテナから直接相手のメールサーバーにメールを送信せず外部のSMTPサーバーをリレーして送信します。そのため、契約しているプロバイダーのSMTPサーバーの接続情報やリレーを許可しているSMTPサーバーが必要です。

Raspberry Pi 3と書いていますが、マルチCPUアーキテクチャ(linux/amd64,linux/arm64,linux/arm/v7)に対応したDockerイメージを使用するので、それらの環境でも動作すると思います。

参考情報

リポジトリ

Dockerfileやイメージはこちらに置いています。

準備するもの

  • 契約しているプロバイダーのSMTPサーバー接続情報
  • Raspberry Pi 3 Model B+ (Raspberry Pi 4を持っていないので、Raspberry Pi 3で動作確認しています。Raspberry Pi 4でも動作すると思います。)
  • docker実行環境

Dockerコンテナを起動

Docker Hubに置いているイメージを利用してコンテナを起動します。

docker container run -d --name postfix -p "25:25"  \
       -e SMTP_SERVER=smtp.bar.com \
       -e SMTP_USERNAME=foo@bar.com \
       -e SMTP_PASSWORD=XXXXXXXX \
       -e SERVER_HOSTNAME=helpdesk.mycompany.com \
       revsystem/postfix:latest

リレー先SMTPサーバの認証情報をそれぞれ指定します。SERVER_HOSTNAMEはDockerコンテナのホスト名を指定します。
SMTP_PORTを指定しない場合は、デフォルトで587番ポートが設定されます。
J:COMなど587番ポートではなく465番ポートが開放されている場合は。SMTP_PORTに465番ポートを指定します。
例)

docker container run -d --name postfix -p "25:25"  \
       -e SMTP_SERVER=smtp.bar.com \
       -e SMTP_PORT=465
       -e SMTP_USERNAME=foo@bar.com \
       -e SMTP_PASSWORD=XXXXXXXX \
       -e SERVER_HOSTNAME=helpdesk.mycompany.com \
       revsystem/postfix:latest

メールを送信

Dockerホストの25番ポートをDockerコンテナの25番ポートに転送しています。LAN内の機器からはSMTPサーバ名にDockerホストのIPアドレス、ポート番号 25を指定することでメールを送信できます。

送信テストをする場合、RaspberryPiからメールを送信してみた。【Python】【Postfix】を使用。 で公開されているsendMail.pyをDockerホストに置いてto_addr,from_addrを自分のメールアドレスにして実行することでテストすることができます。

32bit OS上でこのイメージを使用する場合

Dockerfileでalpine:3.13を指定しています。しかし、Alpine Linux 3.13.0ではmuslというライブラリの影響で32bit OS上では動作に影響があるようです。

Raspberry PiのDocker環境でAlpine Linuxイメージ(3.13以降)を使用する際の注意点

musl というライブラリがアップデートされたことにより32bit環境において時間に関する仕様変更があったようで、これを回避するためには --security-opt=seccomp=unconfined というオプション付きで docker run すれば良さそうです。

--security-opt=seccomp=unconfined はコンテナのセキュリティレベルが下がるようなので使用の際には注意が必要です。

上記のように --security-opt=seccomp=unconfined オプションをつけることで影響を回避することができます。

docker container run --security-opt=seccomp=unconfined \
       -d --name postfix -p "25:25"  \
       -e SMTP_SERVER=smtp.bar.com \
       -e SMTP_USERNAME=foo@bar.com \
       -e SMTP_PASSWORD=XXXXXXXX \
       -e SERVER_HOSTNAME=helpdesk.mycompany.com \
       revsystem/postfix:latest

しかし、Release Notes for Alpine 3.13.0にこのように書かれているとおり、セキュリティレベルを下げてしまいます。

but note that this will reduce the security of the host against malicious code in the container.

dockerホスト上のlibseccomp2をアップデートすることで、--security-optを使用せずに影響を回避することができます。

raspberry pi + docker + alpine で apk が動かなくなる問題

ホスト側(raspberry pi側)の libseccomp2 を debian から公開されたものにアップデートすることで解決した。

alpine 3.13, armv7 network-access seems to be broken #135 を参考に、ibseccomp2_2.5.3-2_armhf.debにアップグレードすることで --security-opt を使用せずに docker runが動作しました。

wget http://ftp.de.debian.org/debian/pool/main/libs/libseccomp/ibseccomp2_2.5.3-2_armhf.deb
dpkg -i ibseccomp2_2.5.3-2_armhf.deb
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1