CentOS7でSMTPサーバー構築

LocalhostでSMTPサーバーというのはごく頻繁。今回は外から使えるSMTPサーバーの構築手順です。
例えばLaravel5だったら.envで以下のような感じで使えるようにします。開発とかでちょこちょこ使う感じの想定なので、sslとかtlsとか設定してません。通常のいわゆる本物のメールは最近うるさいので、こういう送信メールサーバー使わない方がいいです。

  • 開発とかで簡易的に使うのでsslとかtlsとかはなし。
  • postfixを使う。
  • 普通のパスワード認証
  • ポートは587 (25は使わない)

Laravelとかの設定ではこんな感じになる。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_USERNAME=smtp
MAIL_PASSWORD=xxxxxxxxxxx
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=noreply@example.com
MAIL_FROM_NAME=sample-stmp

OS確認

cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core)

SMTP-Authの設定

cyrus-saslのインストール

yum -y install cyrus-sasl

起動と確認

systemctl start saslauthd
systemctl status saslauthd

自動起動設定と確認
ここまででインストールと基本的なセッティングはOK

systemctl enable saslauthd
systemctl is-enabled saslauthd.service

saslauthdからauxpropに変更と巷には多くありますが、saslauthdでOKかと。

cd /etc/sasl2/
vi smtpd.conf

pwcheck_method: saslauthd
mech_list: plain login

Postfixの設定

yum -y install postfix

いくらか設定を変更します。

cd /etc/postfix/
cp -p main.cf main.cf.org
vi main.cf

これ追加(最終行ぐらいでいいです)5MBとか10MBとか適度に設定。

message_size_limit = 5242880

受け付けるインターフェイスの設定変更(全部に変更)
プロトコルはallじゃ動かなかったのでipv4にしました。

inet_interfaces = localhost
↓
inet_interfaces = all

inet_protocols = all
↓
inet_protocols = ipv4

ホストとか向け先とか変更
デフォルトではコメントアウトされているので有効にしてからパラメータ変更します。

myhostname = smtp.example.com
mydomain = example.com
myorigin = $mydomain

※メールボックスは使わないから今回は設定なし。

認証関連追記

smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

起動と自動起動設定

systemctl restart postfix
systemctl enable postfix
systemctl is-enabled postfix.service

ユーザーとパスワードの設定

認証用のユーザーなので適当で大丈夫です。今回はsmtp

useradd -s /sbin/nologin smtp
passwd smtp
password: xxxxxxx

Auth用ユーザーの設定

echo 'xxxxxxx' | saslpasswd2 -p -u smtp.example.com -c smtp

反映と権限変更

sasldblistusers2
chgrp postfix /etc/sasldb2

これで送信メールサーバーは使えるはず。

確認

Laravelだと確認しやすい。

php artisan tinker
Psy Shell v0.8.11 (PHP 7.1.8 — cli) by Justin Hileman
>>>
Mail::raw('test mail',function($message) {$message->to('sample@example.com')->subject('test');});

こういうエラーが出るときあります。220なのでTCPによるSMTPのコネクション確率ができているってことです。ユーザーが間違っているかパスワードが間違っているかなど。

Swift_TransportException with message 'Expected response code 220 but got code "", with message ""'

CentOS7の環境にメールサーバを構築する
Postfix on CentOS 7 cannot authenticate against cyrus saslauthd
メールサーバー構築(Postfix+Dovecot)

Last update: 2017.12.06 (水)