bbdb オプション
--------------

bbdb は多機能の人名簿情報に特化したデータベースシステムです。データの
入出力とユーザインタフェースを統合し、名前やメールアドレスを含むレコー
ドテンプレートを含め、受信メールからの情報入力用 API 関数を多数用意し
ています。MUA 側のサポートによりデータの自動収集を可能にします。

最新の bbdb およびマニュアルは以下の URL から入手できます。

  http://bbdb.sourceforge.net/

cmail ではなるべく最新の bbdb バージョンでお使いください。また bbdb の 
API が時々変更になるため、対応する更新をおこなった版 cmail が必要とな
ります。以下は現在判っているコンパチビリティの表です。

	cmail    bbdb
	-------- ---------------------
	2.62     2.33 以前, 2.34
	2.61     2.33 以前
        2.60     2.00

使用法
------

使用にあたってまず bbdb をインストールしてください。適当にバイトコンパ
イルして手動で load-path の通ったインストールディレクトリにコピーすれ
ば十分です。(make のターゲットは bbdb を指定して、コンパイルされないファ
イルは無視してすべての el および elc ファイルをコピーします。) もちろ
ん make でまともにコンパイルインストールができる場合はそれでインストー
ルしてください。また XEmacs のパッケージなど利用しても可です。

その後なるべく cmail を再コンパイルインストールしてください。対応する
el ファイルがバイトコンパイルされます。(MIME を使用している場合後述の 
mime-bbdb.el をインストールするため SEMI を再インストールするのもお勧
めします。)

以上のインストレーションが完了したらオプション変数 cmail-use-bbdb を 
non-nil にすると bbdb オプションが有効になります。カスタマイズがある場
合は:

   M-x customize-group <CR> cmail-use-bbdb-group <CR>

とすると cmail-use-bbdb の変数カスタマイズ画面になります。

bbdb が有効になると、メッセージの表示時に勝手にデータ収集を始めます。
メッセージの表示時にはデフォルトで送付者の情報を別バッファに表示します。
bbdb 自体の使用法、設定などは bbdb の info を参照ください。


以下必要最小限の簡単な操作/設定の説明です。

Q: bbdb で収集したデータを検索・閲覧したい
A: M-x bbdb <CR> とすると正規表現で検索項目を尋ねてきます。これを入力
   するとマッチするレコードがデータ閲覧モードでリストされます。

Q: bbdb で収集したアドレスを利用して *mail* バッファで補完をしたい。
A: *mail* バッファ内で M-TAB (Esc TAB) で補完します。

Q: サマリから、送付者のレコードを見たい。
A: サマリから ':' をタイプしてください。

Q: サマリから、送付者のレコードのノートを編集したい。
A: サマリから ';' をタイプしてください。

Q: メッセージ表示時に bbdb のバッファを表示しないようにしたい。
A: bbdb-use-pop-up を nil に設定してください。

Q: ISO-2022-JP などの文字列が名前として認識登録されてしまう。
A: SEMI 附属の mime-bbdb.el を利用する。設定例参照のこと。

Q: bbdb を cmail 終了時にセーブ終了したい。
A: cmail-quit-hook に適宜関数をセットする。設定例参照のこと。

Q: いろいろなメッセージの情報を集めてみたい。表示してみたい。
A: bbdb のマニュアルを読んでください。またあちこちのホームページでいろ
   んな設定例が紹介されていますので探してみて下さい。設定例にもいくつ
   か例を載せています。
   

