【SMTP】【Linux】外部の SMTP サービスを利用してメールを送信するための Linux の設定&コマンド

最近はクラウドサービスが充実し、各種企業がメール配信サービス(SMTPサービス)を提供しています。

今回は、外部の SMTP サービスを利用してメールを送信するための Linux(RedHat 7系)の設定およびコマンドについて解説します。

 

 

 

外部 SMTP サービス利用環境

以下の SMTP サーバーを例として説明します。

 

外部 SMTP サービス利用手順

以下にて外部 SMTP サービスを利用するために各種コマンドや設定を解説します。

 

【SMTP AUTH】Linux上よりコマンドラインで送信する場合

「SMTP AUTH」で認証してメール配信する方法について解説します。

SMTP には POP3 や IMAP4 と違ってユーザーの認証システムがありません。

そのためスパムメールの温床となりやすい構造です。

 

ある特定のクライアントからの送信のみ許可してスパムメールを防止するため、Postfix ではユーザー認証ができる SMTP AUTH を実装しています。

認証は、SASL(Simple Authentication and Security Layer)を利用しています。

ちなみに SASL は多数の認証方式をサポートしています。

 

 

SMTP AUTH 認証用ユーザーとパスワードの作成手順

実際に自分でコマンドを実行して作成する機会はないかもしれませんが、以下のコマンドで「SMTP AUTH」用の「ユーザー」「パスワード」を作成することができます。

【例】

 

[root@ip-172-31-47-210 log]# saslpasswd2 -u test.com -c test
Password: ← ここにパスワード(Password0011)を入力します。
Again (for verification): ← 再度パスワード(Password0011)を入力します。
[root@ip-172-31-47-210 log]#

 

■オプションの解説

-c xxxx ← 新しいアカウントを作成します。

 

 

Postfix が起動しているのか確認する

Postfix サービスが起動しているか確認する方法です。

 

[root@ip-172-31-47-210 ~]# rpm -qa | grep postfix
postfix-2.10.1-6.el7.x86_64

[root@ip-172-31-47-210 ~]# systemctl status postfix 
● postfix.service - Postfix Mail Transport Agent 
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled) 
   Active: active (running) since Sun 2018-08-26 12:36:54 UTC; 46min ago 
  Process: 751 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS) 
  Process: 749 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS) 
  Process: 744 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS) 
 Main PID: 1015 (master) 
   CGroup: /system.slice/postfix.service 
           tq1015 /usr/libexec/postfix/master -w 
           tq1019 pickup -l -t unix -u 
           mq1020 qmgr -l -t unix -u 
 
Aug 26 12:36:53 ip-172-31-47-210.ap-northeast-1.compute.internal systemd[1]: Starting Postfix Mai... 
Aug 26 12:36:54 ip-172-31-47-210.ap-northeast-1.compute.internal postfix/postfix-script[1010]: st... 
Aug 26 12:36:54 ip-172-31-47-210.ap-northeast-1.compute.internal postfix/master[1015]: daemon sta... 
Aug 26 12:36:54 ip-172-31-47-210.ap-northeast-1.compute.internal systemd[1]: Started Postfix Mail... 
Hint: Some lines were ellipsized, use -l to show in full. 
[root@ip-172-31-47-210 ~]#

 

 

 

mailxコマンドのインストール手順

メールの送信確認をコマンドラインより確認できるようするため「mailx」コマンドをインストールします。

RedHat 系の OS なら「yum」コマンドでインストールすることができます。

 

[root@ip-172-31-47-210 ~]# yum install mailx

 

 

 

設定情報を .mailrc に記述する方法

ユーザーのホームディレクトリに「.mailrc」ファイルを作成します。

【例】

[root@ip-172-31-47-210 ~]# vi .mailrc
set smtp=smtps://test.com:587
set smtp-auth=login
set smtp-auth-user=test
set smtp-auth-password=test

