ラズパイでメールサーバーを構築するよ2/2(Postfix+Dovecot)
スポンサーリンク
困惑君
ラズパイでメールサーバー立てようとしたのにどうしてもうまくいかない。。。
悩める人
なんとなくメールサーバー興味あるなぁ。。。

こんな疑問・興味にお答えします。

こんにちは。ゆうです。

ということで、以前から気になっていたメールサーバー構築を本気でやってみました。

この記事を読めばDNS設定・Postfix/Dovecot設定・gmailリレーからメールソフトでのログインまで全て網羅できます!

ではいきましょう!

スポンサーリンク

設定のロードマップ

ここでは、簡単に設定のロードマップを記しました。

第二部では、STEP4から行います。

ドメイン設定

ドメインの購入、DNSの設定をします。

ポートマップ・ファイアウォール設定

この設定をすることで、外部からメールサーバーと通信できるようになります。

SSL/TLS証明書取得(Let's Encrypt)

通信を暗号化するために導入します。

Postfix・Dovecot・gmail relay設定

ある意味メインです。メールサーバーですね。

メール用ユーザーの追加

メールアドレスを使用するユーザーを作成します。

Thunderbirdからメール送受信

無料のメールソフトであるThunderbirdからメールを送ります。

スポンサーリンク

環境

サーバーRaspberry Pi 3 Model B+
Raspberry Pi 4 Model B/4GB
(どちらもRaspbian GNU/Linux 10)
操作PCmacOS Catalina v10.15.5

スポンサーリンク

Postfix

では、(やっと)Postfixの設定をします。ここでは、ついでにDovecotとlibsasl2-modulesを導入します。

sudo apt -y install postfix dovecot-core dovecot-imapd dovecot-pop3d libsasl2-modules

Postfixをインストールする途中にこのような画面が出てきます。了解を選択してください。MacからのVNC接続だと左右矢印で選択できます。

この画面では設定なしを選択してください。

これ以降はファイルをどんどん設定していきます。

/etc/postfix/main.cf

ここでは三通りの設定方法を示します。自分に合う方法で設定してください。

ターミナルで設定(お勧めしない)

このコマンドを使うことで、簡単に設定できます。しかし、ここでの設定のみでは使えず、結局改めて設定する必要があるので、お勧めしません。

sudo dpkg-reconfigure postfix

標準の設定を流用する

まずは、設定ファイルをコピーします。

sudo cp /usr/share/postfix/main.cf.dist /etc/postfix/main.cf

では、設定していきます。ラズパイでは、mousepad, leafpadを使うのがお勧めです。行番号を表示したり、検索を使えたりと便利です。

sudo mousepad /etc/postfix/main.cf
sudo leafpad /etc/postfix/main.cf
sudo nano /etc/postfix/main.cf

まずは行数を表示しましょう。

「表示」→「行番号」を選択してください。

すると、行が表示され、選択した行が太く表示されます。

また、検索を利用すると、簡単に見つけることができます。

「検索」→「検索」を選択してください。

例えば、初めに設定するmail_ownerを検索すると、簡単に出てきます。

では設定していきます。ここでは、独自ドメインをexample.com・ホスト名をmail.example.comとして設定します。これは各自の環境に合わせてください。

行数はバージョンによって変化する可能性があります。

L78 mail_owner

mail_owner = postfix

L94 myhostname

myhostname = mail.example.com

L102 mydomain

mydomain = example.com

L123 myorigin

myorigin = $mydomain

L137 inet_interfaces

inet_interfaces = all

L185 mydestination

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

L338 relayhost

今回はgmailを経由するのでこの設定です。

relayhost = [smtp.gmail.com]:587

L440 home_mailbox

home_mailbox = Maildir/

L574 smtpd_banner

$mail_nameを消す

smtpd_banner = $myhostname ESMTP

L576

コメントアウトする

#smtpd_banner = $myhostname ESMTP $mail_name (Raspbian)

L650 sendmail_path

sendmail_path = /usr/sbin/postfix

L655 newaliases_path

newaliases_path = /usr/sbin/newaliases

L660 mailq_path

mailq_path = /usr/bin/mailq

L666 setgid_group

setgid_group = postdrop

L670, 674, 679, 683

コメントアウトする

# html_directory =
# manpage_directory =
# sample_directory =
# readme_directory =

最後に追記する。

smtpd_tls_cert_file、smtpd_tls_key_fileのドメイン部分を自分のドメインに変更してください。

############
############
smtp_sasl_auth_enable = yes
smtp_tls_security_level = may
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_mechanism_filter = login plain
smtp_sasl_security_options=noanonymous



smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_use_tls = yes
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination


smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes




smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

楽な設定

最低限の設定だけ抜き出しました。私はこれでうまくいきました。

バージョンなどによってうまくいかない可能性は否定できませんが、見やすく、わかりやすいと思います。

sudo mousepad /etc/postfix/main.cf
sudo leafpad /etc/postfix/main.cf
sudo nano /etc/postfix/main.cf

この四箇所だけ自分のドメインに変更してください。

あとはコピペで終わり!

  • myhostname = mail.example.com
  • mydomain = example.com
  • smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
  • smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem

#############
#minify setting!#
#############
# オプションがある場合は、一つだけを示しています。


# COMPATIBILITY
compatibility_level = 2


# LOCAL PATHNAME INFORMATION
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix/sbin
data_directory = /var/lib/postfix


# QUEUE AND PROCESS OWNERSHIP
mail_owner = postfix


# INTERNET HOST AND DOMAIN NAMES
myhostname = mail.example.com
mydomain = example.com


# SENDING MAIL
myorigin = $mydomain


# RECEIVING MAIL
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain



# REJECTING MAIL FOR UNKNOWN LOCAL USERS
#local_recipient_maps = unix:passwd.byname $alias_maps
#unknown_local_recipient_reject_code = 550


# TRUST AND RELAY CONTROL
mynetworks = 127.0.0.0/8


# INTERNET OR INTRANET
relayhost = [smtp.gmail.com]:587


# DELIVERY TO MAILBOX
home_mailbox = Maildir/


# SHOW SOFTWARE VERSION OR NOT
smtpd_banner = $myhostname ESMTP


# DEBUGGING CONTROL
debugger_command =
	 PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
	 ddd $daemon_directory/$process_name $process_id & sleep 5


# INSTALL-TIME CONFIGURATION INFORMATION
sendmail_path = /usr/sbin/postfix
newaliases_path = /usr/sbin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
# html_directory =
# manpage_directory =
# sample_directory =
# readme_directory =



inet_protocols = ipv4



############
############
smtp_sasl_auth_enable = yes
smtp_tls_security_level = may
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_mechanism_filter = login plain
smtp_sasl_security_options=noanonymous



smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_use_tls = yes
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination


smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes




smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

/etc/postfix/master.cf

sudo mousepad /etc/postfix/master.cf
sudo leafpad /etc/postfix/master.cf
sudo nano /etc/postfix/master.cf

変更前

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (no)    (never) (100)
# ==========================================================================
smtp      inet  n       -       y       -       -       smtpd
#smtp      inet  n       -       y       -       1       postscreen
#smtpd     pass  -       -       y       -       -       smtpd
#dnsblog   unix  -       -       y       -       0       dnsblog
#tlsproxy  unix  -       -       y       -       0       tlsproxy
#submission inet n       -       y       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_tls_auth_only=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#smtps     inet  n       -       y       -       -       smtpd
#  -o syslog_name=postfix/smtps
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

変更後

smtpsの部分をコメントアウトします。

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (no)    (never) (100)
# ==========================================================================
smtp      inet  n       -       y       -       -       smtpd
#smtp      inet  n       -       y       -       1       postscreen
#smtpd     pass  -       -       y       -       -       smtpd
#dnsblog   unix  -       -       y       -       0       dnsblog
#tlsproxy  unix  -       -       y       -       0       tlsproxy
#submission inet n       -       y       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#   -o smtpd_sasl_auth_enable=yes
#  -o smtpd_tls_auth_only=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       y       -       -       smtpd
#  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

Gmail SMTP認証

安全性の低いアプリの許可が必要です。ここから、使うアカウントで許可をしてください。

Gmailを使ってリレーを設定します。

sudo mousepad /etc/postfix/sasl_passwd
sudo leafpad /etc/postfix/sasl_passwd
sudo nano /etc/postfix/sasl_passwd

このように記述します。examle.comとしたのは、exampleで登録してるgmailユーザーがいるかもしれないと思ったからです。 gmail.comに直してくださいね。

設定例)

