ちょっと話題の記事

SMTPサーバのメール送信テストにmailxコマンドを使う

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

クラウド上に構築するシステムにおいても、SMTPサーバの重要性はオンプレミスと変わりません。アプリケーションからのメール送信、監視システムからの通知メール、管理者向けのroot宛メールの転送、などなど...sendmailやpostfixなどを使ったSMTPサーバの構築は今もなお一般的に行われています。

しかし、Linuxサーバなどからメール送信テストを行おうとしても、通常GUIを備えたリッチなメールクライアントなどはありません。このためCUIでコマンドラインによってメール送信を行う必要があります。

本投稿ではコマンドラインでメールを送信するmailxコマンドの使い方をまとめました。

mailxコマンドの使い方

mailxのインストール

Amazon LinuxやCentOSでは、初期状態でmailコマンドが入っていません。このためmailxパッケージを追加インストールします。

$ sudo yum install mailx
(...snip...)
インストール:
  mailx.x86_64 0:12.4-8.8.amzn1

完了しました!

なお、mailxをインストールするとmailコマンドが作成されますが、実体はmailxコマンドです。

$ ls -alF /bin/mail
lrwxrwxrwx 1 root root 22 2015-05-26 20:29 /bin/mail -> /etc/alternatives/mail*
$ ls -alF /etc/alternatives/mail
lrwxrwxrwx 1 root root 10 2015-05-26 20:29 /etc/alternatives/mail -> /bin/mailx*

メールを送信する

メールを送信するときには、mailコマンドの後に送信先のメールアドレスを付与します。この際に使用されるSMTPサーバはlocalhostになります。続けてSubjectと本文を入力し、.によって本文の終わりを宣言します。

$ mail smokeymonkey@gmail.com
Subject: tset mail
test
.
EOT

メール本文の内容をファイルから読み込むにはリダイレクトを使います。

$ mail smokeymonkey@gmail.com < data.txt

上記のやり方だと、メール本文はリダイレクトで読み込めますが、Subjectの指定ができません。Subjectの指定は-sで指定します。

$ mail -s "test mail" smokeymonkey@gmail.com < data.txt

SMTPサーバを指定する

特に何も設定せずにmailコマンドを使うと、SMTPサーバはlocalhostを利用します。別のサーバ上に構築されたSMTPサーバを指定するには、~/.mailrcに設定します。

$ vi ~/.mailrc
set smtp=smtp://192.168.0.1:25

Fromアドレスを指定する

何も設定しない場合、送信したメールのFromアドレスは「ユーザ名@ローカルのホスト名」になります。EC2の場合だと「ec2-user@ip-12-34-56-78.ap-northeast-1.compute.internal」みたいな感じです。Fromアドレスを指定する場合には-rオプションで指定します。

$ mail -r ec2-user@example.com smokeymonkey@gmail.com

前述した~/.mailrcで指定することもできます。

$ vi ~/.mailrc
set from="ec2-user@example.com"

送信アカウントを使い分ける

~/.mailrcを使って、送信アカウントの定義を複数作成することが出来ます。例えば上述したFromアドレスが違う送信アカウントを複数作ります。

$ vi ~/.mailrc
account hoge {
  set from="hoge@example.com"
}
account fuga {
  set from="fuga@example.com"
}

そしてメールを送信するときに-Aオプションで使用する送信アカウントを指定します。例えばhogeを指定すれば、Fromアドレスはhoge@example.comになります。

$ mail -A hoge smokeymonkey@gmail.com

ファイルを添付する

ファイルを添付するには-aオプションを使います。

$ mail -a ./data.txt smokeymonkey@gmail.com

CC、BCCを指定する

CCでメールを送信するには-cオプションを、BCCでメールを送信するには-bオプションを使います。

$ mail -c smokeymonkey+cc@gmail.com -b smokeymonkey+bcc@gmail.com smokeymonkey@gmail.com

送信先メールアドレスにaliasを設定する

~/.mailrcでaliasを定義することで、送信先メールアドレスをグルーピングすることが出来ます。

$ vi ~/.mailrc
alias smoke smokeymonkey@gmail.com sasaki.daisuke@classmethod.jp

これで、以下のようにmailコマンドの後にalias名を指定することで、一度に複数のメールアドレスにメールを送信することが出来ます。

$ mail smoke

なお、普通にmailコマンドの後にスペース区切りで複数のメールアドレスを記述することでも、一度にメールを送信することが出来ます。

$ mail smokeymonkey@gmail.com sasaki.daisuke@classmethod.jp

メール送信の通信ログを確認する

-vオプションを付与することで、メール送信時の通信ログの詳細を確認出来ます。

$ mail -v -s "test mail" smokeymonkey@gmail.com < data.txt
Resolving host 192.168.0.1 . . . done.
Connecting to 192.168.0.1 . . . connected.
220 mail.example.com ESMTP Postfix
>>> HELO ip-12-34-56-78.ap-northeast-1.compute.internal
250 mail.example.com
>>> MAIL FROM:<ec2-user@example.com>
250 2.1.0 Ok
>>> RCPT TO:<smokeymonkey@gmail.com>
250 2.1.5 Ok
>>> DATA
354 End data with <CR><LF>.<CR><LF>
>>> .
250 2.0.0 Ok: queued as E445B45EE6
>>> QUIT
221 2.0.0 Bye

さいごに

よく使うわりには細かい実行オプションをいつも忘れてしまうので、これは自分用の備忘録です。自分でこの記事をブックマークしておこうと思います。