今朝何気にこの記事を見て「そういえば、MTAって随分とゼロから立ててないな…」と思った。いつもとりあえずlocalhostで動くPHPからメール送信できるだけのPostfixしか構築やってないからね。
ということで、MTAを立ててPOP3・送信用のSMTPクライアントにもできるようなサーバを作ってみることにした。
- 要件
- サーバの調達と構築
- Postfixのインストールと設定
- ポートを開ける
- バーチャルアカウントの設定
- TLS/SSL環境を整える
- クライアントソフト(Thunderbird)でメール受信するために
- クライアントソフト(Thunderbird)でメール送信するために
- スパム対策(送信)のためにDKIMとDMARCの設定をする
- スパム対策(受信)のために
要件
- Linuxで。
- サーバ名は、mail.mtasetupR7.example.jp で使うメールアドレスは、itoh@mtasetupR7.example.jp
- 今時のSecureな感じ。
- Linuxのアカウントとは別の仮想的なPOP3/SMTPアカウントを作って送受信できること。
- 日本語のスパム判定ソフトも入れてみたい。
これくらいかな…
図にするとこんな感じである。

サーバの調達と構築
アカウント持ってるのでさくらのクラウドで一番安いヤツを調達。1日借りても126円。1時間12年の見積もり。
今日は缶コーヒーを買わないことにする。
プラン/1Core-1GBの、Ubuntu Server 24.04.1 LTS 64bitでハードディスクは20GB、名前をmtaにして構築。
これで十分でしょう。個人的な好みではDebianがいいかなーって思ったけど、あえて違うディストリビューションを選ぶのもまたよいでしょう。
DNSの設定
取得したIPアドレスをmxレコードにする。DNSは本筋じゃないので、この1行だけでお手軽に、Value-Domainの設定だとこんな感じ。
a mail 163.43.224.252 mx mail 10
nslookupで確認
~$ nslookup > set type=mx > mtasetupR7.example.jp Server: 10.255.255.254 Address: 10.255.255.254#53 Non-authoritative answer: mtasetupR7.example.jp mail exchanger = 10 mail.mtasetupR7.example.jp. Authoritative answers can be found from: > set type=a > mail.mtasetupR7.example.jp Server: 10.255.255.254 Address: 10.255.255.254#53 Non-authoritative answer: Name: mail.mtasetupR7.example.jp Address: 163.43.224.252
とりあえずPostfixを入れる
Ubuntu24 ServerってPostfixがデフォルトらしいけど、素のままではMTA入ってないんだ…。
rootになってとりあえずUpdate
apt update && apt upgrade -y
hostnameも設定しておく
hostnamectl set-hostname mail.mtasetupR7.example.jp
Postfixのインストール
apt install -y postfix
Configurationは
| 項目 | 設定値 |
|---|---|
| General mail configuration type | Internet Site |
| System mail name | mail.mtasetupR7.example.jp |
自分用にmailコマンドとemacsを入れておく
apt install -y mailutils emacs
Postfixのインストールと設定
Ubuntu(ってかDebian)ってなんか随分とmain.cfが少なくなってんだな。
とりあえず、postconf コマンドで現在の内容確認しつつやる。
main.cfで自分のホスト名とドメイン名、受信ドメインを設定する。
postconfだと、
mydestination = $myhostname, mail.mtasetupR7.example.jp, mta, localhost.localdomain, localhost mydomain = localdomain myhostname = mta.localdomain myorigin = /etc/mailname
になってる。/etc/hostname の内容は mail.mtasetupR7.example.jp
mydestinaitonにmtaが入ってるのは、さくらのクラウドで構築した時の名前かな。
こんな感じに変更
mydestination = $myhostname, $mydomain, localhost myhostname = mail.mtasetupR7.example.jp mydomain = mtasetupR7.example.jp myorigin = $mydomain
myoriginって何かと思ったけど、ローカルからmailコマンドでメールする時に自動で@以降に付くドメインなのね。忘れてるわー。多分1週間後にも忘れてる…
ネットワーク設定でipv6はよくわかってないのでパス。まぁ、あと30年はipv4は無くならないでしょう。
inet_protocols = ipv4
ここで postconf -n してwarningとか出てないかチェック。
ポートを開ける
使うTCPポートは以下の通り。
| プロトコル | ポート番号 | 説明 |
|---|---|---|
| SMTP | 25 | 外部からのメール受信 |
| SMTPS | 465 | SMTP over SSL(必要に応じて) |
| Submission | 587 | クライアントからのメール送信(推奨) |
| IMAP | 143 | クライアントがIMAPでメール受信 |
| IMAPS | 993 | IMAP over SSL(推奨) |
| POP3 | 110 | クライアントがPOP3でメール受信 |
| POP3S | 995 | POP3 over SSL(推奨) |
ながらくDebianを継ぎ足して使っているので、iptables -Lとかやってるんだけどイマドキはfirewall-cmdとか使うんだな。Ubuntuだとufwらしい。ちなみに、Debian12だとnftablesが推奨らしい。いやはやなんでディストリビューションごとにコマンド違うねーん。まあ、違うからディストリビューションなんだけどさ…
ufw allow 22/tcp ufw allow 25/tcp ufw allow 587/tcp ufw allow 993/tcp ufw allow 995/tcp ufw allow 80/tcp ufw allow 443/tcp
sshが切られるとかなんので起動する前に ufw show added でチェックする。先ほどのコマンドと同じものが出てくる。
ufw enable
で、ufw statusすると状態が確認できる。
80と443番はSSL証明書のLet's Encryptを利用する際に使用する。
ufw status numbered
で、番号確認して
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 25/tcp ALLOW IN Anywhere
[ 3] 587/tcp ALLOW IN Anywhere
[ 4] 993/tcp ALLOW IN Anywhere
[ 5] 995/tcp ALLOW IN Anywhere
[ 6] 80/tcp ALLOW IN Anywhere
[ 7] 443/tcp DENY IN Anywhere
[ 8] 22/tcp (v6) ALLOW IN Anywhere (v6)
[ 9] 25/tcp (v6) ALLOW IN Anywhere (v6)
[10] 587/tcp (v6) ALLOW IN Anywhere (v6)
[11] 993/tcp (v6) ALLOW IN Anywhere (v6)
[12] 995/tcp (v6) ALLOW IN Anywhere (v6)
[13] 80/tcp (v6) ALLOW IN Anywhere (v6)
[14] 443/tcp (v6) DENY IN Anywhere (v6)
なので、
ufw delete 6
とかして複数指定できないのでチマチマと消していく。
メールチェック
この時点でメールを受信できているか確認すると問題なくGmailから受信できていた。
バーチャルアカウントの設定
Ubuntuのアカウントと連動させないでバーチャルメールボックスにする。 まぁ、アカウントのメールボックスでもいいんだけど、メールとしてしか使用しないならそれでもいいじゃんと。
バーチャルアカウント用アカウントの作成
新しい古新聞みたいな言い回し…アカウント名はなんでもいいけどvmailユーザーにします。
sudo groupadd vmail sudo useradd -r -g vmail -m -d /var/mail -s /sbin/nologin vmail
- -r: システムユーザーとして作成
- -g vmail: vmail グループに所属
- -m: ホームディレクトリを作成
- -d /var/mail: メールボックスが保存されるディレクトリ
- -s /sbin/nologin: ログインしないので不許可にしておく
メールボックス周りの設定
このドメイン用のメールディレクトリを作成して、所有権をvmailにしておく。
mkdir -p /var/mail/vhosts/mtasetupR7.example.jp chown -R vmail:vmail /var/mail/vhosts/mtasetupR7.example.jp chmod -R 700 /var/mail/vhosts/mtasetupR7.example.jp
main.cfの設定
# どのドメインがバーチャルメールボックスを使うかを明記 virtual_mailbox_domains = mtasetupR7.example.jp # メールボックスのルートディレクトリ virtual_mailbox_base = /var/mail/vhosts # バーチャルメールボックスの設定ファイル virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox
バーチャルメールボックスのユーザーごとのディレクトリ設定
先ほどの /etc/postfix/virtual_mailboxにメールアドレスごとにディレクトリを指定する。ディレクトリのbaseになるのは virtual_mailbox_base の値。
itoh@mtasetupR7.example.jp mtasetupR7.example.jp/itoh/
この時、ディレクトリ指定として末尾の/を忘れるとmbox形式になるので、Maildir形式にしたい場合は注意が必要。
先にディレクトリを掘っておいてvmailユーザーオーナーにする。
mkdir -p /var/mail/vhosts/mtasetupR7.example.jp/itoh
設定ファイルを記述したらpostmapコマンドでBerkeley DB (BDB) 形式に変換する。
postmap /etc/postfix/virtual_mailbox
以下のpostmapコマンドでメールアドレスに対応するディレクトをチェックできる。
postmap -q "itoh@mtasetupR7.example.jp" hash:/etc/postfix/virtual_mailbox
いったんここまででPostfixをrestartしてチェック。
systemctl restart postfix
同じドメインをmydestination と virtual_mailbox_domains の両方に設定してはいけない
送信テストしたら、User unknownでエラーメールがが返ってきた。サーバのエラーログを見ると、
warning: do not list domain mtasetupR7.example.jp in BOTH mydestination and virtual_mailbox_domains
ということで、mydestinationからは ochi2poingpont.org を削除。
またエラーログ出てた…ので対応。
warning: recipient itoh@mtasetupR7.example.jp: not found in virtual_uid_maps
main.cfで保存するメールのOS上のオーナーとグループを指定しないといけないらしい。なんで?
idコマンドでuidを見つける。
id vmail uid=999(vmail) gid=1001(vmail) groups=1001(vmail)
ここまででメール送信テストすると受信できてバーチャルメールボックスの所定のディレクトリに入っていた。
TLS/SSL環境を整える
証明書、自前のオレオレ証明書でもいいんだけど、まぁちゃんとやるならLet's Encryptで取得しても大差ないかな…と。
サーバに使われる証明書はなんや?って話
証明書は送受信になるから複数のケースで使われる。
- 自分から相手のメールサーバの25番ポートにSMTP送信する時にSTARTTLSで使用する時…HELO/EHLOホスト名で行ってもよさそうなもんだけど、これは行わない。送信側の証明書はチェックされない。SPFやDKIMによるチェックを受信側が行う必要がある。ちなみに、HELO/EHLOホスト名は、Receivedヘッダに表示される。Received: from e234-1.smtp-out.ap-northeast-1.amazonses.com とか。
- 相手のメールサーバから自分の25番ポートにSTARTTLSを使って配送されてきた時…自分のmydestinationやvirtual_mailbox_domainsにあるドメインで問い合わせてくるサーバに対しては、ドメイン→mxレコードで指定されたサーバ名の証明書が使われる。
- メールクライアントソフト(Thunderbirdなど)からSMTP/POP3認証される時…メールクライアントソフト(Thunderbirdなど)が証明書を確認する時は、メールクライアントソフトのサーバ設定で指定された接続先サーバ名の証明書が使われる。
で、メールクライアントソフトから接続される場合は、どのメールを出しているかだけのチェックなので複数ドメインのMTAとして稼働している場合は、なんか適当なホスト名を付けて証明書を取得するのがよいだろう。 たとえば、valud-domainのCoreサーバなんかは、接続先メールサーバはどのドメインとっても同じコアサーバ(m34.coreserver.jpとか)である。ただし、受信する時にはそうはいかない。
ということで、必要な証明書は、mxレコードに記載しているホスト名
$ nslookup > set type=mx > mtasetupR7.example.jp Server: 10.255.255.254 Address: 10.255.255.254#53 Non-authoritative answer: mtasetupR7.example.jp mail exchanger = 10 mail.mtasetupR7.example.jp.
なので、mail.mtasetupR7.example.jp.をウェブサーバをこのサーバに立ててLet's Encryptの証明書を取得する。
Let's Encryptで証明書取得
apt install -y certbot certbot certonly --standalone
であとは英語の内容に従って進むだけ。…あれ?Apache要らないの?ChatGPTに聞いたら、「Certbotが一時的に自分自身でウェブサーバの役割を果たし、証明書を発行します。」ってことらしい。すげーね。
こんな感じでした。自前証明書より楽かも。
# certbot certonly --standalone Saving debug log to /var/log/letsencrypt/letsencrypt.log Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): Invalid email address: . If you really want to skip this, you can run the client with --register-unsafely-without-email but you will then be unable to receive notice about impending expiration or revocation of your certificates or problems with your Certbot installation that will lead to failure to renew. Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): ********@********.****** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf. You must agree in order to register with the ACME server. Do you agree? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: y - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing, once your first certificate is successfully issued, to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: n Account registered. Please enter the domain name(s) you would like on your certificate (comma and/or space separated) (Enter 'c' to cancel): mail.mtasetupR7.example.jp Requesting a certificate for mail.mtasetupR7.example.jp Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/mail.mtasetupR7.example.jp/fullchain.pem Key is saved at: /etc/letsencrypt/live/mail.mtasetupR7.example.jp/privkey.pem This certificate expires on 2025-06-23. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate * Donating to EFF: https://eff.org/donate-le - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
証明書の更新
あとは、/etc/cron.d/certbot にて既に登録してあるので自動更新される…はず。
クライアントソフト(Thunderbird)でメール受信するために
Thunderbird Portableを持ってきてインストールしておく。
Dovecot のインストールと設定
apt install dovecot-pop3d dovecot-core
設定値は doveconf コマンドで確認できる。-Pオプションでssl_keyの設定値も確認できる。
証明書をLet's Encryptで取得したもので指定
ssl_cert = </etc/letsencrypt/live/mail.mtasetupR7.example.jp/fullchain.pem ssl_key = </etc/letsencrypt/live/mail.mtasetupR7.example.jp/privkey.pem
サーバー上に複数のホストがあり、同一のIPアドレスを使っている場合に、local_nameディレクティブを使った設定ができるようだ。
local_name example1.org {
ssl_cert = </etc/pki/dovecot/certs/example1.org.crt
ssl_key = </etc/pki/dovecot/private/example1.org.key
}
local_name example2.org {
ssl_cert = </etc/pki/dovecot/certs/example2.org.crt
ssl_key = </etc/pki/dovecot/private/example2.org.key
}
…が、今回はやらない。ここは何もしない。
あと、使うのはIPv4だけする。
listen = *
POP3の認証設定
このあたりの設定は、こちらの記事を参考にしている。
# パスワードをcram-md5で暗号化したもので設定する。 auth_mechanisms = cram-md5 # システムで使っているPAM認証はコメントアウトして無効化 # !include auth-system.conf.ext # 有効化 !include auth-passwdfile.conf.ext # 有効化 !include auth-static.conf.ext
バーチャルメールボックスにアクセスできるパスワード設定を行う。
args = scheme=CRYPTを args = scheme=CRAM-MD5 に変更。
passdb {
driver = passwd-file
args = scheme=CRAM-MD5 username_format=%u /etc/dovecot/users
}
#userdb {
# ... このセクションは全部無効化し、auth-static.conf.ext の設定を活かす
#
#}
uid,gitは先ほど作成したLinuxユーザーのvmailと同じになるようにして、メールの入っているディレクトリは、/var/mail/vhostsになるようにする。%dはドメイン名%nはユーザー名
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%u
}
最後にメールの保管されているディレクトリの設定で、Maildir形式でスプール先のディレクトリを先ほどと同様に指定する。
mail_location = maildir:/var/mail/vhosts/%d/%n
dovecot独自のユーザー情報の作成
パスワードをCRAM-MD5で設定したので、それで作成する。
doveadm pw -s CRAM-MD5
とすると、ハッシュ化したパスワードを作ってくれる。
{CRAM-MD5}f5696175cd91366a37790asef93f3jlf3f3767b0da65d1a85bad8757dbd42
ユーザー情報は、 /etc/dovecot/conf.d/auth-passwdfile.conf.ext で設定した通り、/etc/dovecot/usersに記す。
itoh@mtasetupR7.example.jp:{CRAM-MD5}f5696175cd91366a37790asef93f3jlf3f3767b0da65d1a85bad8757dbd42
で、 systemctl restart dovecot 再起動。
ここまででThunderbirdから確認
こんな感じで設定。
Thunderbirdのアカウント追加はメールアドレスとさっきCRAM-MD5で設定したパスワードを入力すればうまくやってくれた。
Thunderbirdがうまくやってくれた設定はこんな感じ。