[smtp.gmail.com]:587 自分のID@gmail.com:パスワード

[smtp.gmail.com]:587 example@example.com:example

root以外見れないようにします。

sudo chmod 600 /etc/postfix/sasl_passwd

Postfix検索テーブルを作成します。

sudo postmap /etc/postfix/sasl_passwd

確認

設定が正しいか確認します。

sudo postfix check

エラーが出たら、確認してください。大抵重複した設定などです。

このエラーは無視しても大丈夫でした。

postfix/postfix-script: warning: symlink leaves directory: /etc/postfix/./makedefs.out

再起動します。

sudo systemctl restart postfix

起動状況を確認します。

sudo systemctl status postfix

active(exited)ってなっていたらOKです。(running)にはならないのかな?

● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/lib/systemd/system/postfix.service; enabled; vendor preset: 
   Active: active (exited) since Sun 2020-06-21 22:25:26 JST; 7s ago
  Process: 27609 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 27609 (code=exited, status=0/SUCCESS)

 6月 21 22:25:26 raspberrypi systemd[1]: Starting Postfix Mail Transport Agent..
 6月 21 22:25:26 raspberrypi systemd[1]: Started Postfix Mail Transport Agent.

Dovecot

dovecotはすでに導入しました。

/etc/dovecot/conf.d/10-master.conf

