しばらくkmailを使ってたけど、composerで日本語の自動折り返しができないとか、KDEアプリでuim-anthyの入力が変だとかで、muttに戻ることにした。kmailはKDEで完結できるのがよかったけど、もうがまんならん。muttも決して好きなMUAではないけど、他に選択肢がない(sylfeedが気に入らなかった理由は忘れた)。もう2度とmuttの設定をscratchからしたくないので書いておく。
- The Mutt E-Mail Client
- A Quick Guide to Mutt あんまりquickじゃないけど
- Howto: Mutt Scoring scoring
- http://www.xs4all.nl/~hanb/configs/dot-mutt/ サンプルdot file
- http://www.dotfiles.com/files/18/288_mailfilter サンプルmailfilter
- MuttWiki Wiki
基本方針は以下のとおり。
- $HOME/Maildir
- POP3にはfetchmail
- MDAはmaildrop
- MLは~/Maildir/list以下、サーバ関連のメッセージは~/Maildir/server以下にサブディレクトリを
- spamは~/Maildir/spamに
まずはfetchmailとmaildropをインストール。
# portinstall fetchmail maildrop
muttのOPTIONSはこんな感じで指定した。
MUTT_CONFIGURE_ARGS=--with-homespool=Maildir WITH_MUTT_NCURSES=yes WITH_MUTT_GPGME=yes WITH_MUTT_ASPELL=yes WITH_MUTT_MAILDIR_MTIME_PATCH=yes WITH_MUTT_SIDEBAR_PATCH=yes WITHOUT_MUTT_IDN=yes WITH_MUTT_SMTP=yes WITH_MUTT_CYRUS_SASL2=yes
最小限の.fetchmailrcを書く。
# .fetchmailrc poll pop3.example.org proto pop3 user "myname" password "secret" keep mda maildrop
keepを指定しておいて、取ってきたメッセージをサーバ上から削除しない。完全に移行できるめどがついたらkeepは削除してもよい。
.mailfilterにも最小限の設定を。
# minimal settings
MAILDIR="${HOME}/Maildir"
DEFAULT="${MAILDIR}"
SHELL="/bin/sh"
# enable logging
logfile $HOME/.maildroplog
# create directories if missing
`test -d "${MAILDIR}" || maildirmake "${MAILDIR}"`
`test -d "${MAILDIR}/spam" || maildirmake "${MAILDIR}/spam"`
これですべてのメッセージは~/MaildirにMaildir形式で配送される。filteringがうまくいかなかったりしてもrm -rf ~/Maildir && rm ~/.fetchids && fetchmailするだけ。filteringは後述。
テスト。
> fetchmail 1 messages (0 seen) for myname at pop3.example.org (3844 octets). reading message myname@pop3.example.org:1 of 1 (3844 octets)... not flushed
.maildroplogを見たりやlsしてうまく配送されていることを確認。
Date: Sun Jun 8 12:38:33 2008 From: "Me" <myname@example.org> Subj: test File: /usr/home/myname/Maildir (3844)
以前はMDAにprocmailやscmailを使った。でもやっぱりどっちも書式が気持ち悪い。maildropはshっぽくて、比較的わかりやすい。簡単な例。
if (/^Delivered-To: *auto@domain\.com$/)
to Mail/auto
if (/^From: *boss@domain\.com/ \
&& /^Subject:.*[:wbreak:]project status[:wbreak:]/)
{
cc "!john"
to Mail/project
}
条件はpcre(一部の機能が使えないけど)で書ける。変数もshっぽく書ける。shellの実行はbacktickで。From:に(root|postmaster)@example.orgがマッチしたら、~/Maildir/server/$HOSTNAMEに振り分ける。また、ディレクトリが存在しなければ自動的に作成する。これでサーバが増えても問題なし。同様にMLも自動でディレクトリを作成して振り分ける。いちいちfilterを書いたり、mkdirしなくてよいので便利だ。
if ( /^From:.*(root|postmaster)@(\w+)\.example\.org/ )
{
DIR=$MATCH2
SUBDIR="server"
`test -d "${MAILDIR}/${SUBDIR}" || mkdir "${MAILDIR}/${SUBDIR}"`
`test -d "$MAILDIR/${SUBDIR}/${DIR}"`
if ( $RETURNCODE != 0 )
{
log "creating ${MAILDIR}/${SUBDIR}/${DIR}..."
`maildirmake "${MAILDIR}/${SUBDIR}/${DIR}"`
if ( $RETURNCODE != 0 )
{
log "!!! failed to create ${MAILDIR}/${SUBDIR}/${DIR}"
}
}
to Maildir/${SUBDIR}/${DIR}
}
# spam
if ( /^Subject:.*\*\*\*SPAM\*\*\*/ )
{
to Maildir/spam
}
filterを書いてfetchmail、logを確認を繰り返す。このfilterはfetchmailから呼ばれたときだけ適用されるので、すでに~/Maildirにあるメッセージを再度filterするにはmaildropを直接実行する必要がある。maildropは標準入力から読み込んだメッセージしか処理してくれないので、適当にshでwrapperを書く。
#!/bin/sh
# refile [ relative_directory_name ]
BASEDIR="$HOME/Maildir"
TARGET_DIR="$1"
if [ -z ${TARGET_DIR} ]; then
MAILDIR="${BASEDIR}"
else
MAILDIR="${BASEDIR}/${TARGET_DIR}"
fi
if [ ! -d ${MAILDIR}/new -o ! -d ${MAILDIR}/cur ]; then
echo "${MAILDIR} is not Maildir" >&2
exit 1
fi
FILES=`find ${MAILDIR}/new -type f`
for F in $FILES; do
cat ${F} | maildrop && rm ${F}
if [ $? -ne 0 ]; then
exit 1
fi
done
FILES=`find ${MAILDIR}/cur -type f`
for F in $FILES; do
cat ${F} | maildrop && rm ${F}
if [ $? -ne 0 ]; then
exit 1
fi
done
納得いくものができたらmuttの設定。muttrc(5)は死ぬほど設定項目があるので、$HOME/.muttディレクトリを作って.muttrcはその中のファイルをsourceすることにする。コメント書いておいても、長くなりすぎるとわけわからなくなる。
# .muttrc source ~/.mutt/main.muttrc source ~/.mutt/smtp.muttrc source ~/.mutt/color.muttrc source ~/.mutt/japanese.muttrc source ~/.mutt/personal.muttrc ...
配色。何も設定しないと本当に何も表示されなくて焦った。
color hdrdefault red default color quoted brightblue default color signature red default color indicator brightyellow red color error brightred default color status yellow blue color tree magenta default # the thread tree in the index menu color tilde magenta default color message brightcyan default color markers brightcyan default color attachment brightmagenta default color search default green # how to hilite search patterns in the pager color header brightred default ^(From|Subject): color body magenta default "(ftp|http|https)://[^ ]+" # point out URLs color body magenta default [-a-z_0-9.]+@[-a-z_0-9.]+ # e-mail addresses color underline brightgreen default
Maildirの設定。
# Maildir
set mbox_type=Maildir
set folder="~/Maildir"
set mask="!^\\.[^.]"
set mbox="~/Maildir"
set spoolfile="~/Maildir"
mailboxes ! `\
for file in ~/Maildir/server/*; do \
box=$(basename "$file"); \
if [ ! "$box" = '.' -a ! "$box" = '..' -a ! "$box" = '.customflags' \
-a ! "$box" = '.subscriptions' ]; then \
echo -n "\"+server/$box\" "; \
fi; \
done`
mailboxes `\
for file in ~/Maildir/list/*; do \
box=$(basename "$file"); \
if [ ! "$box" = '.' -a ! "$box" = '..' -a ! "$box" = '.customflags' \
-a ! "$box" = '.subscriptions' ]; then \
echo -n "\"+list/$box\" "; \
fi; \
done`
mailboxes "+spam"
macro index c "<change-folder>?<toggle-mailboxes>" "open a different folder"
macro pager c "<change-folder>?<toggle-mailboxes>" "open a different folder"
mailboxesはshellで動的に設定している。~/Maildir/listと~/Maildir/server以下のfolderをshellで読み出している。”c”でfolderの移動ができる。
個人設定。~/.signatureに署名を書いておく。
# personal.muttrc # set hostname="my.host.example.org" set realname="SurName FamilyName" set from="myname@example.org" set sig_dashes=yes set signature="~/.signature" # set signature="echo $USER |" # my email address alternates "myname@example.org|another@example.net"
日本語まわりの設定。
# japanese.muttrc # enable charset for your terminal set charset="euc-jp" set send_charset="us-ascii:iso-2022-jp:utf-8" set assumed_charset="iso-2022-jp:euc-jp:shift_jis:utf-8" set attach_charset="iso-2022-jp:euc-jp:shift_jis:utf-8" # if you'd like to search Japanese text in headers and attachements set thorough_search=yes # save MIME B encoded attachements (i.e. file name contains Japanese) set rfc2047_parameters=yes set forward_decode=yes set mime_forward_decode=no # vim:ft=muttrc
SMTP関係。
# smtp.muttrc set smtp_url="smtp://localhost:1025" # if your MSA requires authentication... # set smtp_authenticators="digest-md5:cram-md5" # set smtp_pass "password" # if the MSA supports STARTTLS... # set ssl_starttls=yes # vim:ft=muttrc
PGP関係。コマンドとかはmutt付属の設定をsourceしてお茶を濁す。gpg_agentはあらかじめkeychain出も使って設定しておくこと。
# pgp.muttrc source /usr/local/share/examples/mutt/gpg.rc set pgp_verify_sig=yes # use gpg_agent set pgp_use_gpg_agent=yes # sign messages by default set crypt_autosign=yes set pgp_good_sign="^gpgv?: Good signature from " # always sign and encrypt reply to signed/encrypted message set pgp_replyencrypt=yes set pgp_replysignencrypted=yes
header関係。
# header.muttrc set header=yes set user_agent=no set use_envelope_from=yes set edit_headers=yes # do not display all headers ignore * # but these... unignore date from to cc reply-to subject x-mailer user-agent #hdr_order date from subject to cc my_hdr X-Mailer: mutt
muttにはscoreをメッセージに付加することができる。このスコアによってソートしたり、タグをつけたメッセージにまとめて処理を行う、といったことが可能。
# GPG encrypted/signed messages score "~G" 100 score "~g" 5 # if Subject contains "ports" score "~s ports" 50 # from openbsd.org/freebsd.org score "~f openbsd.org" 50 score "~f freebsd.org" 50 # messages to me # see also "alternates" score "~p" 10
こうしたみょーなパターン(~f)はmuttrc(5)のPATTERNSにあるものが使える。これだけだとあまり大したことはないけど、後述するfolder-hookと組み合わせると強力な処理が可能になる。
ML関係。subscribeしているかどうかで挙動が変えられる(通常は”r”でreplyだけど、subscribeしているlistのfolderでは必ずlistに返信する、とか)。
# list.muttrc # subscribed lists subscribe (ports|misc|tech)@openbsd\.org
# hook.muttrc
#
# - generic list hook
# * hide massage size in index_format
# * mark messages older than a week for deletion
# * reply to list
#
folder-hook list '\
set index_format="%X %4C %Z %{%b %d} %-15.15L (score:%3N) %s" ;\
set score ;\
set sort=threads ;\
score "~d <7d" 10 ;\
set score_threshold_delete=0 ;\
bind index r list-reply ;\
bind pager r list-reply ;\
'
#
# - spam
# * all messages get deleted after inspection.
#
folder-hook ^=spam$ '\
set index_format="%Z %[%d %b %H:%M] %-60.60s %35.35F" ;\
set sort=subject ;\
ignore * ;\
set pager_index_lines=8 ;\
set score ;\
set score_threshold_delete=0 ;\
set weed=no ;\
'
folder-hook server '\
set score ;\
score "~d <14d" 10 ;\
set score_threshold_delete=0 ;\
'
hookはfolderによって挙動を変えるための設定。”=list”以下にあるfolderで表示を変えて(index_format)、1週間以内のメッセージにscoreを加算し、返信はlistにする。これで、1週間を過ぎたメッセージは自動的に削除される(この機能がmuttに再度乗り換えるきっかけになった)。”=spam” folderのメッセージはfolderを確認した後にすべて削除する。
# hook.muttrc
# - generic list hook
# * hide massage size in index_format
# * mark messages older than a week for deletion
# * reply to list
#
folder-hook "=list" '\
set index_format="%X %4C %Z %{%b %d} %-15.15L (score:%3N) %s" ;\
set score ;\
unscore *;\
set sort=threads ;\
score "~d <7d" 10 ;\
set score_threshold_delete=0 ;\
bind index r list-reply ;\
bind pager r list-reply ;\
'
#
# - spam
# * all messages get deleted after inspection.
#
folder-hook "=spam$" '\
set index_format="%Z %[%d %b %H:%M] %-60.60s %35.35F" ;\
set sort=subject ;\
ignore * ;\
unscore * ;\
set pager_index_lines=8 ;\
set score ;\
set score_threshold_delete=0 ;\
set weed=no ;\
'
いやー、muttって面倒。続く(かも)。