[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
[root@ip-172-31-47-210 ~]# Missing "nss-config-dir" variable. ← エラーメッセージです。
"/root/dead.letter" 11/337
. . . message not sent.

 

その場合は「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"
/etc/pki/nssdb/cert8.db
/etc/pki/nssdb/cert9.db
/etc/openldap/certs/cert8.db

 

.dbファイルの場所を nss-config-dir に設定します。

 

[root@ip-172-31-47-210 ~]# cat .mailrc
set smtp=smtps://xxxxx.com:587 
set smtp-auth=login
set smtp-auth-user=xxxxxxxxxxxxx
set smtp-auth-password=xxxxxxxxxxxxxx
set from=xxxxxxx@xxxxxx.com
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/ ← findコマンドで確認した .db ファイルの場所を指定します。

 

 

「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
Enforcing
[root@ip-172-31-47-210 ~]#

 

以下のように「/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
[root@ip-172-31-47-210 ~]# smtp-server: 530 5.7.0 Must issue a STARTTLS command first ← エラーメッセージが出力されます。
/root/dead.letter 11/326
. . . message not sent.

 

Postfix ではセキュリティの為、サブミッションポート(587番)を使用した送信では STARTTLS を利用した TLS 通信が必須になっています。

その為、メーラー側(メールソフト側)で「暗号化を使用する設定」を「有効」にしなければいけませんが、そもそも STARTTLS の設定がない場合に備えて以下のように設定します。(セキュリティレベルを下げます)

 

設定ファイル:/etc/postfix/master.cf

コメントアウトを外してパラメータの値を「encrypt」から「may」に変更します。

 

 

■変更前

#submission inet n - n - - smtpd
# -o syslog_name=postfix/submission
# -o smtpd_tls_security_level=encrypt
# -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=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING

 

■変更後

submission inet n - n - - smtpd
# -o syslog_name=postfix/submission
-o smtpd_tls_security_level=may
# -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=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING

 

変更後、設定の再読込の為に Postfix をリロードするか Postfix サービスを再起動します。

 

Postfix をリロードする場合

[root@ip-172-31-47-210 ~]# postfix reload
postfix/postfix-script: refreshing the Postfix mail system
[root@ip-172-31-47-210 ~]#

 

Postfix サービスを再起動する場合

[root@ip-172-31-47-210 ~]# systemctl restart postfix.service
[root@ip-172-31-47-210 ~]#

 

 

openssl s_client コマンドで確認する方法

telnet コマンドでも openssl コマンドでも動作確認をすることができます。

[root@ip-172-31-47-210 ~]# openssl s_client -connect xxxxxxxxxxx.com:465 
CONNECTED(00000003) 

 

~ 省略 ~

 

--- 
No client certificate CA names sent 
--- 
SSL handshake has read 2787 bytes and written 603 bytes 
--- 
New, TLSv1/SSLv3, Cipher is RC4-SHA 
Server public key is 2048 bit 
Secure Renegotiation IS supported 
Compression: NONE 
Expansion: NONE 
No ALPN negotiated 
SSL-Session: 
    Protocol  : TLSv1.2 
    Cipher    : RC4-SHA 
    Session-ID: xxxxxxxxxxxxxxxx
    Session-ID-ctx: 
    Master-Key: xxxxxxxxxxxxxxx
    Key-Arg   : None 
    Krb5 Principal: None 
    PSK identity: None 
    PSK identity hint: None 
    Start Time: 1535292325 
    Timeout   : 300 (sec) 
    Verify return code: 0 (ok) 
--- 
220 xxxxxxxxxxxxxxxxx.com ESMTP Postfix 

 

※CONNECTED(00000003) になっていることを確認します。

 

 

 

base64 でエンコードする手順

アカウントやパスワードを base64 でエンコードする場合です。

パスワードを base64 でエンコードする

[ec2-user@ip-172-31-47-210 ~]$ echo -n "xxxxxxxxxxxxxxxxxxxx" | openssl enc -e -base64
xxxxxxxxxxxxxxxxxxxxxmM0U1o2dlZEemI5UXc1ZlQ=
[ec2-user@ip-172-31-47-210 ~]$

 

 

アカウントとパスワードを Perl で base64 エンコードする

\000を先頭に置きます。

 

[root@ip-172-31-47-210 ~]# perl -MMIME::Base64 -e 'print encode_base64("\000xxxxxxxx\000yyyyyyyyyyyyy")'
AFRHUzRSNVpaTDExAEFqRFZEemI5UXc1ZlQ= ← これがエンコードされた値です。
[root@ip-172-31-47-210 ~]#

 

 

printf と openssl で base64 でエンコードする場合

printf と openssl コマンドでアカウントとパスワードを base64 でエンコードする場合です。

 

[root@ip-172-31-47-210 ~]# printf "%s\0%s\0%s" xxxxxxx xxxxxxx yyyyyyyyy | openssl base64 -e | tr -d '\n'; echo
eHh4eHh4eAB4eHh4eHh4AHl5eXl5eXl5eQ== ← エンコードされた値です。
[root@ip-172-31-47-210 ~]#

 

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人