三箇所変更します。

sudo mousepad /etc/dovecot/conf.d/10-master.conf
sudo leafpad /etc/dovecot/conf.d/10-master.conf
sudo nano /etc/dovecot/conf.d/10-master.conf

変更前

service imap-login {
  inet_listener imap {
    #port = 143
  }
  inet_listener imaps {
    #port = 993
    #ssl = yes
  }
...
}

変更後

service imap-login {
  inet_listener imap {
    port = 0 
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
...
}

変更前

service pop3-login {
  inet_listener pop3 {
    #port = 110
  }
  inet_listener pop3s {
    #port = 995
    #ssl = yes
  }
}

変更後

service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}

変更前

service auth {
...
  unix_listener auth-userdb {
    #mode = 0666
    #user = 
    #group = 
  }

  # Postfix smtp-auth
  #unix_listener /var/spool/postfix/private/auth {
  #  mode = 0666
  #}

  # Auth process is run as this user.
  #user = $default_internal_user
}

変更後

service auth {
...
  #unix_listener auth-userdb {
    #mode = 0666
    #user = 
    #group = 
  #}

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }

  # Auth process is run as this user.
  #user = $default_internal_user
}

/etc/dovecot/dovecot.conf

一箇所変更します。

sudo mousepad /etc/dovecot/dovecot.conf
sudo leafpad /etc/dovecot/dovecot.conf
sudo nano /etc/dovecot/dovecot.conf

L30 listen

#listen = *, ::
listen = *, ::

/etc/dovecot/conf.d/10-auth.conf

二箇所変更します。

sudo mousepad /etc/dovecot/conf.d/10-auth.conf
sudo leafpad /etc/dovecot/conf.d/10-auth.conf
sudo nano /etc/dovecot/conf.d/10-auth.conf

