最近はクラウドサービスが充実し、各種企業がメール配信サービス(SMTPサービス)を提供しています。
今回は、外部の SMTP サービスを利用してメールを送信するための Linux(RedHat 7系)の設定およびコマンドについて解説します。
【AWS】【メール】EC2 インスタンスから Postfix で Gmail 経由でインターネットにメールを送信する(メールサーバー)設定手順
【Linux】 CentOS7環境で自宅メールサーバーの構築(Postfix と Dovecot と OP25B問題)
【メール】【Postfix】メールトラブル、Postfix のトラブルシューティング方法
外部 SMTP サービス利用環境
以下の SMTP サーバーを例として説明します。
- メールサーバ:mail.smtp.xxxx.com
- ポート: 587(STARTTLS)、465(TLS Wraper)
- 認証方式:SMTP AUTH
外部 SMTP サービス利用手順
以下にて外部 SMTP サービスを利用するために各種コマンドや設定を解説します。
【SMTP AUTH】Linux上よりコマンドラインで送信する場合
「SMTP AUTH」で認証してメール配信する方法について解説します。
SMTP には POP3 や IMAP4 と違ってユーザーの認証システムがありません。
そのためスパムメールの温床となりやすい構造です。
ある特定のクライアントからの送信のみ許可してスパムメールを防止するため、Postfix ではユーザー認証ができる SMTP AUTH を実装しています。
認証は、SASL(Simple Authentication and Security Layer)を利用しています。
ちなみに SASL は多数の認証方式をサポートしています。
- PLAIN ← 平文によるユーザー認証方式
- LOGIN ← PLAIN 同様、平文での認証方式
- CRAM-MD5 ← CRAM(Challenge-Response Authentication Mechanism)。クライアントとサーバー側でパスワードを含んだ MD5 アルゴリズムで作成したメッセージを送信し、文字列を比較して等しければログインを許可します。ネットワークにパスワードが流れないため安全です。
SMTP AUTH 認証用ユーザーとパスワードの作成手順
実際に自分でコマンドを実行して作成する機会はないかもしれませんが、以下のコマンドで「SMTP AUTH」用の「ユーザー」と「パスワード」を作成することができます。
【例】
- ドメイン:test.com
- アカウント:test
- パスワード:Password0011
[root@ip-172-31-47-210 log]# saslpasswd2 -u test.com -c test |
■オプションの解説
-c xxxx ← 新しいアカウントを作成します。
Postfix が起動しているのか確認する
Postfix サービスが起動しているか確認する方法です。
[root@ip-172-31-47-210 ~]# rpm -qa | grep postfix [root@ip-172-31-47-210 ~]# systemctl status postfix |
mailxコマンドのインストール手順
メールの送信確認をコマンドラインより確認できるようするため「mailx」コマンドをインストールします。
RedHat 系の OS なら「yum」コマンドでインストールすることができます。
[root@ip-172-31-47-210 ~]# yum install mailx |
設定情報を .mailrc に記述する方法
ユーザーのホームディレクトリに「.mailrc」ファイルを作成します。
【例】
[root@ip-172-31-47-210 ~]# vi .mailrc [root@ip-172-31-47-210 ~]# |
「Missing “nss-config-dir” variable.」のメッセージが出力される場合
コマンドラインより mailx(mailコマンド)を実行すると以下のように「Missing “nss-config-dir” variable.」メッセージが出力されることがあります。
[root@ip-172-31-47-210 ~]# echo “teets” | mail -s “Test mail Sending” xxx@gmail.com |
その場合は「nss-tools」をインストールし設定を入れて再度試してみます。
nss-toolsインストール手順
RedHat 系 OS なら「nss-tools」も「yum」コマンドでインストールすることが可能です。
[root@ip-172-31-47-210 ~]# yum install nss-tools |
データベースの設定
「cert8.db」や「cert9.db」の場所を特定して「.mailrc」に反映させます。
[root@ip-172-31-47-210 certs]# find / -name “cert*.db” |
.dbファイルの場所を nss-config-dir に設定します。
[root@ip-172-31-47-210 ~]# cat .mailrc |
「Error initializing NSS: Unknown error -8015.」のメッセージが出力される
以下のように「Error initializing NSS: Unknown error -8015.」のメッセージが出力される場合の対処方法です。
[root@ip-172-31-47-210 ~]# Error initializing NSS: Unknown error -8015. ← エラーメッセージが出力されます。 |
対処の1つとして SELINUX を無効化して動作を確認します。
SELINUX が有効かどうか「getenforce」コマンドで確認します。
[root@ip-172-31-47-210 ~]# getenforce |
以下のように「/etc/selinux/config」を編集して SELINUX を「無効化」します。
# vi /etc/selinux/config
~ 省略 ~
SELINUX=disabled
~ 省略 ~ |
編集したら OS を再起動します。
# reboot |
smtp-server: 530 5.7.0 Must issue a STARTTLS command first のメッセージ出力
以下のように「smtp-server: 530 5.7.0 Must issue a STARTTLS command first」のメッセージが出力される場合です。
[root@ip-172-31-47-210 ~]# echo “test” | mailx -s “test subject” -S smtp=smtps://xxxxxxx.com:587 -S smtp-auth-user=xxxxxxxxx -S smtp-auth-password=xxxxxxxxxxx -S from=xxxx@xxxxxxx.com xxxxx@gmail.com |
Postfix ではセキュリティの為、サブミッションポート(587番)を使用した送信では STARTTLS を利用した TLS 通信が必須になっています。
その為、メーラー側(メールソフト側)で「暗号化を使用する設定」を「有効」にしなければいけませんが、そもそも STARTTLS の設定がない場合に備えて以下のように設定します。(セキュリティレベルを下げます)
設定ファイル:/etc/postfix/master.cf
コメントアウトを外してパラメータの値を「encrypt」から「may」に変更します。
- may ← 暗号化できたら暗号化するが、できない場合でもメールは送信できる
- encrypt ← 暗号化が必須
- verify ← 暗号化が必須で、且つ証明書の CA が信用できるか検証する
- secure ← verify プラス、証明書のコモンネーム(Common Name)がサーバー名と一致しているか検証する
■変更前
#submission inet n – n – – smtpd |
■変更後
submission inet n – n – – smtpd |
変更後、設定の再読込の為に Postfix をリロードするか Postfix サービスを再起動します。
Postfix をリロードする場合
[root@ip-172-31-47-210 ~]# postfix reload |
Postfix サービスを再起動する場合
[root@ip-172-31-47-210 ~]# systemctl restart postfix.service |
openssl s_client コマンドで確認する方法
telnet コマンドでも openssl コマンドでも動作確認をすることができます。
[root@ip-172-31-47-210 ~]# openssl s_client -connect xxxxxxxxxxx.com:465
~ 省略 ~
— |
※CONNECTED(00000003) になっていることを確認します。
base64 でエンコードする手順
アカウントやパスワードを base64 でエンコードする場合です。
パスワードを base64 でエンコードする
[ec2-user@ip-172-31-47-210 ~]$ echo -n “xxxxxxxxxxxxxxxxxxxx” | openssl enc -e -base64 |
アカウントとパスワードを Perl で base64 エンコードする
- アカウント:xxxxxxxxxx
- パスワード:yyyyyyyyyy
\000を先頭に置きます。
[root@ip-172-31-47-210 ~]# perl -MMIME::Base64 -e ‘print encode_base64(“\000xxxxxxxx\000yyyyyyyyyyyyy”)’ |
printf と openssl で base64 でエンコードする場合
printf と openssl コマンドでアカウントとパスワードを base64 でエンコードする場合です。
- アカウント:xxxxxxx
- パスワード:yyyyyyyyy
[root@ip-172-31-47-210 ~]# printf “%s\0%s\0%s” xxxxxxx xxxxxxx yyyyyyyyy | openssl base64 -e | tr -d ‘\n’; echo |
トラブルシューティング方法
トラブルシューティングにデバッグログが有効な場合があります。
以下の記事でデバッグログの設定方法を解説しているので参考にしてください。
【メール】【Postfix】メールトラブル、Postfix のトラブルシューティング方法
コメント