tanimoto - Shibuya Perl Mongers

百万(+3)人の Mutt とみんなの Perl
2003/6/13
Mutt とは
• テキストベースのメールクライアント
- パワーユーザーにも十分応えられる高度な機能を持つ
キーバインディング、キーボードマクロ、正規表現、etc..
- 日本語も問題なく扱える
• 情報源
- The Mutt E-Mail Client
<http://www.mutt.org>
- Mutt Japanese Edition(LinuxJapanでの連載をPDFで公開!)
<http://www.emaillab.org/mutt/index.html>
• 国内での現状
海外では多く使われている(?)が、
国内ではまだまだマイナー(日本語の情報が少ないかも)
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
2
なぜ Mutt ?
• なんかデキル人っぽい!
• いつでもどこでも同じ環境でメールチェック!
• 基本操作は vi ライク(デフォルト設定)
• 好みの editor で書ける、好みの pager で読める
[muttrc] set editor=“vim”
[muttrc] set pager=“less” # 個人的には内蔵 pager を使用
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
3
Mutt への不満
• メールボックスの移動に時間がかかる
大量のメールを保存しているメールボックスへの移動
[muttrc] set mbox_type=Maildir で数千通ある場合
→ 状況、環境にもよるが数秒かかる
• 複数アカウントの対応
アカウントごとに設定ファイルを用意し、
Mutt の起動オプション “-F” で使用するアカウントの
設定ファイルを指定する
→ 都度 Mutt を起動しなおす必要がある
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
4
外部プログラムの利用(1)
• 重要なメールの管理(力業編)
ラベルを付けておいたメールの一覧を表示
1. 検索結果を保存しておくメールボックスを作成
mkdir –p ~/Maildir/.search/{new,tmp,cur}
2. muttrc にキーボードマクロの設定を追加
[muttrc] macro index I “c=.search/\n!search.pl\n”
# index 画面(通常画面)で Shift + i を押した時に
# .search に移動後、search.pl を実行する
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
5
外部プログラムの利用(1)
3. search.pl
#!perl
use strict;
use File::Find::Rule;
do_task(File::Find::Rule
-> file
-> name(‘*:*,*F*’)
-> in(‘/path/to/Maildir’));
sub do_task {
my @mail = @_;
foreach my $mail (@mail) {
my ($file) = $mail =~ m#([^/]+)$#;
link $mail => “/path/to/.search/$file”;
}
}
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
6
外部プログラムの利用(2)
• 新着メールの既読化(また力業編)
新着メールを読まずに既読化したい
new 以下にあるファイルに Flag “S” (seen) を付加して
cur に移動
上記のスクリプトを crontab から適当な間隔で実行させる。
(!)カレントのメールボックスに対してタイミング悪く
上記のスクリプトが走ると、、、
Mailbox was externally modified. Flags may be wrong.
と怒られます。
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
7
外部プログラムの利用(2)
#!perl
use strict;
while (<DATA>) {
chomp;
my $new = “/path/to/Maildir/$_/new”
my $cur = “/path/to/Maildir/$_/cur”;
while (<$new/*>) {
my ($file) = m#([^/]+)$#;
rename(“$new/$file” => “$cur/$file:2,S”);
}
}
__DATA__
private
work
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
8
外部プログラムの利用(3)
• 複数アカウントの対応
-
-
-
-
設定ファイルを分けたくない
設定ごとに起動しなおすのが面倒
どのメールボックスからも好きなアドレスから送信したい
From: によって SMTP サーバや署名も使い分けたい
◆ 指定したプログラムに標準入力から送信内容を渡す
[muttrc] set sendmail=“/path/to/sendmail.pl”
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
9
外部プログラムの利用(3)
sendmail.pl の概要
◆ 使用した CPAN Module
use
use
use
use
FileHandle;
Jcode;
Email::Find;
Net::SMTP;
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
#
#
#
#
テンプレート Open 用
テンプレートを必要に応じて変換
送信先アドレスの抽出
送信
http://www.edge.jp/
10
外部プログラムの利用(3)
sendmail.pl の概要
◆ 設定
my $conf = {
‘[email protected]’ => {
smtp => ‘mail.example.com’,
sig => ‘/path/to/signature’,
},
}
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
11
外部プログラムの利用(3)
sendmail.pl の概要
◆ メールアドレスの抽出
my $data = do { local $/; <STDIN> };
my ($header, $body) = $data =~ /^(.*?\n)\n(.*)$/ms;
my ($from) = $header =~ /(?:^|\n)From: (.*?)\n\S/ims;
my ($to)
= $header =~ /(?:^|\n)To: (.*?)\n\S/ims;
my ($cc)
= $header =~ /(?:^|\n)Cc: (.*?)\n\S/ims;
my ($bcc) = $header =~ /(?:^|\n)Bcc: (.*?)\n\S/ims;
$header =~ s/(^|\n)(Bcc: .*?\n)(\S)/$1$3/ims;
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
12
外部プログラムの利用(3)
sendmail.pl の概要
◆ メールアドレスの抽出
my $mail_from;
my $finder1 = Email::Find->new(sub {$mail_from = $_[1]});
$finder->find(\$from);
my @rcpt_to;
my $finder2 = Email::Find->new(sub {push(@rcpt_to,
$_[1])});
$finder2->find(\$to);
$finder2->find(\$cc);
$finder2->find(\$bcc);
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
13
外部プログラムの利用(3)
sendmail.pl の概要
◆ 送信
my $smtp = Net::SMTP->new($conf->{$mail_from}{smtp}) or die
$!;
(
$smtp->mail($mail_from)
and
$smtp->recipient(@rcpt_to) and
$smtp->data()
and
$smtp->datasend($header) and
$smtp->datasend(“\n”)
and
$smtp->datasend($body)
and
$smtp->dataend()
and
$smtp->quit
) or die $!;
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
14
外部プログラムの利用(4)
• テンプレートの利用
アカウントごとに署名を用意する
[muttrc] set signature=“/path/to/template_signature”
> cat template_signature
-[% mutt_signature %]
> cat private_signature
-Shibuya.pm 満員御礼 <[email protected]>
- TemplateToolkit や HTML::Template も利用できる
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
15
外部プログラムの利用(5)
• 外部プログラムを指定するための設定変数
◆ $display_filter
- メッセージ用のフィルタに使うコマンドを設定する。
メッセージが読まれる際に標準入力として
$display_filter に渡されフィルタ後のメッセージを
標準出力から読みとる。
◆ $query_command(アドレス帳)
- 外部にアドレスを問い合わせるコマンドを指定する。
プログラム側では問い合わせの文字列を受け取り、
検索した結果を名前、アドレス、付加的情報を
タブ区切りで出力する。
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
16
おまけ
• Mutt に Perl を埋めこんじゃいます。
Extending and Embedding Perl (ISBN:1930110820)
by Tim Jeneness and Simon Cozens
muttrc (設定ファイル) を Perl で記述することが可能に。
→ 設定ファイルの中で if などが使えるので
自動的に環境に合わせた設定にすることも。
◆ 記述例:
package Mutt;
$mbox = “~/Maildir”;
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
17
まとめ
~こんな機能、ないかしらん…と思ったら
Perl で書いて呼べばいいだけ~
Mutt と Perl に共通するもの、それは
TMTOWTDI
there’s more than one way to do it.
やり方は一つではない
Copyright 2003 Livin’ on the EDGE Co., Ltd. All rights reserved.
http://www.edge.jp/
18