L10 disable_plaintext_auth

#disable_plaintext_auth = yes
disable_plaintext_auth = no

L100 auth_mechanisms

auth_mechanisms = plain
auth_mechanisms = plain login

/etc/dovecot/conf.d/10-mail.conf

一箇所変更します。

sudo mousepad /etc/dovecot/conf.d/10-mail.conf
sudo leafpad /etc/dovecot/conf.d/10-mail.conf
sudo nano /etc/dovecot/conf.d/10-mail.conf

L30 mail_location

mail_location = mbox:~/mail:INBOX=/var/mail/%u
mail_location = maildir:~/Maildir

/etc/dovecot/conf.d/10-ssl.conf

二箇所変更します。

sudo mousepad /etc/dovecot/conf.d/10-ssl.conf
sudo leafpad /etc/dovecot/conf.d/10-ssl.conf
sudo nano /etc/dovecot/conf.d/10-ssl.conf

L6 ssl(変えなくても大丈夫かもしれません。)

ssl=yes
ssl=required

L12, 13 ssl_cert, ssl_key

ssl_cert = </etc/dovecot/private/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.key

自分のドメインに変えて設定してください。

ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem

確認

設定が確認できます。ただ、めっちゃいっぱい出てくるので、見るのは面倒くさいです。

dovecot -n

再起動します。

sudo systemctl restart dovecot

起動状況を確認します。

sudo systemctl status dovecot

状態がactive (running)になっていればOKです。

