元RX-7乗りの適当な日々 このページをアンテナに追加 RSSフィード Twitter

RX-7(FD3S)WRX STI関連のキーワードで検索されて来られた方へ。
右サイドのカテゴリ『』をクリックすると関連する項目だけが表示されます。
日々の写真は『Flickr』で公開しています。

2016/05/31

LinuxのmailコマンドでSMTPサーバを使ってメール送信する (from GCE/nagios)


情報ソースとして割とあふれている話なんですが、前提が足りない情報が多いので、補足すべく書いておきます。

と、その前に、mail コマンドで SMTPサーバ経由のメール送信をやりたくなった、そもそもの動機を書いておきます。


GCE(Google Compute Engine)で作ったサーバに、nagios をセットアップしていて、アラートをメールで飛ばしたい。が、現在はGCE のインスタンスから宛先{25, 465, 587}番ポートへのメール送信は仕様として禁止されている。なので、GCE では sendgrid や mailgun、Google Apps を使ってメール送信してくれ、とドキュメントに記載されているのですが、まぁ色々な事情と対象がアラートメールという性質もあり、GCE 外部で既に動かしているSMTPサーバを経由して送りたい。

で、nagios のメール送信は、内部的に mail コマンドを使っていて、MTA を挟むよりは mail コマンドで完結できれば楽だよねー、ということでタイトル通りのことを実現したいというのがやりたいことです。

ちなみに、接続先となる外部のSMTPサーバで、上記ポート番号は使えない(接続できない)ので、あらかじめ2525番ポート等で LISTEN させておく必要があります。


mailコマンドの "-S" オプションを使う

結論から書いておくと、このオプションを使います。これは、世の中の色々なブログで紹介されている内容で、その通りなのです。

ああ、なるほど、サポートしてるよね。じゃあ試してみようと、GCE で立ち上げた Ubuntu なインスタンスから、意気揚々とコマンドを打つと、

mail: invalid option -- 'S'
Try 'mail --help' or 'mail --usage' for more information.

そんなオプションは無いと。manを読んでみても、確かに "-S" なんてオプションは無い。

他にも、 /etc/mail.rc や .mailrc に "set smtp" で指定すべしという情報もよく見かけるが、こちらも有効にならない。


何が足りなかったのか

上記の Ubuntu なインスタンスで使っていたのは、GNU Mailutils だったのですが、他所のサイトで調べていくと CentOS などでは "yum install mailx" とインストールされていて、ああ、mailutils よりリッチなやつを使うのか、と気づきました。

で、Ubuntu だと apt パッケージで用意されているので。


$ sudo apt-get install heirloom-mailx

とインストールしてから、メールコマンドを実行すると、"-S" オプションを指定することで、問題なくSMTPサーバ経由でメールを送ることができました。


 -S variable[=value]
     Sets the internal option variable and, in case of a value option, assigns value to it.  Even though options set
     via -S may be overwritten from within resource files, the command line setting will be reestablished after all
     resource files have been loaded.

man はこんな感じ。


mailコマンド・オプション例

例として、nagios に設定した commands.cfg の mail コマンドを載せておきます。

# 'notify-host-by-email' command definition
define command{
        command_name    notify-host-by-email
        command_line    /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /usr/bin/mail -s "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" -S "smtp=smtp://(SMTPサーバ名):(ポート)" -r (送信元メールアドレス) $CONTACTEMAIL$
        }

# 'notify-service-by-email' command definition
define command{
        command_name    notify-service-by-email
        command_line    /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n" | /usr/bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" -S "smtp=smtp://(SMTPサーバ名):(ポート)" -r (送信元メールアドレス) $CONTACTEMAIL$
        }

とまぁ、こんな感じですかね。

それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́


[改訂第3版]Linuxコマンドポケットリファレンス

[改訂第3版]Linuxコマンドポケットリファレンス

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/rx7/20160531/p1

オススメ (一部は、最近読んでいる本とも言う)
Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus) クラウド Amazon EC2/S3のすべて~実践者から学ぶ設計/構築/運用ノウハウ~ [Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ) エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド [24時間365日] サーバ/インフラを支える技術 ~スケーラビリティ、ハイパフォーマンス、省力運用 Linux-DB システム構築/運用入門 (DB Magazine SELECTION) キャパシティプランニング ― リソースを最大限に活かすサイト分析・予測・配置 スケーラブルWebサイト 実践ハイパフォーマンスMySQL 第3版 ウェブオペレーション ―サイト運用管理の実践テクニック (THEORY/IN/PRACTICE) SQLアンチパターン インターネットのカタチ―もろさが織り成す粘り強い世界― ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化 Linuxの教科書―ホントに読んでほしいroot入門講座 (IDGムックシリーズ)