Raspberry Piでメールサーバを作る

MyDNS.JPでドメインを設定すると、そのドメインでメールサーバを立てることもできるので作ってみる。

外部のメールサーバとメールのリレーができるように25番ポートを開放する

下記コマンドで既に作成してあるポート開放スクリプトSMTP(25番ポート)のポート番号を追加する。(for port in …; doの…の部分に開放したいポート番号をスペースで区切って追加する。)

sudo sed -i -e 's/for port in \([0-9 ]*\); do/for port in \1 25; do/' /usr/local/bin/mydnsupdate.sh

メールサーバのインストール、メール転送設定

外部とのメール送受信ができるようにメールサーバのPostfixを非対話形式でインストール、メールで使うドメイン名を設定、webmaster、www-data宛のメールがrootに、root宛のメールがpiユーザから変更したユーザに転送されるように設定を追加して、設定を反映させる。(www-dataはWebサーバ等をインストールしなくても存在している。webmasterはApacheをインストールした際にデフォルトの管理者として設定される。)

sudo DEBIAN_FRONTEND=noninteractive apt-get install -y postfix
sudo sh -c 'echo "example.mydns.jp" > /etc/mailname'
sudo sed -i -e '/^mydestination/i\myorigin = /etc/mailname' /etc/postfix/main.cf
sudo sed -i -e '/^mydestination/s/example,/example.mydns.jp, example,/' /etc/postfix/main.cf
sudo sh -c 'echo "webmaster:     root" >> /etc/aliases'
sudo sh -c 'echo "www-data:      root" >> /etc/aliases'
sudo sh -c 'echo "root:          chguser" >> /etc/aliases'
sudo newaliases
  • ※chguserの部分はpiユーザから変更したユーザ名に置き換える。

mailコマンドのインストールとメールの送受信テスト

コマンドでメールの送受信を行う場合は、下記コマンドでheirloom-mailxをインストールして、mailコマンドとして呼び出せるようにシンボリックリンクを作成する。

sudo apt-get install -y heirloom-mailx
cd /usr/bin/
sudo ln -s heirloom-mailx mail
cd

mailコマンドは、メールがあれば一覧で表示し、一覧で示されたメールの番号を入力すると内容が表示される。dでメールの削除、rでメールの返信が行える。
メールの返信は本文入力後、行頭に「.」を入力すれば本文入力終了となる。qでmailコマンドの終了となる。
mailコマンドで、宛先メールアドレスを指定するとメールの送信となる。「Subject: 」が出たら件名を入力、その後に本文を入力し、「.」でメール作成終了となる。

OP25Bを実施しているプロバイダでメール送信するために587番ポートを開放する

外部のメールサーバへメールをリレーする際に25番ポートが使えないので、ポート開放スクリプトにサブミッションポート(587番ポート)のポート番号を追加する。

sudo sed -i -e 's/for port in \([0-9 ]*\); do/for port in \1 587; do/' /usr/local/bin/mydnsupdate.sh

OP25Bを実施しているプロバイダでメール送信するためにPostfixの設定を行う

メールのリレー先として、外部のメールサーバのアカウントが必要になる。Gmailも使えるが、メール送信元がGmailアカウントに書き換わってしまう仕様なので注意が必要。
下記コマンドでリレー先のSMTPサーバ名とポート番号を指定、SMTP認証を有効化、SMTP認証に使うパスワードファイルを指定、SMTP認証を必須に設定、古いTLS有効化設定をコメント化して、新しいTLS有効化設定を追記サーバ証明書検証用のパスを設定、SMTPサーバ名とポート番号、ユーザ名とパスワードを記述してSMTP認証用に使うパスワードファイルを作成、パスワードが記述されているので他のユーザから見えないパーミッションに設定、パスワードファイルを有効化して、Postfixを再起動する。

sudo sed -i -e 's/^relayhost = $/relayhost = [smtp.gmail.com]:587/' /etc/postfix/main.cf
sudo sh -c 'echo "smtp_sasl_auth_enable = yes" >> /etc/postfix/main.cf'
sudo sh -c 'echo "smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd" >> /etc/postfix/main.cf'
sudo sh -c 'echo "smtp_sasl_security_options = noanonymous" >> /etc/postfix/main.cf'
sudo sed -i -e '/smtpd_use_tls=yes/s/^/#/' /etc/postfix/main.cf
sudo sh -c 'echo "smtp_tls_security_level = may" >> /etc/postfix/main.cf'
sudo sh -c 'echo "smtp_tls_CApath = /etc/ssl/certs" >> /etc/postfix/main.cf'
sudo sh -c 'echo "[smtp.gmail.com]:587 hogehoge:foobar" > /etc/postfix/sasl_passwd'
history -c
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo systemctl restart postfix
  • smtp.gmail.comの部分は実際に使うメールアカウントのSMTPサーバ名を、hogehogeとfoobarの部分は実際に使うメールアカウントのユーザ名とパスワードに置き換える。
  • ※~/.bash_historyにパスワードが記載されてしまうので「history -c」でコマンド履歴を削除している。

