メール送受信環境の整備
Linuxでメールを送受信する方法は、いくつかあります。
これは、メーラが何種類もある、という意味ではありません。
メールの送受信には、大雑把に考えて、作成、送信、受信、という機能が必要ですが、これらをどのように実行するかという点で、大変多くの選択肢があるのです。
基本的には、以下のアプローチが考えられます
- メーラのpop、smtp機能を利用して送受信する
- 送信、受信は別のプログラムに任せる
前者のアプローチの方が、最初の苦労は少ないです。特にMozillaなりThunderBirdなりを選べば、Windowsから乗り換えたばかり、という人でも全く問題ないでしょう。
しかし、あえてLinuxを選んだ以上、そのような安易な道を歩んではなりません(断言)。
是非とも二番目のアプローチを採用していただきたいものです。
お断り
最近では、非固定アドレスでもドメインを取得できる仕組みができて、自分のサーバを運用している人もいます。
ただ、このページはあくまで「メール送受信環境の整備」を目的とするもので、「独自ドメイン取得」を目的とするものではありません。
Postfixなどの紹介もしますが、インターネットに公開することを前提としていないので、その目的のためには全く使えません。
準備
さて、二番目のアプローチを実現するためには、必要なものがいろいろあります。
- メールを読み書きするためのツール
- メールを送信するためのツール
- メールを受信するためのツール
第一番目は、いわゆるメーラです。
MUA(Mail User Agent)と呼ぶのが正しいらしいのですが、ここからも「メーラ」で通します。
第二番目は、SMTPサーバか、またはその代わりをするツールです。
有名なのはsendmail、postfix、qmail、eximあたりでしょうか。
サーバの代わりをするものとしてはnomail、MasqMailなどが知られています。
第三番目は、POP3クライアントです。
fetchmailが有名です。
第二、第三の役割を果たすプログラム集としてIMもあります。
これらを組み合わせて自分のメール環境を構築しましょう。
私の環境の紹介
本当は、いろいろな選択に応じた環境整備方法を紹介したかったのですが、あまりに選択肢が多くて、いちいち検証できないので、私の環境を紹介するにとどめます。
三番目の手順が必要なのは、携帯電話(特にDOCOMO)へのメール送信のためです。
いろいろ調べてもらうと分かると思いますが、DOCOMOのサーバは結構きついフィルタを掛けているらしいのです。
きちんと実験したわけではないのですが、上記の三番目の手続きを踏まないと、DOCOMOへは一通も送信できないかもしれません。
他の携帯電話各社も同様で、そこそこ有名なプロバイダにリレーを依頼しないと、メールが届かない、または大幅に遅れる、といった症状が出るらしいです。
逆に、携帯電話以外のメールアドレスに対しては、上記の三番目の手順を省いても、ほとんど確実に送信できます。
このあたりは、従量制の携帯電話と定額制のプロバイダの違いかな、なんていう推理をしています。
準備
実際にメールサーバをインストールする前に、一応の防御を構築します。
私のマシンは一応ルータで区切られた安全な場所にあるので、それほど神経質にならなくても良いのですが、PPPoEを使ってアクセスしている人は、外部から丸見えになっている可能性があります。
設定がしょぼいと、たちどころに侵入されて、スパムの送信装置にされてしまうかもしれません。
そんな人のために、かなり強力な防御方法を紹介しておきます。
何をするかというと、iptablesを利用して、ローカルホスト以外からの接続をDROPします。
Linux-2.6系列を使っている場合には、iptablesもインストールされているかも知れませんが、上記のサイトから最新のものを入手してインストールします。
port scanもできるだけ拒否したい、という人はpom-ngも取得しましょう。
tar jxf iptables-1.2.11.tar.bz2
cd iptables-1.2.11
ここで、いつもなら./configureなのですが、今回はMakefileを直接書き換えます。
書き換える場所は、20行目あたりのPREFIXです。
PREFIX=/usr
にしておきます。
which iptables
を実行して表示される場所に上書きするかどうかは、好みです。
私は上書きしてしまいます。
make
su
password:******
make install
以上でiptablesはインストール完了です。
次に、iptablesを設定します。
#!/bin/sh
PATH=/sbin:/bin:/usr/local/sbin:/usr/local/bin/:/usr/sbin:/usr/bin
A_PRIV="10.0.0.0/8"
B_PRIV="172.16.0.0/12"
C_PRIV="192.168.0.0/16"
LOOPBACK="127.0.0.0/8"
iptables -F
#DROPの前にLOGを取るように、ターゲットを作る
#logはwarnなので、/etc/syslog.confあたりを書き換えて
#warnも出力するように設定しておく
#
iptables -N spoofdrop
iptables -N scandrop
iptables -P FORWARD DROP
iptables -P INPUT DROP
#ループバックデバイスからのパケットは全部通す
iptables -A INPUT -i lo -j ACCEPT
#外部から飛んできたのに、発信元をループバックのアドレスにしてあるものは
#全部DROPする(怪しいパケットだから)
#
iptables -A INPUT -i ppp0 -s $LOOPBACK -j spoofdrop
iptables -A INPUT -i eth0 -s $LOOPBACK -j spoofdrop
#プロバイダがプライベートアドレスを割り当てるなら、
#発信元アドレスがプライベートアドレスでも当然に怪しい
#とは判断できない(と思う)
#一応、コメントアウト
#
#iptables -A INPUT -i ppp0 -s $A_PRIV -j spoofdrop
#iptables -A INPUT -i ppp0 -s $B_PRIV -j spoofdrop
#iptables -A INPUT -i ppp0 -s $C_PRIV -j spoofdrop
#port scan detect
#利用するためにはpomが必要
#
#ソースを持ってきたらrootになって
#
#tar jxf patch-o-matic-ng-2004xxxxxx.tar.bz2
#cd patch-o-matic-ng-2004xxxxxx
#./runme psd
#
#すると、カーネルとiptablesの場所を聞かれる
#正しく答えると、パッチが適用される
#カーネルのconfigに追加されるので、モジュールにする
#あとiptablesの再コンパイルが必要
#
#iptables -A INPUT -m psd -j scandrop
#おまじない
#(これを書いておかないと、名前を解決できないとか、
#ブラウザで何も見ることができないとか、いろいろ問題が生じます)
#
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#INPUTの最後にLOGを取る
#落すべきでないパケットを落していないか、ここでの記録をもとに判断する
#
iptables -A INPUT -j LOG --log-prefix "iptables END_OF_INPUT: "
#怪しいパケットの行き先
#記録をとってDROP
#
iptables -A spoofdrop -j LOG --log-prefix "iptables END_OF_logdrop: "
iptables -A spoofdrop -j DROP
#port scanのパケットの行き先
#記録をとってDROP
#要pom ng
#あまりに激しくスキャンされるようなら、ログを取らずにDROPでもいいと思う
#
#iptables -A scandrop -j LOG --log-prefix "iptables END_OF_scandrop: "
#iptables -A scandrop -j DROP
なんていうスクリプトを/etc/rc.d/rc.iptablesなどという任意の名前で保存します。
保存したら、chmod 755で実行権を与えることも忘れてはいけません。
一応解説すると、鉄壁を目指してがちがちにDROPしています。
サーバとして利用しないことを前提としているので、ほとんど何でもDROPです。
間違っても、これをルータや公開サーバに適用してはいけません。
--state NEWもICMPもDROPなので、うんともすんとも言わなくなるでしょう。
十分に防御を固めたらnmapのようなツールで防御力を試してみるのも良いでしょう。
次に、マシンの起動時にiptablesを自動的に設定するスクリプトを用意します。
iptablesは、マシンをシャットダウンすると設定を全部忘れます。
そこで、マシンを起動する時に自動的に設定を読み込む仕掛けが必要なのです。
ここで重要なのは、マシンの起動プロセスのできるだけ早い時期にiptablesを設定する必要がある、という点です。
遅くとも、ネットワーク関係を設定する段階ではiptablesを設定済みであるのが望ましいでしょう。
Plamoは起動スクリプトが単純なので、任意の場所で上記のスクリプトを実行できます。
私は/etc/rc.d/rc.inet1の先頭で実行させることにしました。
起動プロセスでいうと、
Going multiuser
が表示された後です。
ここで実行しておけば、ネットワークカードが動き出す前に防御を固めることができます。
これで、Postfixの設定がしょぼくても、一応勝手に利用されない環境が準備できました。
Postfixのインストール
送信用のツールとして、Postfixをインストールします。
根性のある人はSendmailに挑戦して下さい。
今回の計画で必要な機能は、プロバイダのSMTPサーバへrelayを依頼する機能だけなので、他のメールサーバでもできるでしょう。
少なくとも、PostfixとSendmailにはその機能があることを確認しています。
いつものようにソースをとってきてmakeです。
tar zxf postfix-2.1.5.tar.gz
cd postfix-2.1.5
make
su
password:******
make install
いろいろ聞かれるので、適当に答えます。
全部リターンでも良いです。
ユーザ名やグループ名がない、というエラーが出たら、useraddやgroupaddで追加して、再度make installです。
installが無事に終了したら、設定です。
設定ファイルは/etc/postfix/main.cfです。
実は、make installを実行した時に、デフォルトの設定で実行されています。
運が良ければサーバが走っています(今回の目的に沿った使い方ができるかどうかはまた別問題ですが)。
telnet localhost 25
を実行して、
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 foo.bar ESMTP Postfix
という返事があれば、一応動いています。
ちなみに、私の場合は動きませんでした。
/etc/postfix/main.cfの69行目あたりに適当な名前を入れておかないと、
My hostname ****** is not a fully qualified name - set myhostname or mydomain in /etc/postfix/main.cf
というログが出て、終りでした。
仕方がないので、それっぽい名前を適当に入力しておきました。
次に、ローカルホスト以外からのrelayを拒否しましょう。
main.cfを読むと、設定方法がきちんと書いてあります。
今回必要なのは、253行目辺りのmynetworksを
mynetworks=127.0.0.0/8
とすることです。
これによって、自分のマシン以外からのrelayは不可能になります。
最後に、relayhostにプロバイダのSMTPサーバ名を記入します。
場所は/etc/postfix/main.cfの300行目辺りです。
relayhost=smtp.provider.ne.jp
最後に、自動的に起動させるためのリンクを張ります。
cd /etc/rc.d/init.d/
ln -s /usr/sbin/postfix ./
また、起動スクリプト中にsendmailなどを起動している部分があったら、削除しておきます。
これでPostfixはできあがりです。
さらなる防御手段としては、dracがあります。
dracd.allowにローカルホストだけ入れて、Postfixのリレー許可にdracを利用する、という仕組みにしておけば、誰もリレーさせることができなくなります。
お好みで追加して下さい。
fetchmail+procmailのインストール
さて、プロバイダにリレーを依頼するとしても、問題があります。
それは、多くのプロバイダはpop before smtpという仕組みを採用しており、そのままではリレーが拒否される、という点です。
この問題点を回避するために、定期的にpopする仕組みが必要です。
それがfetchmailです。
どうせfetchmailを動かすなら、procmailと連係させることで、メールを一定のルールで分類し、適切なディレクトリ(/dev/nullも含めて)に移動させることができます。
では、例によってmakeです。
ここ辺りからソースを入手しておきます。
tar zxf fetchmail-6.2.5.tar.gz
cd fetchmail-6.2.5
./configure --prefix=/usr
make
su
password:******
make install
ついでに、procmailもインストールしておきましょう。
tar zxf procmail-3.22.tar.gz
cd procmail-3.22
./configure --prefix=/usr
make
su
password:******
make install
まずは、fetchmailの設定ですが、その前にプロバイダに届いているメールを一度取得しておきましょう。
これは安全のためです。
fetchmailの設定がうまくいっていないと、届いていたメールが消えてなくなってしまうことがあるからです。
yahooあたりにテスト用のアカウントを作成するのもいいかもしれません。
また、メールを取得してもサーバに残しておく、というオプションもあるので、きちんと動くようになるまでそれを利用するのも良いでしょう。
Pythonが使えるなら、fetchmailconfもインストールされているはずですので、これを利用して設定できます。
そうでない場合、テキストエディタで.fetchmailrcを作成することになります。
私の場合、.fetchmailrcは
# Configuration created Sat Jan 22 22:49:22 2005 by fetchmailconf
set postmaster "hoge"
set bouncemail
set no spambounce
set properties ""
poll smpt.provider.ne.jp with proto APOP
user 'huga' there with password 'himitsu' is 'hoge' here options no rewrite fetchsizelimit 0
mda '/usr/bin/procmail'
こんな感じです。
hogeはローカルマシンのユーザ名、hugaはメールサーバのユーザ名(huga@provider.ne.jpというアドレスになる、ということ)です。
この設定では、一応の用心としてAPOPを利用しており、その場合fetchsizelimit 0を加えておかないと、メールを一通も取得できません。
また、プロバイダによってはAPOPを利用するために作業が必要になることもあるので、御利用のプロバイダを調べてみて下さい。
次に、.procmailrcです。
必要最低限の記述は
MAILDIR=$HOME/Mail
:0
inbox/.
です。
これは、届いたメールを全部$HOME/Mail/inboxに、MH形式で保存する、という意味です。
MHとは、一通のメールが一つのテキストファイルになっていて、ファイル名が数字、という形式のものです。
メールを振り分けたい場合はここ(JAISTってac.jpなんですね)あたりを読んで下さい。
他人が作成した正規表現はまるで暗号のようですが、自分で作成するのも簡単(?)です。
これで、送信と受信はできるようになりました。
fetchmail -v
と実行して、想定どおりの動作をしているか、確認しましょう。
最後に、これを定期的に実行させます。
プロバイダのpop before smtpの時間制限を超過しない程度の間隔でないと、リレーを拒否されることになるので、注意しましょう。
アプローチとしては
- fetchmailのdaemomモードをりようする
- cronを利用する
のいずれかだと思います。
どちらでもいいのですが、私はcronを利用することにしました。
crontab -e
を実行して、編集したら、終了します。
実は、cronには何種類かあるようで、crontabの書式が微妙に異なっていたりします。
必ずmanを読んで、自分のものに適した書式にするようにしてください。
それから、プロバイダのpop before smtpの時間制限を超過しない程度の間隔でないと、リレーを拒否されることになるので、注意しましょう。
メーラ
PlamoではMewが使えるようになっています。
しかし、MewはMH形式では未読、既読の区別がありません。
Mewが悪いのではありません。MHとはそもそもそういうものなのです。
メールの流量が少なければ問題ないのですが、Plamoのメーリングリストは場合によっては1日に30通位の投稿があるので、場合によっては読みそびれてしまいます。
他にメーリングリストを利用していたり、メールを多用する立場にある人なら、なおさら看過できません。
そこで、MH形式であっても未読、既読の区別が可能なWanderlustを選びました。
実は、その前にt-gnusにも当たってみたのですが、MH形式を扱うのは得意ではない、とInfoに書いているとおりにとても使いにくいものでした。
また、t-gnusのおすすめはnnmlとのことで、これに挑戦してみたのですが、これが良く分からなかったので、結局wlに落ち着きました。
これはt-gnusが機能的に劣る、という意味ではありません。むしろ、高機能過ぎて手に負えない、ということなのです。
勇気のある人は挑戦して下さい。
WanderLustはMakefileを一部書き換えてmakeします。
INFODIRが最初の記述で良い、という人はそのままです。
make
su
password:******
make install
make install-info
次に、.emacsにいくつかの追加をします。
;;Wanderlust
;; autoload の設定
(autoload 'wl "wl" "Wanderlust" t)
(autoload 'wl-other-frame "wl" "Wanderlust on new frame." t)
(autoload 'wl-draft "wl-draft" "Write draft with Wanderlust." t)
以上の記述は.emacsに追加しなければならないらしいです。
それ以外の設定は、.emacsか.wl.elのどちらかにすれば良いらしいです。
私の個人的な好みとして、あまり.emacsを巨大化させたくない、という指向があるので、できるだけ.wl.elに追い出しています。
;;wl-smtp-posting-serverがlocalhostになっているのがみそ
;;これをプロバイダのサーバにすることもできます
;;
(setq wl-smtp-posting-server "localhost")
(setq wl-from "hogehuga<huga@provider.ne.jp>")
;;
;;必須なのはここまで
;;ここより下のものは、あってもなくても良いです
;;message-idにメールアカウントがそのまま含まれる、というのが
;;いやな人は、一応隠すことができます
;;
(setq wl-message-id-use-wl-from nil)
(setq wl-message-id-domain "provider.ne.jp")
;;htmlを表示した時、画像を表示する
;;w3mが必要です
;;
(setq mime-w3m-display-inline-images t)
;;x-faceをインライン表示する
;;
(autoload 'x-face-decode-message-header "x-face-e21")
(setq wl-highlight-x-face-function 'x-face-decode-message-header)
;;bbdb関係
(require 'bbdb-wl)
(bbdb-wl-setup)
;; ポップアップ表示
(setq bbdb-use-pop-up t)
;; 自動収集
(setq bbdb/mail-auto-create-p t)
;; 自動収集しないフォルダの指定
(setq bbdb-wl-ignore-folder-regexp "^@")
(setq signature-use-bbdb t)
(setq bbdb-north-american-phone-numbers-p nil)
;; サマリに bbdb の名前を表示 :-)。
(setq wl-summary-from-function 'bbdb-wl-from-func)
;; 自動的に ML フィールドを加える
(add-hook 'bbdb-notice-hook 'bbdb-auto-notes-hook)
(setq bbdb-auto-notes-alist '(("X-ML-Name" (".*$" ML 0))))
これで出来上がりです。
Shimbunを利用して新聞記事を読めば、ブラウザで新聞社のサイトを見るのがバカバカしく思えるくらい便利です。
Shimbunについてはまた別に紹介したいと思います。
WanderLustを起動するためには、コマンドラインから
emacs -e wl
と入力するか、emacsを起動した後で、
Alt+x wl
と入力します。
スプラッシュが表示され、そのあと簡単な説明が表示されるので、一応最後まで目を通してからqを入力します。
質問にはyes、noのどちらを答えてもいいです。
すると、一番上の行にDesktopと表示された画面になります。これが「Folder」モードです。
ここにどのディレクトリを表示するか、$HOME/.foldersにエディタで書き込んでも良いのですが、Desktopの下の行にカーソルを移動して
m a
と入力することで、ディレクトリを追加することもできます。
私の場合、MH形式なので、
+inbox
と入力することで、~/Mail/inboxを読むことができるようになります。
もしも複数のディレクトリに振り分けてあるならば、適宜追加します。
これらの作業は、.foldersに反映されます。
メールを書く時は「w」、届いたメールに返事を書く時は「a」を入力することで、メール作成モード(draftモード)になります。
「a」のかわりに「A」を入力することで、ドラフトに元の記事を引用できます。
作成したらCtrl-c、Ctrl-cで送信できます。
WanderLustを終了する時は、qを入力します。
メール本文を表示している時は、何度か入力を繰り返さないと終了できません。
qを連打しましょう。
以上で、非常に簡単ながら、WanderLustの操作方法の紹介を終ります。
もっといろいろな機能があるので、infoを読んで自分流に改造してください。
メールを読んで、書いて、送信するのに、一度もマウスを触らない、というのがどんなに快適か、皆さんも是非体験して下さい(OEあたりも、キーボードだけで全部操作できるのでしょうか)。 |