この記事は第二部です。第一部をみていない方はこちら
こんな疑問・興味にお答えします。
こんにちは。ゆうです。
ということで、以前から気になっていたメールサーバー構築を本気でやってみました。
この記事を読めばDNS設定・Postfix/Dovecot設定・gmailリレーからメールソフトでのログインまで全て網羅できます!
ではいきましょう!
設定のロードマップ
ここでは、簡単に設定のロードマップを記しました。第二部では、STEP4から行います。
ドメインの購入、DNSの設定をします。
この設定をすることで、外部からメールサーバーと通信できるようになります。
通信を暗号化するために導入します。
ある意味メインです。メールサーバーですね。
メールアドレスを使用するユーザーを作成します。
無料のメールソフトであるThunderbirdからメールを送ります。
第二部では、STEP4から行います。
環境
サーバー | Raspberry Pi 3 Model B+ Raspberry Pi 4 Model B/4GB (どちらもRaspbian GNU/Linux 10) |
操作PC | macOS 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 s
endmail_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を使って説明したいと思います。
上のリンクからダウンロードしてください。
ログイン
起動したらこのような画面が出てくると思います。出てきたらこのように入力してください。
名前: ユーザー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の表記が違うかもしれません。確認してみてください。
それか、たまたま接続できなかっただけかもしれません。時間をおけば直りました。