Mew とその関連
TOP > チョロっとElisp > Mew とその関連

1 Mew

もっぱらメールクライアントには、Mew を利用させてもらってます
よく更新するので、追っかけるのは大変ですが、それなりに使っています。

と言う訳で、できればメーリングリストを購読することをお勧めします。
かと言う私はロムってますが(^^;


目次

1.1 Mew のソースの取得

Mew のオフィシャルサイトは、
http://www.mew.org/ja/ なので、ここからソースをもらってきます。

もし、最新版を追いかけたいのなら CVS で取得します
1. anoncvs.mew.org に cvs でログインします。
% cvs -d :pserver:anoncvs@anoncvs.mew.org:/cvsmew login
すると、以下のようにパスワードを聞かれますが、何も入力せずにリターンキーを押してください。
(Logging in to anoncvs@anoncvs.mew.org)
CVS password: 
2. 最新版のソース一式を取り出します。
% cvs -d :pserver:anoncvs@anoncvs.mew.org:/cvsmew co mew
すると、カレントディレクトリに "mew" というディレクトリが作られて、そのディレク トリに最新のソース一式が入ります。

ソースの更新は、ソースのあるディレクトリで
% cvs update -d -P
% make distclean
ここで、% make distclean するのは、古い elc ファイルが問題になる場合があるからです。

1.2 Mew のインストール

ソースのあるディレクトリで、
% ./configure
% make
# make install
簡単ですね (^^;

1.3 Mew の設定

1.3.1 主な Mew の設定

起動に関するものは、emacs.el に記述します。
(autoload 'mew "mew" nil t)
(autoload 'mew-send "mew" nil t)
(autoload 'mew-user-agent-compose "mew" nil t)
(global-set-key "\C-xm" 'mew) ; ← C-x m で Mew を起動します
その他は .mew.el に記述します。
主なものです。
(setq mew-auto-get nil)
(setq mew-auto-flush-queue t)
(setq mew-use-cached-passwd t)
(setq mew-use-timer nil)
(setq mew-pop-uidl-db nil)
(setq mew-draft-mode-hook (function (lambda () (auto-fill-mode 1))))

(setq elp-sort-by-function 'elp-sort-by-average-time)

(setq mew-replyto-to-list '("Reply-To:"))
(setq mew-replyto-cc-list nil)
(setq mew-fcc nil)
(setq mew-cc nil)

;; 重複メールに削除マークをつける
(setq mew-scan-form-mark-delete t)

;; 未読マークを付ける
(setq mew-use-unread-mark t) 

;; 既読メールのみを auto refile (M-o) する
(setq mew-refile-auto-refile-skip-any-mark t)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Meassage モードのヘッダ設定

;; 他のヘッダの表示  t:する nil:しない
(setq mew-field-other-visible t)

;; 表示する|しないヘッダの指定

(setq mew-field-spec
  '(
					;表示しないヘッダ
    ("^\\(Received\\|Return-Path\\|Sender\\|Errors-To\\):$" nil)
    ("^\\(Message-Id\\|In-Reply-To\\|References\\|Precedence\\):$" nil)
    ("^\\(Mime-Version\\):$" nil)
    ("^Resent-\\(From\\|To\\|Date\\|Message-Id\\):$" nil)
    ("^Delivered-" nil)
    ("^Disposition-Notification-To:$" nil)
    ("^X-\\(Face-Version\\|Face\\|UIDL\\|Now-Playing\\|cite-me\\):$" nil)
    ("^X-\\(Priority\\|MSMail-Priority\\|MimeOLE\\|Sender\\|Loop\\):$" nil)
    ("^X-\\(Bogosity\\|R-Mail_shop\\|BeenThere\\|Mailman-Version\\):$" nil)
    ("^X-Spam-\\(Flag\\|Probability\\):$" nil)
    ("^X-ML\\(Server\\|-Info\\|Driver\\):$" nil)
    ("^X-Mail\\(-From\\|er-Plugin\\):$" nil)

					;表示するヘッダ
    ("^Subject:$" t
     mew-face-header-key
     mew-face-header-subject)
    ("^From:$" t
     mew-face-header-key
     mew-face-header-from)
    ("^\\(To\\|Apparently-To\\):$" t
     mew-face-header-key
     mew-face-header-to)
    ("^Cc:$" t
     mew-face-header-key
     mew-face-header-to)
    ("^Newsgroups:$" t
     mew-face-header-key
     mew-face-header-to)
    ("^Date:$" t
     mew-face-header-key
     mew-face-header-important)
    ("^X-Mailer:$" t
     mew-face-header-key
     mew-face-header-important)
    ("^User-Agent:$" t
     mew-face-header-key
     mew-face-header-important)
    ("^X-ML-\\(NAME\\|Name\\):$" t
     mew-face-header-key
     mew-face-header-xmew)
    ("^X-\\(ML-COUNT\\|Mail-Count\\|Seqno\\):$" t
     mew-face-header-key
     mew-face-header-xmew)
    ("^X-Mew:$" t
     mew-face-header-important
     mew-face-header-xmew-bad)))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; thread

(setq mew-use-thread-cursor t)

(setq mew-thread-column 28);default 28
(setq mew-use-fancy-thread t)
(setq mew-fancy-thread-indent-strings [" ┣" " ┗" " ┃" "  "])

(setq mew-use-thread-separator t);; nil
(setq mew-thread-separator "------------")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; caution
(setq mew-passwd-lifetime 144) ; password cache する時間 1 = 10 minute


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; config-alist

;; Input/Output を別々に切替 nil:する t:しない
;(setq mew-config-synchronize t)

;; 切替えは C (大文字の c )
(setq mew-config-alist
      '(("hoge"
	 ("name" . "HOGE)")
	 ("user"     . "hoge")
	 ("pop-server" . "mail.hoge.jp")
	 ("smtp-server" . "mail.hoge.jp")
	 ("pop-size" . 0)
	 ("pop-auth" . pass) ; pop 認証
	 ("pop-user" . "hoge")
	 ("dcc" . "hoge@mail.hoge.jp")
	 ("msgid-domain". "hoge.jp")
	 ("pop-delete" . t) ; 取り込んだメールは削除する
	 ("mail-domain" . "hoge.jp")
	 ("msgid-domain". "hoge.jp")
	 ("queue-folder". "+queue")
         ("header-alist" . (("X-cite-me:" . "HOGE")
			    ("X-Uri:" . "http://www.hoge.jp/"))))
	("foo"
	 ("name" . "FOO")
	 ("user"     . "foo")
	 ("pop-server" . "mail.foo.jp")
	 ("pop-size" . 0)
	 ("pop-auth" . apop) ; APOP 認証
	 ("pop-user" . "foo")
	 ("smtp-server" . "mail.foo.jp")
	 ("pop-delete" . t)
	 ("dcc" . "foo@mail.foo.jp")
	 ("mail-domain" . "foo.jp")
	 ("msgid-domain". "foo.jp")
	 ("queue-folder". "+queue")
         ("header-alist" . (("X-cite-me:" . "FOO")
			    ("X-Uri:" . "http://www.foo.jp/"))))
	))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; refile

(setq mew-refile-guess-alist
      '(("To:"
	 ("FreeBSD-users-jp@jp.freebsd.org" . "+mail/bsd/users-jp")
 	 ("mew-dist@mew.org" . "+mail/mew/dist")
	 )
	("From:"
	 ("report@mail.hoge..jp" . "+report")
	 )
	("Subject:"
	 ("information" . "+information")
	 )
	("X-ML-Name:"
	 ("Mew-Win32" . "+mail/mew/win32")
	 ("Mew-dist"  . "+mail/mew/dist")
	 )
	("X-ML-NAME:"
	 ("meadow-users-jp" . "+mail/meadow")
	 )
	("X-Ml-Name:"
	 ("perl"      . "+mail/perl")
	 )))

1.3.2 Mew の設定の Tips

1.3.2.1 返信メールで From アドレスを全部 To: に加える

;;;;;;;;;;;;;;;;;;;;;;
;; From アドレスを全部 To: に加える

(defun mew-insert-all-from-address (&optional fld)
  (interactive)
  (setq fld (or fld (mew-input-folder (mew-inbox-folder))))
  (let ((msgs (directory-files (mew-expand-folder fld) nil "^[1-9][0-9]*$" 'no-sort))
	froms from)
    (save-excursion
      (while msgs
	(mew-set-buffer-tmp)
	(mew-insert-message fld (car msgs) mew-cs-autoconv
			    mew-header-reasonable-size)
	(setq msgs (cdr msgs))
	(setq from (mew-header-parse-address mew-from:))
	(if from (setq froms (cons from froms))))
      (setq froms (mew-uniq-list froms)))
    (insert (mapconcat (function identity) (sort froms 'string<) ", "))))

1.3.2.2 X-Mailer の表示変更(その1)

default では X-Mailer の表示が
X-Mailer: Mew version 6.2.53 on Emacs 22.3 / Mule 5.0 (SAKAKI)
となっているのを、
X-Mailer に Mew のバージョンを、User-Agent に Emacs 情報等をつけます。
Meadow にも対応してみました。
(setq mew-x-mailer 
      (concat mew-version
	      "\nUser-Agent: Emacs/" emacs-version
	       (if (featurep 'mule)
		   (concat " Mule/" mule-version))
	       (if (featurep 'meadow)
		   (let ((mver (Meadow-version)))
		     (if (string-match "^Meadow-\\(.*\\)$" mver)
			 (concat " Meadow/"
				 (substring mver
					    (match-beginning 1)
					    (match-end 1))))))
	       (concat " OS/" system-configuration)))

1.3.2.3 X-Mailer の表示変更(その2)

Mule 5.0 (SAKAKI) ← この括弧の中を漢字にします。
1. 拙作の mm-version.el を load-path に入れます。
2. 上記の設定の前に、
(require 'mm-version)
を加えます。

1.3.2.4 Summary mode の色付け

Summary mode に色を付けて、カラフルにします。
1.3.2.4.1 必要なもの
Mew のソースディレクトリに contrib がありますが、
そこの mew-fancy-summary.el を使います。
ただ、長らくメンテナンスされていないので、色々自分で手を入れないといけないかも。
1.3.2.4.2 設定
上記、mew-fancy-summary.el を load-path の通ったところに入れて、.mew.el に
;; mew-fancy-summary を使う
(add-hook 'mew-init-hook (lambda () (require 'mew-fancy-summary)))
(require 'font-lock)

1.3.3 Mew で HTMLメールを読む

HTMLメールはたいてい、ろくなものがない(失礼)ので、有無を言わさず消してました。
; で、メールのソースは読めますが、HTML のスクリプトがそのまま表示されるので、
読めたものじゃありません。
重要なメールが来たこともあって、読めるように変更しました。

1.3.3.1 必要なもの(こと)

w3m をインストールしないといけません。(ああ、面倒)
FreeBSD を使っているので、ports を利用しました。
# cd /usr/ports/japanese/w3m
# make install clean

1.3.3.2 設定

.mew.el に
(require 'mew-w3m)

1.3.4 全文引用対策

メールを全文引用する方がおられます。
良かれと思っているのか、そうすべきと思っているのか、分かりませんが、
読む方としては、少し嫌(正直、勘弁して)なので、
全文引用部分を Mew で省略表示します。

1.3.4.1 必要なもの

Mew の メーリングリストに流れていたもので、
clearcite.el
を使いますが、ネットで拾ってくるのは、手間かもしれないので、
download に置いておきます。

1.3.4.2 clearcite.el の設定

まず、clearcite.el を load-path の通ったところに置き、
~/.mew.el
(require 'clearcite)

(defun mew-clearcite ()
  "メッセージバッファの引用をすっきりさせる
すでにすっきりしているならもとにもどす(トグル動作)"
  (interactive)
  (let ((clearcite-widen t)
        (buf (get-buffer (mew-buffer-message))))
    (when buf
      (set-buffer buf)
      (if (clearcite-donep)
          (clearcite-undo-buffer)
        (clearcite-do-buffer)))))
(defun mew-call-clearcite ()
  (let ((size (save-excursion
                (set-buffer (mew-buffer-message))
                (buffer-size))))
    (when (< size mew-clearcite-limit)
      (mew-clearcite))))
(eval-after-load 'mew-key
  '(progn
     (define-key mew-summary-mode-map clearcite-key 'mew-clearcite)
     (define-key mew-message-mode-map clearcite-key 'mew-clearcite)))
(eval-after-load 'mew-vars
  '(add-to-list 'mew-message-hook 'mew-call-clearcite))

1.3.4.3 clearcite.el の使い方

いたって簡単で、H で全文引用の表示/非表示をトグルします。

2 c-sig (署名入力支援)

メールの署名を選択して挿入するツールです。

2.1 必要なもの

http://www.osk.3web.ne.jp/~kshibata/c-sig/ からもらってきます。

2.2 インストール

c-sig.el を (バイトコンパイルしたならそれも) load-path の通ったところにコピーするだけです。

2.3 設定例 (Mew用です)

C-c C-i に挿入をキーバインドしてます。

バックアップファイル、送信先と署名の関連を作成しないようにしてます。

emacs.el .mew.el どちらに記述しても良いようです。
(autoload 'add-signature "c-sig" "c-sig" t)
(autoload 'delete-signature "c-sig" "c-sig" t)
(autoload 'insert-signature-eref "c-sig" "c-sig" t)
(autoload 'insert-signature-automatically "c-sig" "c-sig" t)
(autoload 'insert-signature-randomly "c-sig" "c-sig" t)
(add-hook 'mew-draft-mode-hook
	  (function (lambda ()
		      (define-key mew-draft-mode-map "\C-c\C-i" 'insert-signature-eref))))
(setq sig-save-to-sig-name-alist nil)
(setq sig-make-backup-files nil)

2.4 使い方

署名の登録
  1. M-x add-signature
  2. 署名を入力
  3. C-c C-c
  4. 署名の名前を入力
署名の挿入
  1. C-c C-i
  2. n または p で署名の選択
  3. RET で挿入

3 xcite (引用返信支援)

メールを返信する時に、引用タグをカスタマイズするツールです。 メールツールとは独立して使えるようですが、他の使い方を私は知りません。

3.1 必要なもの

http://www.gentei.org/~yuuji/software/ からもらってきます。

3.2 インストール

xcite.el を (バイトコンパイルしたならそれも) load-path の通ったところにコピーするだけです。

3.3 設定例

xcite.el に書かれている設定では、最新の Mew ではうまく動かないので、(hookが原因?)以下のようにします。

emacs.el .mew.el どちらに記述しても良いようです。
(autoload 'xcite "xcite" "Exciting cite" t)
(autoload 'xcite-yank-cur-msg "xcite" "Exciting cite" t)
(global-set-key "\C-c\C-x" 'xcite)
(global-set-key "\C-c\C-y" 'xcite-yank-cur-msg)

(add-hook 'mew-draft-mode-hook
	  (function (lambda ()
		      (define-key mew-draft-mode-map "\C-c\C-y"
			'xcite-yank-cur-msg))))
(add-hook 'mew-init-hook
	  (function (lambda ()
		      (define-key mew-summary-mode-map "A"
			'(lambda () (interactive)
			   (mew-summary-reply)
			   (xcite-yank-cur-msg))))))

3.4 使い方

Mew の Summary モードで、返信したいメール上で A(大文字のA) を入力すれば、勝手に(爆)引用付きの返信になります
その他は xcite.el のコメントを見て下さい。

3.5 私の勝手な修正

default では、メーリングリスト名や記事番号が引用するヘッダに含まれません。
と言うことで、私なりの変更を加えてみました。差分は以下の通りですので、参考にしてください。

--- xcite.el.orig	2009-09-17 18:34:54.000000000 +0900
+++ xcite.el	2009-09-17 21:11:55.000000000 +0900
@@ -393,6 +393,11 @@
 (defvar xcite:inet-msgid	"^Message-Id: \\(<.*>\\)")
 (defvar xcite:inet-subject "^Subject: \\(.+\\)$")
 (defvar xcite:inet-ng "^Newsgroups: \\(.+\\)$")
+;;	add by te-kun ↓
+(defvar xcite:inet-mlname "^X-ML-NAME: \\(.+\\)$")
+(defvar xcite:inet-mlcount "^X-Ma?i?L-COUNT: \\(.+\\)$")
+(defvar xcite:inet-sequence "^X-Sequence: \\(.+\\)$")
+;;	add by te-kun ↑
 
 (defvar xcite:author-regexp
   (concat
@@ -427,7 +432,8 @@
 その関数中では id, author, date, time, year, month, day, hour, minute, ampm,
 tag という変数を利用することができる。ただし、Internet での Mail では
 date, id(e-mail アドレス), handle(実名フィールド), msgid(Message-ID),
-subject, tag(引用タグ), ng(NetNewsの場合のNewsgroups)が利用可能.")
+subject, tag(引用タグ), ng(NetNewsの場合のNewsgroups)が利用可能.
+それと mlname(メーリングリスト名),mlcount(メーリングリストの記事番号),sequence(メーリングリスト名 + 記事番号)") ;; add by te-kun
 
 (defvar xcite:default-user-prefix-alist
   '(("yuuji@ae.keio.ac.jp" "ゆ" "広")
@@ -763,6 +769,7 @@
 	(cb (current-buffer)) (p (point))
 	mesg n id handle date time year month day hour minute ampm msgid tag
 	subject ng peoh x-cite-me zmacs-regions
+	mlname mlcount sequence		;; add by te-kun
 	(tmpbuf " *xcite tmp*"))
     (save-excursion
       (cond
@@ -823,6 +830,17 @@
 	  (goto-char peoh)
 	  (if (re-search-backward xcite:inet-ng nil 1)
 	      (setq ng (xcite-match-string 1)))
+;;	add by te-kun ↓
+	  (goto-char peoh)
+	  (if (re-search-backward xcite:inet-mlname nil 1)
+	      (setq mlname (xcite-match-string 1)))
+	  (goto-char peoh)
+	  (if (re-search-backward xcite:inet-mlcount nil 1)
+	      (setq mlcount (xcite-match-string 1)))
+	  (goto-char peoh)
+	  (if (re-search-backward xcite:inet-sequence nil 1)
+	      (setq sequence (xcite-match-string 1)))
+;;	add by te-kun ↑	
 	  (goto-char peoh)
 	  (if (re-search-backward xcite:inet-subject nil t)
 	      (setq subject (xcite-match-string 1))))
私はメーリングリスト名と記事番号を From: foo <foo@foo.org> -->"フー"さん曰く Subject: Re: xcite.el Date: Wed, 06 Feb 2002 22:13:35 +0900 (JST) Message-Id: <200200101.11111.222222.foo@foo.org> ML-Name: [meadow-users-jp: xxxx] のように入れたいので、下記のようにしています。
3.3 設定の後に以下を追加します。
(setq xcite:insert-header-function 'my-xcite-header)

(defun my-xcite-header ()
  (cond (mlname
	 (format "From: %sさん曰く\nSubject: %s\nDate: %s\nMessage-Id: %s\nML-Name: %s\n"
		 (if handle 
		     (concat handle " " "<" id ">" " -->" "\"" tag "\"")
		   (concat id " -->" "\"" tag "\""))
		 subject date msgid
		 (concat "[" mlname ":" " " mlcount "]")))
	(sequence
	 (format "From: %sさん曰く\nSubject: %s\nDate: %s\nMessage-Id: %s\nML-Name: %s\n"
	      (if handle 
		  (concat handle " " "<" id ">" " -->" "\"" tag "\"")
		(concat id " -->" "\"" tag "\""))
	      subject date msgid
	      (concat "[" sequence "]")))
	(t
	 (format "From: %sさん曰く\nSubject: %s\nDate: %s\nMessage-Id: %s\n"
	    (if handle 
		(concat handle " " "<" id ">" " -->" "\"" tag "\"")
	      (concat id " -->" "\"" tag "\""))
	    subject date msgid))))

TOP > チョロっとElisp > Mew とその関連
http://www.yumi-chan.com/