クライアントソフト(Thunderbird)でメール送信するために
SMTP認証をしなければならない。なんか、15年前にやった時は死ぬほど面倒だったな…あれー、その時の記事ってどこいったかな…自前サーバだったから無くなったか。
SASLによる認証とは?
SMTP認証を行う際に使用されるSASL (Simple Authentication and Security Layer) とは、メールやその他のネットワークプロトコルで認証機能を提供するためのフレームワーク。
Postfixでは、SMTP認証を有効にするために SASL を利用する。次の2つの実装がある。
・Cyrus SASL: libsasl2 ライブラリを使用する実装
・Dovecot SASL: Dovecot(IMAP サーバー)が提供する SASL 認証機能
SASL の認証方法としては以下がある。
・PLAIN: ユーザー名とパスワードを Base64 でエンコードして送信(暗号化なしでは危険)
・LOGIN: PLAIN とほぼ同じ(非推奨)
・CRAM-MD5: MD5 ハッシュを用いたチャレンジレスポンス認証
・DIGEST-MD5: CRAM-MD5 の強化版(現在は非推奨)
・SCRAM-SHA-1 / SCRAM-SHA-256: より安全なチャレンジレスポンス認証
・OAuth / OAUTHBEARER: OAuth 2.0 トークンを利用した認証
PostfixでSMTP認証をSASLで実現
smtpd_sasl_auth_enable = yes smtpd_sasl_security_options = noanonymous,noplaintext smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_optionsは以下の意味のオプション値なので,区切りで複数並べられる。
- noplaintext: 平文パスワードを使う認証方法を許可しません。
- noactive: non-dictionary active 攻撃に脆弱な認証方法を許可しません。
- nodictionary: passive dictionary 攻撃に脆弱な認証方法を許可しません。
- noanonymous: 匿名ログインを許可しません。
smtpd_sasl_local_domainはSASLの認証の際にユーザー名だけが送られてきたら、@以下を子のドメインで補完するという設定。設定しなくてもいいんじゃないかな。
DovecotのID/PASSを使ってSMTP認証をしたい。
せっかくDovecotでID/PASS設定をしたので、それをSMTP認証でも使い回したいじゃないですか。
デフォルトだと、smtpd_sasl_type = cyrus のため、saslpasswd2 コマンドを使ってID/PASS設定DBを作ってそれをSMTP認証用として使うことになる。とても面倒になる。
Dovecotの認証サービスを起動させる
/etc/dovecot/conf.d/10-master.conf の service auth { unix_listener /var/spool/postfix/private/auth{セクションを変更する。
service auth {
unix_listener /var/spool/postfix/private/auth{
mode = 0666
}
}
systemctl restart dovecotで再起動すると、/var/spool/postfix/private/auth のUnix Socketができている。
ここで、
mode = 0666
user = postfix
group = postfix
という解説もあったが、特にrootのUnix Socketでも問題なかった。
PostfixのSMTP認証(SASL)設定をもう一度。
smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth
を追加する。smtpd_sasl_path は先ほどのDovecotのUnix Socketパス。これはPostfixのchrootしたディレクトリからの相対パスである。
chrootパスは、postconf |grep queue_directoryを実行することで確認できる。
systemctl restart postfix でPostfixの再起動。
SMTP認証の接続を確認
swaksというメールテストができるコマンドがある。メールサーバ内からだと --server localhostにしてやる
swaks --auth \
--auth-user itoh@mtasetupR7.example.jp \
--auth-password ************* \
--server mail.mtasetupR7.example.jp \
--to recipient@test.example.com
すると、以下のようにメール送信が成功したと出る。
=== Trying mail.mtasetupR7.example.jp:25... === Connected to mail.mtasetupR7.example.jp. <- 220 mail.mtasetupR7.example.jp ESMTP Postfix (Ubuntu) -> EHLO DESKTOP-BR8SCJA. <- 250-mail.mtasetupR7.example.jp <- 250-PIPELINING <- 250-SIZE 10240000 <- 250-VRFY <- 250-ETRN <- 250-STARTTLS <- 250-AUTH CRAM-MD5 <- 250-ENHANCEDSTATUSCODES <- 250-8BITMIME <- 250-DSN <- 250-SMTPUTF8 <- 250 CHUNKING -> AUTH CRAM-MD5 <- 334 PDA5ODkyMTQyMDc0NDYzMzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxBvbmcub3JnPg== -> aXRvaEBvY2hxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxjljY2EwMWJjNA== <- 235 2.7.0 Authentication successful -> MAIL FROM:<t-ito@DESKTOP-BR8SCJA.> <- 250 2.1.0 Ok -> RCPT TO:<recipient@example.com> <- 250 2.1.5 Ok -> DATA <- 354 End data with <CR><LF>.<CR><LF> -> Date: Wed, 26 Mar 2025 11:49:55 +0900 -> To: recipient@example.com -> From: t-ito@DESKTOP-BR8SCJA. -> Subject: test Wed, 26 Mar 2025 11:49:55 +0900 -> Message-Id: <20250326114955.002667@DESKTOP-BR8SCJA.> -> X-Mailer: swaks v20240103.0 jetmore.org/john/code/swaks/ -> -> This is a test mailing -> -> -> . <- 250 2.0.0 Ok: queued as 327686AFB1 -> QUIT <- 221 2.0.0 Bye
ちなみに、dovecotプラグインは不要らしい。
postconf -AでPostfixのプラグインとしてcyrusしか出てこないことがある。(というかデフォルトでは出ないらしい)が使えた。
STMP認証はSubmissionポートの587だけにしたいし、TLS/SSL必須にしたい。
先ほどの swaksのログを見ると、
=== Trying mail.mtasetupR7.example.jp:25...
と25番ポートでSMTP認証が成功してしまっている。25番はサーバ間のメール配送だけにしてSMTP認証は587番ポートだけにしてしまいたい。 さらに、TLS/SSLが必須にしたい。
Postfixのmaster.cf設定で暗号化されていない通信でのSMTP認証を禁止
smtpは-o smtpd_sasl_auth_enable=noを付けてSMTP認証しないようにする。
submissionを有効にして、以下のオプションを付ける
-o smtpd_sasl_auth_enable=yesでSMTP認証を可能-o smtpd_tls_auth_only = yesでSMTP認証はTLS/SSL必須-o smtpd_tls_security_level=encryptでSMTPクライアントは全てTLS/SSL必須-o syslog_name=postfix/submissionでログに残る名前をsubmissionと分かるようにする。
smtp inet n - y - - smtpd -o smtpd_sasl_auth_enable=no submission inet n - y - - smtpd -o smtpd_sasl_auth_enable=yes -o smtpd_tls_security_level=encrypt -o syslog_name=postfix/submission -o smtpd_tls_auth_only = yes -o smtpd_tls_cert_file=/etc/letsencrypt/live/mail.mtasetupR7.example.jp/fullchain.pem -o smtpd_tls_key_file=/etc/letsencrypt/live/mail.mtasetupR7.example.jp/privkey.pem
なんか送信時にAuthエラー出た。…と思ったらクライアントでSSL使ってなかったわ。
swaksコマンドで --port 587付けて送信したらエラーが出た。
*** Host did not advertise authentication
-o smtpd_tls_security_level=encrypt -o smtpd_tls_auth_only=yes
この2つのオプションを無効にしたら問題なくいった。ってことは、swaksがTLS/SSLでないってことやん…
swaksのテストのし直し
swaksでTLS/SSLを使うには、--tlsオプションが必要。ってことで
swaks --auth --tls\
--auth-user itoh@mtasetupR7.example.jp \
--auth-password ************* \
--server mail.mtasetupR7.example.jp \
--to recipient@test.example.com
としたら問題なくできた。
逆に、TLSを使ってないとエラーになるっていうことも確認できた。
Thunderbirdのメール送信で手間取ってしまったが、なんかパスワードの認証方式でキャッシュが残ってる感じ…よくわからなかったがパスワードリセットをしたり送信サーバの再設定などしてみたら通るようになった。
ちなみにThunderbirdの設定値はこんな感じ。
| 項目 | 値 |
|---|---|
| Description: | test |
| Server Name: | mail.mtasetupR7.example.jp |
| Port: | 587 |
| User Name: | itoh@mtasetupR7.example.jp |
| Authentication method: | Normal password |
| Connection Security: | STARTTLS |
スパム対策(送信)のためにDKIMとDMARCの設定をする
以前書いたこのエントリ「今更ながら、自前サーバーにDKIMを導入したのでメモ(Debian11+Postfix +openDKIM) - tohokuaikiのチラシの裏」をそのままやってみる。
今回、やり方を変えて、OpenDKIM側はUnix Socketを作ることにした。
Socket local:/run/opendkim/opendkim.sock
それに合わせてPostfixも
smtpd_milters = local:/run/opendkim/opendkim.sock
とした。すると、/var/log/mail.log に以下のエラーが出る。
2025-03-26T16:53:57.829800+09:00 mail postfix/submission/smtpd[9236]: warning: connect to Milter service local:/run/opendkim/opendkim.sock: No such file or directory
# ls -l /run/opendkim/opendkim.sock srwxrwx--- 1 opendkim opendkim 0 Mar 26 16:26 /run/opendkim/opendkim.sock
あるじゃん…
でもopendkimグループにpostfixが所属してないからダメなんだね。
usermod -a -G opendkim postfix
…上手くいかない…inetにしたら上手くいくんだけどなー。あれー。と思ったら、Postfixがchrootしていたからだった。
chrootしたPostfixに合わせてOpenDKIMのSocketを作る方法
# postconf |grep queue_directory queue_directory = /var/spool/postfix
なので、さっきの設定を変える。
Socket local:/var/spool/postfix/opendkim/opendkim.sock
それに合わせてPostfixも
smtpd_milters = local:/opendkim/opendkim.sock
そして、Socketを作れるように
chown postfix:opendkim /var/spool/postfix/opendkim chmod 775 /var/spool/postfix/opendkim
としておく。
/var/spool/postfix/opendkim/opendkim.sock は、オーナー opendkim:opendkimで作られるが、postfixユーザーはopendkimグループに入っているのでsocketの読み込みもできる。
DMARCを設定する
SPFはメーラー関係ないのでここでの設定方法は割愛する。簡単だし。
From ヘッダー Takashi ITOH itoh@mtasetupR7.example.jp が DKIM ドメイン mtasetupR7.example.jp と一致しません。この From ヘッダーの ID は「なりすまし」の可能性があるため、このメールには注意してください
と出る。DMARCを設定したら問題なくなった。Value-DomainのDNS設定だと以下の通り。
txt _dmarc v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@mtasetupR7.example.jp
スパム対策(受信)のために
Rspamd とかのスパム判定ツールを入れたかったけど、それはまたの機会に…