メール受信のために110番ポートと143番ポートを開放する

下記コマンドで既に作成したポート開放スクリプトPOP3110番ポート)とIMAP(143番ポート)のポート番号を追加する。

sudo sed -i -e 's/for port in \([0-9 ]*\); do/for port in \1 110 143; do/' /usr/local/bin/mydnsupdate.sh

POP3IMAPのポート開放とPOP3/IMAPサーバのインストール

下記コマンドでPOP3/IMAPサーバのDovecotDovecotPOP3モジュール、DovecotIMAPモジュールをインストール、非SSL接続時に平文認証できるように設定を書き換え、Dovecotを再起動する。

sudo apt-get install -y dovecot-core dovecot-pop3d dovecot-imapd
sudo sed -i -e 's/^#disable_plaintext_auth = yes/disable_plaintext_auth = no/' /etc/dovecot/conf.d/10-auth.conf
sudo systemctl restart dovecot
  • ※メールボックスが空だとPOP3クライアントの初期設定時に失敗することがあるので、何らかメールを受け取った状態にしておくか、IMAP4クライアントを使用する。

メール送信のために587番ポートを開放する

OP25Bを実施しているプロバイダでメールをリレーするために既にポート開放を行っている場合は必要ない。
下記コマンドで既に作成したポート開放スクリプトにサブミッションポート(587番ポート)のポート番号を追加する。

sudo sed -i -e 's/for port in \([0-9 ]*\); do/for port in \1 587; do/' /usr/local/bin/mydnsupdate.sh

サブミッションポートの開放とSMTP認証の設定

下記コマンドでDovecotPostfixSMTP認証ができるように設定を書き換え、PostfixDovecotを使ったSMTP認証ができるように設定を書き換え、Postfixのサブミッションポートを有効化して、DovecotPostfixを再起動する。

sudo sed -i -e '/#  mode = 0666/a\    user = postfix\n    group = postfix' /etc/dovecot/conf.d/10-master.conf
sudo sed -i -e 's/#  mode = 0666/#  mode = 0660/' /etc/dovecot/conf.d/10-master.conf
sudo sed -i -e '/#unix_listener/,/#}/s/#//' /etc/dovecot/conf.d/10-master.conf
sudo sed -i -e 's/^smtpd_use_tls=yes/#smtpd_use_tls=yes/' /etc/postfix/main.cf
sudo sh -c 'echo '\''smtpd_sasl_type = dovecot'\'' >> /etc/postfix/main.cf'
sudo sh -c 'echo '\''smtpd_sasl_path = private/auth'\'' >> /etc/postfix/main.cf'
sudo sh -c 'echo '\''smtpd_sasl_auth_enable = yes'\'' >> /etc/postfix/main.cf'
sudo sh -c 'echo '\''mua_client_restrictions = permit_sasl_authenticated,reject'\'' >> /etc/postfix/main.cf'
sudo sh -c 'echo '\''broken_sasl_auth_clients = yes'\'' >> /etc/postfix/main.cf'
sudo sed -i -e '/^#submission /,/^#smtps /s/^#  -o smtpd_sasl_auth_enable=yes/  -o smtpd_sasl_auth_enable=yes/' /etc/postfix/master.cf
sudo sed -i -e '/^#submission /,/^#smtps /s/^#  -o smtpd_client_restrictions=$mua_client_restrictions/  -o smtpd_client_restrictions=$mua_client_restrictions/' /etc/postfix/master.cf
sudo sed -i -e '/^#submission /s/^#//' /etc/postfix/master.cf
sudo sed -i -e 's/^auth_mechanisms = plain/auth_mechanisms = plain login/' /etc/dovecot/conf.d/10-auth.conf
sudo systemctl restart dovecot
sudo systemctl reload postfix
  • ※/etc/dovecot/conf.d/10-master.confの「service auth {」から「}」の間にある「#unix_listener /var/spool/postfix/private/auth {」から「#}」のコメント化を解除して、「mode = 0666」を「mode = 0660」に書き換えて、その直後に「user = postfix」、「group = postfix」の2行を追加している。
  • ※/etc/postfix/main.cfの「smtpd_use_tls=yes」をコメント化し、「smtpd_sasl_type = dovecot」、「smtpd_sasl_path = private/auth」、「smtpd_sasl_auth_enable = yes」、「mua_client_restrictions = permit_sasl_authenticated,reject」、「broken_sasl_auth_clients = yes」の5行を追加している。
  • ※/etc/postfix/master.cfの「#submission inet…」から「# -o milter_macro_daemon_name=…」の間にある「#submission inet…」と「# -o smtpd_sasl_auth_enable=…」と「# -o smtpd_client_restrictions=…」のコメント化を解除している。
  • ※/etc/dovecot/conf.d/10-auth.confの「auth_mechanisms = plain」を「auth_mechanisms = plain login」に書き換えている。