mailxコマンドを使ってメールを受信する方法と、コマンドラインからのメールの読み方を解説します。
シェルスクリプトからメールを読み出す方法とその実例も載せます。
なお、メールの送信方法については触れませんが、既に解説しているこちらのページを参照してください。
IMAPサーバーとは、メールを受信するサーバーのことで、利用するメールサービスごとに読み替えて設定してください。
ここでは、Gmailを例として設定します。
.mailrcの内容:
ピンクの網掛けの部分が、メールサービスや個人ごとに異なる部分です。
username の箇所は、Googleアカウント名になります(メールアドレスの@より前の文字)。
yourpassword の箇所は、Googleアカウントのパスワードになります。
パスワードをファイルに残す際は、パーミッションを600へ変更しましょう。具体的には、.mailrcの編集が終わったら、以下のコマンドを実行してください。
なお、これらの設定値はメール送信の時にも説明しましたが、-Sオプションを使ってコマンドラインで指定することも可能です。
mailxコマンドは、何のオプションも指定しなかった場合、メール閲覧モードになります。
IMAPサーバからメール情報を取得するため、しばらく時間がかかる可能性があります。
メールの受信に成功すると、以下のような画面が出力されます。これをメールヘッダのリストといいます。古いメールから順に表示されます。
この画面が表示されていれば、メールの受信は成功しています。
もし、メールボックスにメールが1通も無い場合は、「No mail for username」と表示されます。
tだけだと、ヘッダのリストでカーソル「>」があたっているメールを読みます。
プロンプトが「:」に変わっていれば、エンターを入力することで続きを読むことができます。
このモードを抜けるには、qを打ちます。そうすると、プロンプトは再び「?」になります。
ヘッダのリストに表示されている任意のメールを読みたい場合は、tの後ろに、ヘッダのリストの先頭にある番号を指定します。ただし、UやOなどのアルファベットは含みません。
また、最新メールのヘッダリストを表示するには、次のコマンドを実行します。
なお、zやhの後ろにつける「-」や「$」は、edコマンドの用法に基づいており、
+は次、-は前、$は一番最後、*は全てを意味します。
では対話式ではないスクリプトでは、メールを読むことができるのでしょうか。
スクリプトの場合、以下のように書くことでメール内容を表示することができます。
そうすることで、コマンドの実行結果を取得することができます。
なお上記のスクリプトの場合、最新メールの内容を、標準出力に表示して終了します。
typeコマンドに最後を意味する$を指定することで、一番最後に受信したメール、すなわち最新メールを表示するという処理になります。
もう一つ例を挙げます。
以下のようにすることで、メールの内容をファイルに出力することができます。
このスクリプトを実行すると、username@hotmail.co.jpからのいくつかのメールの本文を、test.txtへ出力します。
これさえできれば、あとはメール記載内容を判別するなどして、あらゆる処理に応用できるでしょう。
例えば、「メール本文にABCという文字列が含まれていれば、Xという処理を実行する」などが考えられます。
以下にいくつか説明しますが、他にも多くのオプションがあります。もっと深く知りたい場合はマニュアルページ(次のコマンドを実行:man mailx)を参照してください。
プロンプトが?の時に実行できるコマンド:
シェルスクリプトからメールを読み出す方法とその実例も載せます。
なお、メールの送信方法については触れませんが、既に解説しているこちらのページを参照してください。
.mailrcにIMAPサーバー設定をする
メールを受信するための事前準備として、IMAPサーバーの設定をします。IMAPサーバーとは、メールを受信するサーバーのことで、利用するメールサービスごとに読み替えて設定してください。
ここでは、Gmailを例として設定します。
.mailrcの内容:
set folder=imaps://username@imap.gmail.com
set password-username@imap.gmail.com="yourpassword"
こちらのページにあるメールを送信する際の設定が.mailrcに残っている場合、後ろに続けて上記の内容を追記してください。set password-username@imap.gmail.com="yourpassword"
set imap-use-starttls
ピンクの網掛けの部分が、メールサービスや個人ごとに異なる部分です。
username の箇所は、Googleアカウント名になります(メールアドレスの@より前の文字)。
yourpassword の箇所は、Googleアカウントのパスワードになります。
パスワードをファイルに残す際は、パーミッションを600へ変更しましょう。具体的には、.mailrcの編集が終わったら、以下のコマンドを実行してください。
chmod 600 .mailrc
こうすることで、所有者以外の閲覧権限が無くなります。なお、これらの設定値はメール送信の時にも説明しましたが、-Sオプションを使ってコマンドラインで指定することも可能です。
メールを受信する
メールを受信するには、次のコマンドを実行します。mailx
非常にシンプルですが、これだけです。mailxコマンドは、何のオプションも指定しなかった場合、メール閲覧モードになります。
IMAPサーバからメール情報を取得するため、しばらく時間がかかる可能性があります。
メールの受信に成功すると、以下のような画面が出力されます。これをメールヘッダのリストといいます。古いメールから順に表示されます。
この画面が表示されていれば、メールの受信は成功しています。
もし、メールボックスにメールが1通も無い場合は、「No mail for username」と表示されます。
Heirloom mailx version 12.5 6/20/10. Type ? for help.
"imaps://zundoko77@imap.gmail.com/INBOX": 51222 messages 43567 unread
U27141 ****************** Tue Dec 26 19:13 /17451 **********************
U27142 ****************** Tue Dec 26 19:21 /42500 **********************
U27143 ****************** Tue Dec 26 19:22 /39320 **********************
U27144 ****************** Tue Dec 26 20:02 /17168 **********************
>F27145 ****************** Tue Dec 26 20:17 /11386 **********************
O27146 ****************** Tue Dec 26 20:45 /18150 **********************
O27147 ****************** Tue Dec 26 22:09 /16809 **********************
O27148 ****************** Tue Dec 26 22:17 /14216 **********************
U27149 ****************** Wed Dec 27 06:13 /31113 **********************
U27150 ****************** Wed Dec 27 06:12 /13376 **********************
U27151 ****************** Wed Dec 27 08:14 /18321 **********************
U27152 ****************** Wed Dec 27 09:03 /50992 **********************
U27153 ****************** Wed Dec 27 09:10 /17965 **********************
U27154 ****************** Wed Dec 27 10:08 /18437 **********************
U27155 ****************** Wed Dec 27 11:23 /10103 **********************
O27156 ****************** Wed Dec 27 11:23 /13267 **********************
U27157 ****************** Wed Dec 27 11:28 /18004 **********************
U27158 ****************** Wed Dec 27 12:30 /17333 **********************
U27159 ****************** Wed Dec 27 13:02 /10499 **********************
U27160 ****************** Wed Dec 27 13:03 /11346 **********************
?
メールを読む
メールを読むには、?と出ているプロンプトに続けて、次のコマンドを実行します。t
このtは、typeの省略で、typeと打っても構いません。また、print(p)でも構いません。tだけだと、ヘッダのリストでカーソル「>」があたっているメールを読みます。
プロンプトが「:」に変わっていれば、エンターを入力することで続きを読むことができます。
このモードを抜けるには、qを打ちます。そうすると、プロンプトは再び「?」になります。
ヘッダのリストに表示されている任意のメールを読みたい場合は、tの後ろに、ヘッダのリストの先頭にある番号を指定します。ただし、UやOなどのアルファベットは含みません。
t27141
再びヘッダのリストを表示させるには、次のコマンドを実行します。h
ヘッダのリストを移動させるには、次のコマンドを実行します。z
「z-」とすることで、後ろに移動する(戻す)こともできます。また、最新メールのヘッダリストを表示するには、次のコマンドを実行します。
h$
最新メールから読みたい場合は、特によく使うコマンドです。なお、zやhの後ろにつける「-」や「$」は、edコマンドの用法に基づいており、
+は次、-は前、$は一番最後、*は全てを意味します。
シェルスクリプトでメールを読む例
上記のメールを読む方法は、ターミナルから対話式でメールを読む方法でした。では対話式ではないスクリプトでは、メールを読むことができるのでしょうか。
スクリプトの場合、以下のように書くことでメール内容を表示することができます。
#!/bin/sh
echo "t$" | mailx
スクリプトで実行する場合は、対話式で使うコマンドをパイプ「|」でmailxコマンドに渡します。echo "t$" | mailx
そうすることで、コマンドの実行結果を取得することができます。
なお上記のスクリプトの場合、最新メールの内容を、標準出力に表示して終了します。
typeコマンドに最後を意味する$を指定することで、一番最後に受信したメール、すなわち最新メールを表示するという処理になります。
もう一つ例を挙げます。
以下のようにすることで、メールの内容をファイルに出力することができます。
#!/bin/sh
echo "w (from username@hotmail.co.jp) test.txt" | mailx
この例では、writeコマンド(w)を使用しています。writeコマンドは、条件に合うメールの本文だけを、指定されたファイル(test.txt)に出力します。今回はこの条件を、username@hotmail.co.jpという差出人からのメールを対象にしました。(from mail_address)とすることで、差出人を条件にすることができます。echo "w (from username@hotmail.co.jp) test.txt" | mailx
このスクリプトを実行すると、username@hotmail.co.jpからのいくつかのメールの本文を、test.txtへ出力します。
これさえできれば、あとはメール記載内容を判別するなどして、あらゆる処理に応用できるでしょう。
例えば、「メール本文にABCという文字列が含まれていれば、Xという処理を実行する」などが考えられます。
メールを読む時のコマンド
これまでにいくつか挙げましたが、メールを読む時に様々なコマンドを指定することが可能です。以下にいくつか説明しますが、他にも多くのオプションがあります。もっと深く知りたい場合はマニュアルページ(次のコマンドを実行:man mailx)を参照してください。
プロンプトが?の時に実行できるコマンド:
h #ヘッダのリストを表示
from mail_address #mail_addressからのメールを一覧表示。
p #メールを表示
r #指定したメールの全員に返信
w 1 test.txt #番号1のメールをtest.txtに保存
? #コマンドの簡単な要約を表示
q #終了
条件の指定:from mail_address #mail_addressからのメールを一覧表示。
p #メールを表示
r #指定したメールの全員に返信
w 1 test.txt #番号1のメールをtest.txtに保存
? #コマンドの簡単な要約を表示
q #終了
. #今指定しているメール
$ #最後(最新)のメール
^ #最初(最古)のメール
* #全てのメール
1-5 #範囲指定。番号1から5までのメールを対象
(from mail_address) #差出人を指定
(to username) #宛先を指定
(subject string) #件名を指定
/string #全てのメールの件名からstringを含むメール
ちなみに、mailxを処理するマシンによっては、これらコマンドの実行に時間がかかる場合がありますので、コマンドの実行結果が返って来ない場合は気長に待ちましょう。$ #最後(最新)のメール
^ #最初(最古)のメール
* #全てのメール
1-5 #範囲指定。番号1から5までのメールを対象
(from mail_address) #差出人を指定
(to username) #宛先を指定
(subject string) #件名を指定
/string #全てのメールの件名からstringを含むメール
スポンサードリンク