設定例1
-------
;;
;; bbdb をロードする
;;
(require 'bbdb)

;; mime encode された rfc822 ヘッダを正常に解析させるための設定。例え
;; ば "foo@bar.com (=?ISO-2022-JP?B?GyRCJFUhPCQ1JHMbKEI=?=)" 等を name
;; "ふーさん" net "foo@bar.com" と解析する。mime-bbdb が必要。
;; mime-bbdb は BBDB がインストールされていないとインストールされない
;; 様なので BBDB をインストールしてから SEMI をインストールしなおす必
;; 要がある。

(setq mime-bbdb/use-mail-extr nil)
(require 'mime-bbdb)

;; mime decode されたデータが文字列として入っている bbdb-file の文字化
;; けを避けるため coding-system を ctext にするようにしておくといいら
;; しい。これでも文字化けが起こる時は起こるのでバックアップは取ってお
;; いた方がよいと思われる。
(if (fboundp 'modify-coding-system-alist)
    (modify-coding-system-alist 'file (expand-file-name bbdb-file) 'ctext))

;; bbdb のデータベースファイルを cmail 終了時にセーブして関連バッファ
;; を開放する。
(defun myfunc-bbdb-quit-all ()
  (if (bufferp bbdb-buffer)
      (let ((bbdb-buffer (get-buffer bbdb-buffer))
	    (bbdb-view-buffer (get-buffer bbdb-buffer-name)))
	(if bbdb-buffer
	    (progn
	      (bbdb-save-db)
	      (kill-buffer bbdb-buffer)))
	(if bbdb-view-buffer (kill-buffer bbdb-view-buffer)))))
(add-hook 'cmail-quit-hook 'myfunc-bbdb-quit-all)

;; bbdb バッファが view mode になるのを避ける temp-buffer-setup-hook 
;; が help-mode-setup を呼ぶため view-mode になる。view.el をロードに
;; 行くのも悔しいので関数を入れ換える (bbdb 2.00 の問題. 2.33 では修正
;; されている。)
(if (fboundp 'help-mode-setup)
    (progn
      (fset 'help-mode-setup-orig (symbol-function 'help-mode-setup))
      (defun help-mode-setup ()
	(if (null (string= (buffer-name (current-buffer))
			   bbdb-buffer-name))
	    (help-mode-setup-orig)))))

;; header field を記録する。X-Mailer と User-Agent を集めてみる。
;; ついでに修正記録(日付)を付けてみる。
(defvar *myfunc-bbdb-change-log-stack nil)
(defun myfunc-bbdb-hack-clear-log-stack ()
  (setq *myfunc-bbdb-change-log-stack nil)
  (remove-hook 'post-command-hook 'myfunc-bbdb-hack-clear-log-stack))
(defun myfunc-bbdb-annotate-x-mailer (field-value)
  (setq *myfunc-bbdb-change-log-stack
	(cons (list "x-mailer" field-value
		    (concat (current-time-string)
			    (car (cdr (current-time-zone)))))
	      *myfunc-bbdb-change-log-stack))
  (add-hook 'post-command-hook 'myfunc-bbdb-hack-clear-log-stack)
  field-value)
(defun myfunc-bbdb-annotate-user-agent (field-value)
  (setq *myfunc-bbdb-change-log-stack
	(cons (list "user-agent" field-value
		    (concat (current-time-string)
			    (car (cdr (current-time-zone)))))
	      *myfunc-bbdb-change-log-stack))
  (add-hook 'post-command-hook 'myfunc-bbdb-hack-clear-log-stack)
  field-value)

(setq bbdb-auto-notes-alist
      '(("X-Mailer" (".*" x-mailer myfunc-bbdb-annotate-x-mailer 'replace))
	("User-Agent" (".*" user-agent myfunc-bbdb-annotate-user-agent))
	("X-Mailer" (".*" mua 0 'replace))
	("User-Agent" (".*" mua 0 'replace))
        ("X-Url" (".*" www 0))
        ("To" ("qa3507@\\|morishim@cig\\|tm@interaccess" ml "direct"))
        ("X-Ml-Name" (".*" ml 0))
        ("X-List" (".*" ml 0))
        ("reply-to" ("^\\([^@]+\\)@" ml 1))))

(defun myfunc-bbdb-change-log-hook (record)
  (while *myfunc-bbdb-change-log-stack
    (let ((note (car *myfunc-bbdb-change-log-stack)))
      (setq note (concat (car note)
			 " changed for "
			 (car (cdr note))
			 " on "
			 (car (cdr (cdr note)))))
      (bbdb-annotate-notes record note 'change-log))
    (setq *myfunc-bbdb-change-log-stack (cdr *myfunc-bbdb-change-log-stack))))
(add-hook 'bbdb-change-hook 'myfunc-bbdb-change-log-hook)

(defun myfunc-bbdb-auto-notes-hook (record)
  (let (from)
    (condition-case nil
	(setq from 
	      (mail-extract-address-components
	       (mail-fetch-field "From"))))
    
    (if (or (and from (bbdb-search-simple (car from) (cdr from)))
	    (myfunc-bbdb-auto-create-p))
	(progn
	  (bbdb-auto-notes-hook record))
      (message "BBDB auto notice has ignored this message."))))
(add-hook 'bbdb-notice-hook 'myfunc-bbdb-auto-notes-hook)


;;; experimental
(setq bbdb-quiet-about-name-mismatches nil)
(setq bbdb-silent-running t)
(setq bbdb-use-alternate-names t)



設定例2 [cmail 8331] より(多少修正あり)
---------------------------------------
環境
  WindowsNT4.0+SP5
  GNU Emacs 20.4.1 (i386-*-nt4.0.1381)/Mule 4.1 (AOI)
  Meadow-1.11b1 (TSUYU)
  APEL 10.0
  FLIM 1.13.2
  SEMI 1.13.7
  cmail 2.60+19991208
  BBDB 2.00.06
  
---ここから---
;;; -*- Mode: Emacs-Lisp -*-
;;; ~/elisp/_bbdb.el

(setq mime-bbdb/use-mail-extr nil)
(eval-after-load "mail-extr" '(require 'mime-bbdb))
(require 'bbdb)
(bbdb-initialize)

(add-hook 'bbdb-notice-hook 'bbdb-auto-notes-hook)

;(setq bbdb-file (expand-file-name "~/.bbdb"))
;(modify-coding-system-alist 'file "\\.bbdb" 'ctext)
(if (fboundp 'modify-coding-system-alist)
    (modify-coding-system-alist 'file (expand-file-name bbdb-file) 'ctext))

(setq bbdb-north-american-phone-numbers-p nil
      bbdb/mail-auto-create-p 'bbdb-ignore-most-messages-hook
      bbdb-use-pop-up nil
      bbdb-pop-up-target-lines  3
      bbdb-new-nets-always-primary t
      bbdb-completion-display-record nil
      bbdb-pop-up-elided-display '(creation-date timestamp))

(setq bbdb-user-mail-names
      "yourname@all\\.your\\.domain\\.jp\\|yourname2@another\\.isp\\.ne\\.jp\\|yourname3@hi-tech\\.ac\\.jp")

(if (fboundp 'help-mode-setup)
    (progn
      (fset 'help-mode-setup-orig (symbol-function 'help-mode-setup))
      (defun help-mode-setup ()
        (if (null (string= (buffer-name (current-buffer))
                           bbdb-buffer-name))
            (help-mode-setup-orig)))))

(setq bbdb-auto-notes-alist
      '(("X-ML-Name" (".*" ML 0))
	("X-listname" ( ".*" ML 0))
	("X-Mailer" ( ".*" User-Agent 0))
	("X-Newsreader" ( ".*" User-Agent 0))
	("User-Agent" ( ".*" User-Agent 0))
	("X-URL" ( ".*" URI 0))
	("X-URI" ( ".*" URI 0))
	("Organization" ( ".*" Organization 0))
	))

;; for cmail
(autoload 'bbdb-insinuate-sendmail "bbdb" "Hook BBDB into sendmail")
(autoload 'bbdb-insinuate-cmail "bbdb-cmail" "Hook BBDB into cmail")
(add-hook 'cmail-startup-hook 'bbdb-insinuate-cmail)
(add-hook 'mail-setup-hook 'bbdb-insinuate-sendmail)
(add-hook 'mail-setup-hook 'bbdb-define-all-aliases)
;(add-hook 'cmail-mail-hook
;	  '(lambda () (local-set-key "\C-c\C-t" 'bbdb-complete-name)))

;; cmail終了時に~/.bbdbを自動的にsaveする．
(defun myfunc-bbdb-quit-all ()
  (let ((bbdb-buffer (get-buffer bbdb-buffer))
        (bbdb-view-buffer (get-buffer bbdb-buffer-name)))
    (if bbdb-buffer
        (progn
          (bbdb-save-db)
          (kill-buffer bbdb-buffer)))
    (if bbdb-view-buffer (kill-buffer bbdb-view-buffer))))
(add-hook 'cmail-quit-hook 'myfunc-bbdb-quit-all)

;; bbdb databaseが更新されるたびにsaveする．
;; 速度低下があるかも．
;(add-hook 'bbdb-after-change-hook
;          '(lambda () (bbdb-save-db nil)))
---ここまで---
