コマンドライン操作による高度な電子メール送信が行えるユーティリティ

 コマンドラインから電子メールを送信する必要に迫られたユーザはmail(1)コマンドに手を伸ばすかもしれないが、そうした場合は email というプログラムを選択しておくと、SSLを用いたSMTPサーバへのメール送信、複数ファイルの添付が可能なMIMEのサポート、アドレスブックによる送信先の管理、デジタル署名および暗号化の実施といった、より高度な機能を利用することができる。

 確かにその他の選択肢としては、PerlやPHPから非常に複雑な構成の電子メールを送信するツールも存在してはいるが、cronジョブその他のアプリケーションから添付ファイルを1つ付けただけのメッセージを1件送信したいという場合に便利なのは、電子メールをコマンドラインから直接送信するという機能のはずである。

 先の“email”というプログラムはこれが正式なプロジェクト名なのだが、本稿では混乱を避けるために“emailプログラム”と呼ぶことにしよう。と言うのも私自身、この“email”というあまりに一般的すぎるプロジェクト名のおかげで、当該パッケージを検索する際にかなりの苦労をさせられたのである。また私が探した限りにおいて、UbuntuおよびFedora用のパッケージは見つからなかったが、openSUSE 10.3については1-Clickインストールができるようになっている。なお本稿の実行例で使用しているのは、64ビット版Fedora 8マシンにて「./configure; make; sudo make install」という通常のシーケンスにてソースコードからビルドしたプログラムである。

 先の./configureの実行時にsysconfdirないしプレフィックスを明示的に変更していない限り、ここでのインストール結果としては、システムワイドな設定ファイルが/usr/local/etc/email/email.confというパスにて作成されているはずである。また、~/.email.confファイルは本プログラムでのメール送信時に参照される設定ファイルであるが、これが存在しない場合はシステム設定ファイルが利用されるようになっている。ただし各ユーザの設定ファイルに関しては、MY_NAMEおよびMY_EMAILオプションを適切な値に変更しておかなくてはならない。またローカルホスト経由でのメール送信が行えない場合の対策としては、SMTP関連の変数値を各自の使用するサーバおよび認証情報に合わせることで解決できるはずである。その他、デフォルトで用意される署名(signature)ファイルには、作成元であるemailプログラムに関する簡単な宣伝文句が書き込まれているはずだが、不要だと思えば無効化しておけばいい。

$ cp /usr/local/etc/email/email.conf ~/.email.conf
$ vi ~/.email.conf
...
SMTP_SERVER = '127.0.0.1'
SMTP_AUTH='PLAIN'
SMTP_AUTH_USER='foo'
SMTP_AUTH_PASS='bar'
USE_TLS='true'
...
MY_NAME  = 'Sysadmin number one'
MY_EMAIL = 'sadmin@example.com'
...
#SIGNATURE_FILE    = '&/email.sig'
#SIGNATURE_DIVIDER = '---'
...

 こうしたセットアップの終了後、コマンドラインからのメール送信はemailコマンドを用いて行えるようになっているはずである。例えば下記に引用した1つ目の電子メールは、基本的にmail(1)プログラムのものと大差ない手順にてメッセージ送信を実行している。より具体的には、まず件名と送信先をコマンドライン上で直接入力した後、送信者であるユーザがメッセージ本文を入力し、最後にメッセージの送信が行われるという流れである。ただしmail(1)のメッセージ本文はコンソールから直接読み込ませる方式であるのに対して、emailプログラムではユーザ指定ないしデフォルトのテキストエディタ(下記の例ではvi)が起動され、その上でメッセージ本文を入力するという仕様になっている。また2つ目の送信例では、メッセージ本文としてメール送信のコマンド実行時刻を渡すようにしてあり、この場合の題名には当該時刻に何が起こったかの説明文を記入している。