● dovecot.service - Dovecot IMAP/POP3 email server
   Loaded: loaded (/lib/systemd/system/dovecot.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2020-06-21 22:30:43 JST; 5s ago
     Docs: man:dovecot(1)
           http://wiki2.dovecot.org/
 Main PID: 27835 (dovecot)
    Tasks: 4 (limit: 4915)
   Memory: 2.6M
   CGroup: /system.slice/dovecot.service
           ├─27835 /usr/sbin/dovecot -F
           ├─27839 dovecot/anvil
           ├─27840 dovecot/log
           └─27841 dovecot/config

 6月 21 22:30:43 raspberrypi systemd[1]: Started Dovecot IMAP/POP3 email server.
 6月 21 22:30:44 raspberrypi dovecot[27835]: master: Dovecot v2.3.4.1 (f79e8e7e4) starting up for imap, pop3, imap, pop3 (core dumps disabled)

ユーザー追加

メールを送るときのユーザーを追加します。

新規ユーザーが作成されたときに、メール用のディレクトリが作成されるようにします。

sudo mkdir -p /etc/skel/Maildir/{new,cur,tmp}
sudo chmod -R 700 /etc/skel/Maildir/

新規ユーザーを追加します。sudo権限は必要ありません。

❌useraddだとhomeが作成されず、Maildir/が作成されません。

sudo adduser example

今回はテストのため、test1, test2というユーザーを準備しました。次のThunderbirdではこのユーザーを使います。

Thunderbirdでメールの送受信

今回はThunderbirdを使って説明したいと思います。

上のリンクからダウンロードしてください。

注意点

サーバーと同じネットワークからだとログインできません。。。原因はまだわかりません。

そのため、Thunderbirdを導入したPCは、他のネットワークからアクセスしてください。

例えば、携帯のテザリングを使ったり、VPNを利用する方法です。この場合はどちらもアクセスできました。

ログイン

起動したらこのような画面が出てくると思います。出てきたらこのように入力してください。

名前: ユーザーIDでなくても大丈夫です。メールを送った際に相手に表示される名前です。

メールアドレス: ユーザーID@ドメイン

パスワード: ユーザーのパスワードです。

そして、手動設定を押してください。

ここを押せば出てきます。

続けるを押してもすぐにログインできません。

次にこのように設定します。

サーバーのホスト名: mailを付け加えます。

ポート番号・SSL: SSLのところをSSL/TLSにすればポート番号は自動的に変更されます。

認証方法: 通常のパスワード認証です。

再テストというのを押せば、うまく設定できているかわかります。

青枠のような文字が出ていれば、Thunderbirdは外部ネットワークからメールサーバーにアクセスできています。(一部隠しています。) 。完了を押してください。メールアドレスが追加できると思います。

今回はこの手順で、test1・test2ユーザーを追加しました。

ログインできないときは

この場合は、設定が間違っている場合です。サーバーのアドレス(ドメイン)を確認してください。

また、DNS設定、ポートマッピング設定、UFW設定を見直してみてください。

この場合は、サーバーにはアクセスできているものの、ユーザー名・パスワードが違うためログインできていません。確認してみてください。(一部隠しています。)

ローカルでメール送受信

まずはローカルでメールを送り合ってみます。

作成を選択してください。

送る相手をtest2として、メールを送ってみます。

しっかり受信できました。

反対もうまくいきました。

これでローカルでの送受信の確認ができました。

グローバルでメール受信

今度は外からのメールを受信します。

自分の持っているメールアドレスから、メールを送ってみてください。

今回はgmailから送ってみました。(宛先はダミーです。)

もちろんgmail以外から送っても大丈夫ですよ!

しっかり受信できました。

グローバルでメール送信

今度はgmailにメールを送ってみます。もちろんgmail以外にも送信できます。

送信できました。だた、送られてくるアドレスの表示がgmailのものに変化します。

エラーについて

エラーはほんとよく出ます。ここでは、私が直面したエラーと解決方法を紹介します。

基本的にはグローバル送信に関わる物です。gmailの認証とかです。

ログはこれで見ることができます。geanyを使うと、ファイルが更新された時に、更新するか聞いてくれるので便利です。

sudo geany /var/log/mail.log
sudo mousepad /var/log/mail.log
sudo leafpad /var/log/mail.log

SASL authentication failed ~ Username and Password not accepted

ログの例

Jun 21 22:54:02 raspberrypi postfix/smtp[28861]: <...>: to=<...>@gmail.com, relay=smtp.gmail.com[64.233.189.109]:587, delay=1.6, delays=0.18/0/1.4/0, dsn=4.7.8, status=deferred (SASL authentication failed; server smtp.gmail.com[64.233.189.109] said: <...> Username and Password not accepted. Learn more at?535 5.7.8 https://support.google.com/mail/?p=BadCredentials <...> - gsmtp)

以下の可能性があります。確認してみてください。

  • ユーザー名・パスワードが違う可能性
  • 安全性の低いアプリを許可していない可能性。

SASL authentication failed ~ no mechanism available

ログの例

Jun 21 15:54:30 raspberrypi postfix/smtp[2211]: warning: SASL authentication failure: No worthy mechs found
Jun 21 15:54:30 raspberrypi postfix/smtp[2211]: <...>: to=<...>@gmail.com, relay=smtp.gmail.com[74.125.204.108]:587, delay=1.6, delays=0.1/0/1.5/0, dsn=4.7.0, status=deferred (SASL authentication failed; cannot authenticate to server smtp.gmail.com[74.125.204.108]: no mechanism available)

libsasl2-modulesがない可能性があります。導入して、Postfixを再起動してみてください。

sudo apt install libsasl2-modules

delivery temporarily suspended: Host or domain name not found. ~

ログの例

Jun 21 23:05:19 raspberrypi postfix/error[1200]: <...>: to=<...>@gmail.com, relay=none, delay=0.13, delays=0.12/0/0/0.01, dsn=4.4.3, status=deferred (delivery temporarily suspended: Host or domain name not found. Name service error for name=smtp.gmail.com type=A: Host not found, try again)

smtp.gmail.comの表記が違うかもしれません。確認してみてください。

それか、たまたま接続できなかっただけかもしれません。時間をおけば直りました。

スポンサーリンク
おすすめの記事