Gnus の web サイト: http://www.gnus.org/
ご質問等の宛先:
(concat [60 121 97 109 97 111 107 97 64 106 112 108 46 111 114 103 62])
目次:
最新の Gnus を使おう!
XEmacs では LANG=C で make
MIME ではない日本語のメールのデコード
送信するニュース記事の encoding に 8bit を強制しない(?)
送信時に使う charset の優先順位の指定
Message バッファを独立した frame にする
グループパラメータの操作の一例
gnus-other-frame コマンド
POP before SMTP
いろいろな色
不揃いな summary 行
ヘッダを FLIM でエンコードする
cl が load されないようにする
正しく digest フォワードができるようにする
フォワードする記事ヘッダの整形
名前が日本語の添付ファイル
名前が日本語の添付ファイル (その2)
charset の指定が無いパートをデコードして表示する
ご注意: 憎むべき spammer に対抗するため、実在のメールアドレスの 表記に簡単な elisp の式を使っていることにご注意下さい。
最新の Gnus を使おう!
なるべく最新の Gnus を使うことを強く勧めます。Gnus の開発には 世界中の多くの人が関わっていて、その内容は日々変化しています。 それは、ほとんどの場合に有用な改善であり、まれにバグが含まれて しまったとしても多くは次の日までに修正され、常に高い品質が維持 されているのです。まずは ding メーリングリストに参加しましょう。 英語が得意でなくたって気にする必要はありません。変な英語の文章 を投稿したからといって、それをからかったり非難する人はいません から大丈夫です。購読を申し込むには、本文に
subscribe dingと書いたメールを以下のアドレス宛に送って下さい。
(concat [100 105 110 103 45 114 101 113 117 101 115 116 64 103 110 117 115 46 111 114 103])
またはsubscribe ding <youraddress@example.com>と書いて、記事の配送先を指定することができます。最新の Gnus の入 手には CVS を使うのが便利です。login と checkout のやり方につい ては、以下の web ページを見て下さい。
http://www.gnus.org/distribution.htmlさて、この文章を読んで下さっている方のために、あまり一般的では ないメーリングリストの情報をお教えしましょう。本文に
subscribe ding-cvslogまたは
subscribe ding-cvslog Your Name <youraddress@example.com>と書いたメールを以下のアドレス
(concat [100 105 110 103 45 99 118 115 108 111 103 45 114 101 113 117 101 115 116 64 103 110 117 115 46 111 114 103])
に送ることによって、Gnus が CVS で変更されるたびに発信される log メッセージを受け取ることができます。
XEmacs では LANG=C で make
XEmacs はファイル最下端にある Local Variables: セクションの coding: 項で指定された coding-system を正しく処理することがで きません。そのため、特に日本語環境で byte-compile する際に Gnus のいくつかの .el ファイルに含まれている非 ascii 文字を誤っ てデコードして読み込み、それを元に .elc ファイルを生成してしま います。今のところ、多くは実害の無いものですが、環境変数 LANG を C にした環境で make を行なうことにより、coding: iso-8859-1 の指定については問題を回避することができます。
MIME ではない日本語のメールのデコード
MIME ではない日本語のメールを、ちゃんとデコードして表示させま す。Gnus はデフォルトでは iso-8859-1 でデコードするので、以下 のような設定が必要です。
(setq gnus-group-charset-alist
(cons '("^nnml:" iso-2022-jp-2) gnus-group-charset-alist))
これは nnml の例です。nnmh や nnfolder でも、以下のように追加す
れば使えるはずです。
(setq gnus-group-charset-alist
(append '(("^nnml:" iso-2022-jp-2)
("^nnmh:" iso-2022-jp-2)
("^nnfolder:" iso-2022-jp-2))
gnus-group-charset-alist))
グループ毎に切り替えることだってできます。
;; nnml:english.* 以外の nnml グループでは、MIME でないメールを
;; iso-2022-jp-2 でデコードして表示します。
(setq gnus-group-charset-alist
(append '(("^nnml:english\\." iso-8859-1)
("^nnml:" iso-2022-jp-2))
gnus-group-charset-alist))
グループの一つずつに対して設定したい場合は、グループパラメータの
charset を使えば良いでしょう。
なお、fj や japan のような主要な日本語のニュースグループでは、 MIME でない記事でもデフォルトで iso-2022-jp-2 が適用されますが、 それ以外のニュースグループについては次のように設定を追加すれば 良いでしょう。
;; nnml とニュースグループ local および sony をデフォルトでは
;; iso-2022-jp-2 でデコードして表示します。
(setq gnus-group-charset-alist
(append '(("^nnml:" iso-2022-jp-2)
("\\(^\\|:\\)local\\>" iso-2022-jp-2)
("\\(^\\|:\\)sony\\>" iso-2022-jp-2))
gnus-group-charset-alist))
送信するニュース記事の encoding に 8bit を強制しない(?)
筆者は宗旨を変えました
一方、初期の SMTP は 7bit データしか通さない仕様でした。しかし、 今どきそんなサーバがあるのでしょうか? もっとも、今でもヘッダ に 8bit データを含むことは危険でしょうけれども。
ただし、そのようなことを心配しなければならないのは、
ニュースで送信した記事がメールでも配送される Gmane ニュースグ ループで、ボディに 7bit encoding を強制する必要があると思う人 は、以下を使って下さい。
(eval-after-load "gnus-msg"
'(let ((newrule '("^gmane\\.[^,]*\\(,[ \t\n]*gmane\\.[^,]*\\)*$"
nil nil))
(newcdr (memq (assq 'message-this-is-mail
gnus-group-posting-charset-alist)
gnus-group-posting-charset-alist)))
(mapcar (lambda (elem)
(setq gnus-group-posting-charset-alist
(delq elem gnus-group-posting-charset-alist)))
newcdr)
(setq gnus-group-posting-charset-alist
(nconc gnus-group-posting-charset-alist
(cons newrule newcdr)))))
Gmane だけでなく、すべてのニュースグループで、ボディに 7bit encoding を強制する必要があると思う人は、以下を使って下さい。
(eval-after-load "gnus-msg"
'(if (boundp 'gnus-group-posting-charset-alist)
(let ((news (assq 'message-this-is-news
gnus-group-posting-charset-alist)))
(if news
(setcdr news '(nil nil))))))
送信時に使う charset の優先順位の指定
日本語には、ファイルの読み書きでは euc-jp や shift_jis を使う のに、メールやニュースでは伝統的に iso-2022-jp を使うという特 殊な事情があります。そのために、日本語の言語環境で Gnus を起動 すると `mm-coding-system-priorities' という変数に以下の charset のリストが登録され、
(iso-8859-1 iso-2022-jp utf-8)
メールやニュースで日本語のテキストに使われる charset は、この 優先順位で決定されます。日本語以外の言語環境でもこれを有効にし たい場合は、以下のように明示的に設定を行なって下さい。
(setq mm-coding-system-priorities '(iso-8859-1 iso-2022-jp utf-8))
Message バッファを独立した frame にする
送信用の message バッファを独立した frame にします。info の例 と違うのは、複数の message 用 frame を開くことができること、送 信後またはバッファを kill した後で自動的に frame が消えること、 それに article バッファが常に見える状態になっていることです。 (2005年04月28日改定)
Download the program which enables you to use multiple message frames.
グループパラメータの操作の一例
これはグループパラメータの操作に関する単なる例です。日本以外 の国や地域に住んでいる人が、fj や japan の記事は日本標準時で、 それ以外の記事は現地時刻で Date ヘッダを表示するようにします。
(setq gnus-treat-date-local 'head)
(setq gnus-parameters
`(("\\`fj\\.\\|\\`japan\\."
(gnus-treat-date-local nil)
(gnus-treat-date-user-defined 'head)
(gnus-article-time-format
(lambda (time)
(let ((ms (car time))
(ls (car (cdr time)))
(system-time-locale "C"))
(setq ls (+ ls ,(- (* 9 3600)
(car (current-time-zone)))))
(cond ((>= ls 65536)
(setq ls (- ls 65536)
ms (1+ ms)))
((< ls 0)
(setq ls (+ ls 65536)
ms (1- ms))))
(format-time-string "Date: %a %b %d %T %Y +0900"
(list ms ls))))))))
もし他の目的で `gnus-parameters' に何か設定してある場合には、そ
の設定を行なった後で以下のように追加すれば良いでしょう。
(setq gnus-parameters
(nconc
gnus-parameters
`(("\\`fj\\.\\|\\`japan\\."
(gnus-treat-date-local nil)
(gnus-treat-date-user-defined 'head)
(gnus-article-time-format
(lambda (time)
(let ((ms (car time))
(ls (car (cdr time)))
(system-time-locale "C"))
(setq ls (+ ls ,(- (* 9 3600)
(car (current-time-zone)))))
(cond ((>= ls 65536)
(setq ls (- ls 65536)
ms (1+ ms)))
((< ls 0)
(setq ls (+ ls 65536)
ms (1- ms))))
(format-time-string "Date: %a %b %d %T %Y +0900"
(list ms ls)))))))))
gnus-other-frame コマンド
`gnus-other-frame' コマンドは、すでに Gnus が走っている場合は
frame を pop up するだけの動作を行ないます。これを toolbar か
ら実行できるようにしておくと、画面がたくさんのウィンドウで埋まっ
てしまっている場合でも、確実に Gnus をディスプレイの表に出すこ
とができます。以下は Emacs と XEmacs の両方で使える設定の例で
す。
(cond ((featurep 'xemacs)
(setq toolbar-news-reader 'gnus)
(setcdr (assq 'gnus toolbar-news-commands-alist)
'gnus-other-frame)
(setq gnus-other-frame-parameters
'(width 80 height 48)))
((fboundp 'tool-bar-add-item)
(tool-bar-add-item "gnus-pointer"
'gnus-other-frame 'Gnus)
(setq gnus-other-frame-parameters
'((width . 80) (height . 48)))))
加えて、このコマンドを gnuclient で起動させることもできます。
現在のディスプレイに popup させる場合:
gnuclient -batch -f gnus-other-frame別のホストのディスプレイ "remote:0.0" に popup させる場合:
gnuclient -batch -eval '(gnus-other-frame nil "remote:0.0")'どちらの例も -batch オプションを使っていますが、これは余計な frame が生成されないようにするためです。しかしこれを使うと -display オプションが無視されてしまうので、後の例では `gnus-other-frame' の第二引数でディスプレイを指定しています。
なお、FSF Emacs 用の新しい gnuserv は以下の場所から入手できま す。
http://meltin.net/hacks/emacs/src/gnuserv-3.12.6.tar.gzそれから、以下は Emacs の実行時に cl を load しないようにするパッ チです。
ftp://ftp.jpl.org/pub/elisp/gnuserv-3.12.6-no-cl.patch
POP before SMTP
ISP の SMTP サーバーに接続してメールを送信する場合に、それよ り前の一定時間内に同じ ISP の POP サーバーに接続して認証を行なっ ておかなければならないことがあります。要はメールを送信する前に 新着メールのチェックまたは取り込みを行なえば良いのですが、とも するとそれを忘れてしまって送信に失敗することがあるでしょう。
従来の `smtpmail-send-it' の代わりに `message-smtpmail-send-it' を使って下さい。
(setq message-send-mail-function 'message-smtpmail-send-it)
そして次の hook を設定します。
(add-hook 'message-send-mail-hook 'mail-source-touch-pop)
この `mail-source-touch-pop' という関数は `mail-sources' に設定
されているすべての POP サーバーに、単に接続をオープンしてすぐに
閉じるという動作を行ないます。`mail-sources' に複数の POP サーバー
(同じサーバーでアカウントが違う場合も含む) を設定しているが、メー
ルの送信前に接続するのは一つだけで良い場合には、その source を以
下のように設定して下さい (`mail-sources' とは括弧の深さが違うこ
とにご注意)。
(setq mail-source-primary-source
'(pop :server "my.pop.server"
:user "user-name" :password "secret"))
さて、この例のように source にパスワードも含めておくと POP サー
バーに接続するときにいちいち入力を要求されなくて楽なのです
が、
(let* ((pop-server "my.pop.server")
(pop-user "user-name")
(pop-passwd (read-passwd "POP password for %s@%s: "
pop-user pop-server)))
(if (featurep 'xemacs)
(progn
(require 'efs)
(efs-set-passwd pop-server pop-user pop-passwd)
(setq pop3-read-passwd
`(lambda (prompt)
(efs-get-passwd ,pop-server ,pop-user))))
(require 'ange-ftp)
(ange-ftp-set-passwd pop-server pop-user pop-passwd)
(setq pop3-read-passwd
`(lambda (prompt)
(ange-ftp-get-passwd ,pop-server ,pop-user)))))
いろいろな色
最近の XEmacs では、うまくいかないようです。興味がある人は 旧版 を参照して下さい。
不揃いな summary 行
Summary バッファに表示される日本語を含む行と ascii だけの行が 不揃いになる場合があります。
r [ 5: 無料プレゼント ] 未承諾広告※
r [ 41: Robert Morelli ] Some questions about 21.4.8
対策は次の通りです。
(setq gnus-use-correct-string-widths t)
これは Gnus の版によっては XEmacs でだけデフォルトで t になって
いるので、まずは値がどうなっているか確認して下さい。なお、この値
を変更したときは、以下の式を eval (*scratch* バッファにコピーし
て、行末で C-j をタイプ) する必要があるかもしれません。
(gnus-update-format-specifications t)
ヘッダを FLIM でエンコードする
おそらく v0.3 以上の No Gnus を使っているならば、この項は無意 味です。それ以前の Gnus では、ヘッダに長い日本語が書かれていた 場合に、あまり美しいエンコードを行なってくれません。これは Gnus に付属している rfc2047.el のエンコーダに代わって、FLIM を 使ってエンコードする方法です。
;; Use eword-encode to encode message header in Gnus.
(eval-after-load "mail-parse"
'(progn
(autoload 'mime-encode-header-in-buffer "eword-encode" nil t)
(defalias 'mail-encode-encoded-word-buffer
(lambda nil
(mime-encode-header-in-buffer t)))
;; (defadvice eword-encode-text (after downcase-charset activate)
;; "Convert `charset' into lower case and `encoding' into upper case."
;; (require 'eword-decode)
;; (if (and ad-return-value
;; (string-match eword-encoded-word-regexp
;; ad-return-value))
;; (setq ad-return-value
;; (concat
;; (downcase (substring ad-return-value
;; 0 (match-beginning 3)))
;; (upcase (substring ad-return-value
;; (match-beginning 3)
;; (match-beginning 4)))
;; (substring ad-return-value
;; (match-beginning 4))))))
))
Gnus のエンコーダに戻すには、以下のコメントを外して eval して下
さい。
;;(defalias 'mail-encode-encoded-word-buffer 'rfc2047-encode-message-header)
cl が load されないようにする
この項は用が無くなりました。
正しく digest フォワードができるようにする
複数の記事にマークを付けて一度にまとめてフォワードする場合、 または gnus-uu-digest-(mail|post)-forward コマンド (キーは SOm か SOp) を使ってフォワードする場合に、第一パートに日本語が含ま れているとエンコードされずに出て行ってしまうため、相手は読むこ とができません。以下はこの問題を解決するための advice です (ding で言ったんだけど相手にしてもらえなかったの ;_;)。
(defadvice gnus-uu-digest-mail-forward
(after simplify-summarized-topics-part activate)
"Simplify summarized topics part."
(if (re-search-forward (concat "
\\(" (regexp-quote mail-header-separator) "\\)
\\(<#multipart type=digest>\\)
<#part type=message/rfc822>
Subject: Topics
") nil t)
(replace-match "\n\\1\n\\2\n")))
フォワードする記事ヘッダの整形
メッセージをフォワードする際に Gnus はデフォルトで元記事のヘッ ダに含まれている encoded word をデコードしてくれるのですが、 ascii と日本語が混在していると変なところで折り返されて見苦しく なることがあります。これは encoded word に改行の制御機能が無い MIME の宿命で、しかも Gnus のユーザ/開発者には英語しか使わない 人が多いので本体で対策するのは諦め、代わりに以下の advice で整 形するようにしてみました。
(defadvice mime-to-mml (after unfold-encoded-headers activate)
"Unfold encoded headers."
(save-excursion
(save-restriction
(message-narrow-to-head)
(goto-char (point-max))
(let (end start prev)
(while (not (bobp))
(setq end (point-marker))
(while (progn
(forward-line -1)
(memq (char-after) '(?\t ?\ ))))
(setq start (point))
(if (re-search-forward "[^\000-\377]" end t)
(progn
(insert-before-markers
(mapconcat
'identity
(delete "" (split-string
(prog1
(buffer-substring start end)
(delete-region start end))))
" ")
"\n")
(goto-char start)
(setq prev nil)
(while (re-search-forward ", ?" end t)
(if (and prev
(> (current-column) 76))
(progn
(delete-region (goto-char (car prev))
(cdr prev))
(insert ",\n ")
(setq prev nil))
(setq prev (cons (match-beginning 0)
(match-end 0)))))
(goto-char (1- end))
(if (and prev
(> (current-column) 76))
(progn
(delete-region (goto-char (car prev))
(cdr prev))
(insert ",\n ")))
(goto-char start))))))))
名前が日本語の添付ファイル
Gnus で名前が日本語の添付ファイルを送信すると、ファイル名が RFC2231 の勧告に従ってエンコードされます。これは世界中のみんな で決めた正しいやり方です。しかしいまいましいことに、それを無視 して勝手なフォーマットを使っている一団がおり、彼らは Gnus で送っ た添付ファイルの名前を解釈しません。rfc2047-encode-parameter は Gnus が不当な非難を浴びるのを避けるために作ったエンコーダで す。一方 Gnus はこの変則仕様を扱うことができます。これには v0.3 以上の No Gnus を使う必要があります。
(defalias 'mail-header-encode-parameter 'rfc2047-encode-parameter)
名前が日本語の添付ファイル (その2)
日本語の添付ファイル名が特にエンコードされず、通常のテキスト と同様に iso-2022-jp で送られてくることもあります。そんな場合 に Gnus は生の iso-2022-jp のデータをファイル名として扱うので、 表示された名前は読めないし、ファイルとしてセーブするにも困って しまいます。
そういうときの対策の一つとして、Gnus に記事をエンコードし直さ せることが有効な場合があります。操作は summary バッファで `e'、 次にarticle バッファで `C-c C-c' です。
それとは別にもう一つ、以下は Gnus の MIME デコーダに前もって ファイル名をデコードさせてしまうための advice です。
(defadvice rfc2231-parse-qp-string (after decode-filename activate)
"Decode `filename' and `name' parameters by `undecided'.
This advice will do it only when a name contains 7bit characters only."
(let ((param (or (assq 'filename ad-return-value)
(assq 'name ad-return-value)))
name)
(when (and param
(setq name (cdr param))
(string-match "\\`[\000-\177]+\\'" name))
(setcdr param (decode-coding-string name 'undecided)))))
この advice を解除するには、M-x ad-unadvise に続いて関数名と して rfc2231-parse-qp-string を指定、再び有効にするにはこの定 義の最後の閉じ括弧の後ろで `C-x C-e' です。
charset の指定が無いパートをデコードして表示する
有沢さんから 2005年2月2日にいただいた情報です。以下のような設 定を行なっておくと、summary バッファで `0 g' などをタイプする と記事の本文を、article バッファにある各パートのボタンの上で `0 i' などをタイプすることによってパートの中身を、それぞれ番号 に応じた coding system でデコードして表示することができます。
(setq gnus-summary-show-article-charset-alist
'((0 . undecided)
(1 . shift_jis)
(2 . iso-2022-7bit)
(3 . euc-japan)
(4 . utf-8)))
パートが disposition=inline だった場合は、デフォルトではボタ ンが表示されませんが、summary バッファで `M-t' をタイプすれば 現れます。