$ email --subject test1 ben@localhost
email: WARNING: Deprecated variable: SIGNATURE_DIVIDER
email: WARNING: Environment varaible EDITOR not set: Defaulting to "vi"
hello there
ZZ
$ date | email --subject "Bad things happen at night" ben@localhost

 emailプログラムではアドレスブックを使用することができるが、この機能が便利なのは、自分を受取人とした通知メールにて使用する自分のメールアドレスを後から変更させる場合や、受取人を自分自身とするのではなく特定グループに属す複数の人間にメッセージ送信をさせるといった場合である。なおこのアドレスブックでは、送信先として複数のアドレスをグループ指定することもできる。こうしたアドレスブックの応用例としては、自動実行させるタイプのスクリプトにおいて処理内容の通知メールを送信させるようにしておき、その際に用いるアドレスには個々の処理内容を示す名称を付けた上でアドレスブックに登録しておくと便利なはずだ。具体的な例としてはデータベースのバックアップ用スクリプトにおいて、その実行時に送信させるメールのアドレスを“database-archive”としてアドレスブックに登録しておくことなどが考えられる。こうしておくと、例えば先のメッセージの送信先を変更したい場合でも、アドレスブックの当該エントリを変更するだけで済むようになり、スクリプト本体のメッセージ送信部はそのままにしておけるはずだ。

 ここでのアドレスブックのフォーマットは、single:ないしgroup:タグに続けて個々の送信先を記述するという方式になっている。このうちシングル(single)アドレスの送信先については「name = email-address」というフォーマットで指定すればいいが、グループ(group)アドレスについては、コンマ区切りのリストとして複数の送信先を指定することができる。ただし注意が必要なのは、emailプログラムに付属するREADMEファイルに説明されているように、各グループアドレスに属す個々の送信先はそれぞれ別途にシングルアドレスとしても登録しておく必要があるという点だ。つまり複数の送信先をグループアドレス中に直接指定するだけという形での一括登録はできないのである。例えば下記の設定例においても、グループアドレス“us”に登録する送信先はroot@localhostのような直接指定ではなく、事前にシングルアドレスとして個別登録しておいた“moi”および“anata”を指定している。

$ vi ~/.email.conf
...
ADDRESS_BOOK = '~/.email.address'
..
$ cp /usr/local/etc/email/email.address.template  ~/.email.address
$ vi ~/.email.address
...
single: moi               = ben@localhost
single: anata             = root@localhost

group: us = moi, anata
...

 本プログラムのデフォルト設定では、メール送信に使用したアドレスブックでの登録名は送信相手に公開されるようになっている。例えば下記の送信例の1つ目では送信先に“moi”を指定したので、送信された電子メールのヘッダ情報におけるToには、この登録名と実際のアドレスが”moi” <ben@localhost.localdomain>として表示されているのである。こうした自分が付けたアドレスブックでの登録名を公開したくない場合や、当該メッセージの受信者が他に誰がいるかを知られたくない場合は、特定グループへの一括送信をブラインド・カーボン・コピー(BCC:Blind Carbon Copy)とする–bccオプションを追加した上で、メッセージ送信のターゲットとなる単一アドレスを指定しておけばいい(下記の3つ目の例)。この方法はbccの送信対象について、そのアドレスブックでの登録名を他の送信先に知らせないというメリットも有している。

$ date | email --subject "linux.com, eh?" moi
$ vi /var/spool/mail/ben
...
From yourlogin@example.com  Tue May 27 12:33:57 2008
Return-Path: <yourlogin@example.com>
Received: from v8tsrv (localhost.localdomain [127.0.0.1])
        by localhost.localdomain (8.14.1/8.14.1) with ESMTP id m4R2Xv8w014763
        for <ben@localhost>; Tue, 27 May 2008 12:33:57 +1000
Message-Id: <200805270233.m4R2Xv8w014763@localhost.localdomain>
Subject: linux.com, eh?
From: "Your Real Name" <yourlogin@example.com>
To: "moi" <ben@localhost.localdomain>
Date: Tue, 27 May 2008 12:33:57 +1000
Content-Type: text/plain
X-Mailer: Cleancode.email v3.0.5

Tue May 27 12:33:57 EST 2008
...

