Mailを家の中で共有する

 外部POP3サーバーから、落としてきて、IMAP提供。それを家のmac2台で見る。fetchmailで外部pop3サーバーから落としてきて、exim4で内部送信、各homeのmaildirに保存したら、それを、courier-imapで提供って感じ。

 まず、exim4をmaildir形式に変更。/etc/exim4/exim4.confだと思うが、exim4.conf.templateしかない。。これをコピーしてexim4.confにして、編集。じゃない!、update-exim4.confで上書きされると書いてあるので、そっちをコピーして、編集。

dc_eximconfig_configtype='local'
dc_other_hostnames='localhost.localdomain'
dc_local_interfaces='127.0.0.1'
dc_readhost=''
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets=''
dc_smarthost=''
CFILEMODE='644'
dc_use_split_config='false'
dc_hide_mailname=''
dc_mailname_in_oh='true'
dc_localdelivery='maildir_home' ←追加

 まぁ、一行追加。んで、自分のhomeにmaildirを作成。とexim4の再起動。

# mkdir Maildir
#/etc/init.d/exim4 restart

 でもってテスト。

$ mail -s 'test' 宛先(user名)
it's test
^D ^D (Ctrlキーを押しながらDを2回)

 あれ?。mboxに入っちゃった。。調べてみると、update-exim4.conf.confのまま編集するようだ。update-exim4.confに変更するんじゃないのか。。

 homeのMaildir以下にcur,new,tmpって出来た。newの中を見ると、さっきのテストメールが入ってる。

 普通、mailって打つと新規mailが受信できるんだけど、maildirの場合どうするんだろう。まぁいいか。使わないし。

 次、そのmaildirを外部のメーラーからIMAPで見られるようにするために、Courier-IMAPをインストール

# apt-get install courier-imap

 途中で、webからの設定をするか?って出るけど、いらないのでNoで。一応インストールが終わったら起動しているか確認してみると。

#ps -A | grep courier
24883 ?        00:00:00 courierlogger
24922 ?        00:00:00 couriertcpd
24924 ?        00:00:00 courierlogger

 まぁ、動いてる。外部にちゃんと提供してるか?。外部って言っても家庭内LANの範囲でだけど。と、mac側からテスト、telnetでポート143にアクセス。うちのサーバーは192.168.11.9に振っているので、それで。

mac$ telnet 192.168.11.9 143
Trying 192.168.11.9...
Connected to 192.168.11.9.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2004 Double Precision, Inc.  See COPYING for distribution information. 

 動いてみたい。"LOGOUT"って入れると抜けられる。

 じゃ、macのMail.appでテストしてみっか。他のmacではthunderbirdなんだけど、Mail.appの精度が上がってきたので、これで試す。

 まず、Mail.appを立ち上げて、新規アカウントを追加する。一般情報でアカウントをIMAPにし、メールアドレスと、氏名を入れる。次にメールサーバー設定だが、受信メールサーバー名を192.168.11.9、家のサーバーのアドレス、ユーザー名はサーバーのhomeのユーザー名。パスワードは当然そこの。送信メールサーバーはプロバイダのSMTPを使うつもりだが、とりあえず放置で。完了!。

 おぉぉぉー、さっき打ったテストメールがみれるぅぅぅー。

 Mail.appで開いて既読にして、Maildirの中を見ると、

/Maildir$ ls
courierimapkeywords  courierimapuiddb  cur  new  tmp
$ls new
$ls cur
xxxxxxx.xxxxxxx.localhost.localdomain:2,S

 newからcurに移ってるね。curireimapkeyworldとかcourierimapuiddbとかよくわからんのができてるけど。あ、http://www.courier-mta.jp/発見。webmailもできるけど、これも放置。認証取るの面倒だし、外部からもthunderbirdで見たいしね。携帯でチェックできるのは便利かもしれん。まぁいずれね。

 さて、IMAPだとメールがサーバー側に蓄えられるので、フィルタリングも同時にしたい。Mac1ではThunderbird,Mac2ではMail.appを使うつもりなので。そこでprocmailも使おう。homeディレクトリに.forwardを作ってprocmailに流し込むらしい。.forwardってメール転送にしか使った事無いんだけどな。

 procmailの在処を確認。最初から入ってら。

# which procmail
/usr/bin/procmail

 でもって.forwardを作成。#以降はコメントかと思ったけど、#Exim filterってかかなきゃ駄目みたいだな。

#Exim filter
pipe "/usr/bin/procmail"

 で、homeディレクトリに.procmailrcをつくって編集。

MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/

 これで、とりあえず、procmail経由でMaildirに入る。

 で、フィルタリングの設定。とりあえず、Maildir以下にcourier-imapが認識するディレクトリを作って、そこに流し込む。
courier-imapが認識するディレクトリを作るには以下の様にやるらしい。

$cd ~
$maildirmake.courier -f test Maildir

すると、Maildir以下に ".test"ってフォルダが出来てる。今度はここに、メールを振り分ける。とりあえず、全部をここに入れるように.procmailrcを編集

MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
:0
*^From:*
$Maildir/.test
:0

 お、入った。Mail.appからも見える。消す時はそのままディレクトリを消せばいいみたいだ。あとは、ここにどんどんフィルタを追加していけばいいわけだ。<>
 あとで、Thunderbirdで見てみたけど、Thunderbirdからは見えないな。courierimapsubscribedに書かなきゃだめなか?。まぁいいや。

 ちなみに、家に受信しつつ、どこかに転送する場合は、こんな感じ。

:0 c
!xxxx@yahoo.co.jp xxxx@gmail.com

 次、いよいよ、プロバイダのpop3からfetchmailで取ってきて、Maildirに流し込む。経路はこんな感じ

プロバイダのPOP3サーバー
 ↑アクセス
fetchmailで吸い出す→Procmailに流し込む→Maildirに保存

 てなわけで、fetchmailで取ってくる場合、exim4は関係ないわな。んでも、その設定しないとテストできない訳で・・・。

 fetchmailの設定はhomeディレクトリ以下に.fetchmailrcを作って設定。fetchmailが入ってない場合はインストール。

# apt-get install fetchmail
set daemon 180
set nobouncemail
poll pop.foo.ne.jp
proto pop3
user oresama
password saikou
keep
no mimedecode
mda "/usr/bin/procmail"

 さて、うまく行くか。ありゃ?。.fecthmailrcのパーミッションを710に変更しろって出ちゃったね。まぁpasswordが書いてあるからな。だったらpasswdとかで暗号化かけりゃいいのに・・。

 動かして確認。

#fetchmail
#ps -A |grep fetchmail
32649 ?        00:00:01 fetchmail

おぉ、きたきた。受信された。とりあえず、終了。

2011.02.20
サーバーを起動時に自動起動にしたいが、fetchmailrcに平文でpasswordが書いてあるのでそういう分けにも行かない。。ってこで、daemonモードをやめて、crontabでまわす。

 しばらくこの状態で使っていたが、やっぱりスパムがうざい。Mail.appで迷惑フィルタを掛ければいいんだがthunderbirdと判別が違う。なもんで、spanというメールボックスを作り、そっちにスパムを振り分ける。フィルターはbsfilterって言うのを使う。
とりあえず、spamフィルターのbsfilterをインストール

#apt-get install bsfilter

 んで、spamってメールボックも作るが。コマンドでつくるよりMail.appで作る方が楽なので、そっちで。。んでもって、Mail.appで判別されたspamメールをそっちに移し、bsfilterで学習。

$bsfilter --add-clean Maildir/cur/*  ←スパムじゃないメール
$bsfilter --add-spam Maildir/.spam/cur/* ←スパムメール
$bsfilter --update ←更新

 んでもって.procmailrcの設定。

MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/

:0 fw
| /bin/bsfilter --pipe --insert-flag --insert-probability

:0
*^X-Spam-Probability: *(1|0\.[89])
$MAILDIR/.spam/

:0
*^From:.*localhost
$MAILDIR/.me6/

:0

 bsfilterで--insert-flagを付けるとメールのヘッダーに"X-Spam-Probability:スパム率"と付けてくれる。それをprocmailで判別し.spamディレクトリに放り込む。spamでなく、.spamなのはcourier-imapがそういう名前で認識するから。ここまでの所、こんな流れ。
1.fetchmailで、プロバイダのpop3サーバーからメールを取ってきてprocmailに流す
2.procmailからbsfilterにパイプで送ってスパムチェック
3.procmailでX-Spamヘッダーの着いた物は.spamメールボックスに移動
4.それ以外はMaildir以下に普通に配信
5.Courier-imapで外部に公開
6.ThunderbirdやMail.Appで受信

!だが、スパマーのほうが上手。最近はこれ系のフィルターを通過するような内容になってるらしい。thunderbirdのフィルター部分だけ内部で使えない物だろうか・・・。

ついでなのでwebmailも

 職場では外部ポートが80しかあいてないので、家のメールが見れない。なわけでWebMailも用意。ほんとはxml_rpcなんかで用意してthunderbirdアドオンとかで普通に見れるようにしたいがそういう需要はないらしく、見つからない。

#apt-get install squirrelmail-viewashtml 

 えーと、一応、virtualhost *:443のSSLの方に入れよう。どうやらモジュールその物は、/usr/share/squirelmailにあるらしい。で設定ファイルは/etc/squirrelmailの中。apache.confってファイルがインストールされてて、それをほぼそのままコピペ。

 alias /mail /usr/share/squirrelmail
 <Directory /usr/share/squirrelmail>
    Options Indexes FollowSymLinks
  <IfModule mod_php4.c>
    php_flag register_globals off
  </IfModule>
  <IfModule mod_php5.c>
    php_flag register_globals off
  </IfModule>
  <IfModule mod_dir.c>
    DirectoryIndex index.php
  </IfModule>

  deny from all  ←ここと
  allow from 192.168.11.0/24   ←ここ

  # access to configtest is limited by default to prevent information leak
  <Files configtest.php>
    order deny,allow
    deny from all
    allow from 127.0.0.1
  </Files>
 </Directory>

 で、普段は使う事がないので、LAN内以外はアクセス禁止にしておく。必要になったら、アクセス制限の行の2行を消す。

ME6000 前へ戻る