$ date | email --subject "Singing and dancing monkies?" us
$ vi /var/spool/mail/ben
...
From yourlogin@example.com  Tue May 27 12:35:52 2008
Return-Path: <yourlogin@example.com>
Received: from v8tsrv (localhost.localdomain [127.0.0.1])
        by localhost.localdomain (8.14.1/8.14.1) with ESMTP id m4R2ZqEq014772;
        Tue, 27 May 2008 12:35:52 +1000
Message-Id: <200805270235.m4R2ZqEq014772@localhost.localdomain>
Subject: Singing and dancing monkies?
From: "Your Real Name" <yourlogin@example.com>
To: <ben@localhost.localdomain>, "anata" <root@localhost.localdomain>
Date: Tue, 27 May 2008 12:35:52 +1000
Content-Type: text/plain
X-Mailer: Cleancode.email v3.0.5

Tue May 27 12:35:52 EST 2008

$ date | email --subject "You can't tell the group" --bcc us moi
# vi /var/spool/mail/root
...
From yourlogin@example.com  Tue May 27 12:39:13 2008
Return-Path: <yourlogin@example.com>
Received: from v8tsrv (localhost.localdomain [127.0.0.1])
        by localhost.localdomain (8.14.1/8.14.1) with ESMTP id m4R2dDKY014832;
        Tue, 27 May 2008 12:39:13 +1000
Message-Id: <200805270239.m4R2dDKY014832@localhost.localdomain>
Subject: You can't tell the group
From: "Your Real Name" <yourlogin@example.com>
To: "moi" <ben@localhost.localdomain>
Date: Tue, 27 May 2008 12:39:13 +1000
Content-Type: text/plain
X-Mailer: Cleancode.email v3.0.5

Tue May 27 12:39:13 EST 2008
...

 特定のファイルをメッセージに添付させる場合は、コマンドラインオプションの--attachを用いて、添付ファイルのパスを指定する。この--attachに関しては、繰り返し指定することで複数のファイルを添付することもできる。

 --signおよび--encryptというオプションは、それぞれメッセージの送信時にデジタル署名と暗号化を施すための指定である。ただし私も実際に使ってみて気づいたのだが、この--signオプションではメッセージ送信者の秘密鍵ではなく、最初の送信先の秘密鍵を使用してメッセージへのデジタル署名を施すようになっている。例えばsadmin@localhostからben@hawaii.example.comにメールを送信した場合、emailプログラムはこのメッセージへのデジタル署名にben@hawaiiの秘密鍵を使おうとするのである。しかしながらこの場合、送信元のマシンではsadmin@localhostの秘密鍵の方しか使えないのが普通なので、この方式でデジタル署名ができるはずがないのだ。逆に考えると、sadmin@localhostの秘密鍵ならばemailプログラムは取得できるので、最初の送信先として常にこのアドレスを指定するようにすれば、こうした仕様であってもデジタル署名を施せるはずである。

 その他、メール送信時に適用するSMTPサーバや認証用の情報および設定ファイルについては、コマンドラインオプションの指定による強制変更も可能となっている。

 emailプログラムのインストールとセットアップはごく簡単に済ませることができる。そしてemailプログラムは任意のSMTPサーバを介してメッセージ送信が行えるだけでなく、SSLを介したSMTPサーバ接続ができるので、同プログラムによるメッセージ送信用のサーバは自由に変更して構わないはずである。またこれは、添付ファイル、暗号化、アドレスブックといった機能をサポートしたコマンドライン操作式のメール送信ツールなので、cronジョブなどの自動実行型スクリプトに組み込んで使用するのも比較的簡単になっている。例えばこうしたスクリプト実行時に発生したエラーの内容を、デジタル署名と暗号化を施した上で自分宛に送信させるようにしておけば、専用のメールサーバを使わなくても秘密裏に通知できるのである。

Ben Martinは10年以上にわたってファイルシステムに取り組んでおり、博士課程の修了後、現在はlibferris、ファイルシステム、検索ソリューションを中心としたコンサルティング業に従事している。

Linux.com 原文