MeadowのGnusでGmail
GmailをずっとWebで使っていたんだけど、本格的に読み書きするにはつらいので、ちゃんとしたメールクライアントを導入することにした。素直にThunderbirdをインストールしてもよかったんだけど、GnusGmailなんてページを見つけて、簡単な設定でEmacsのGnusでGmailを利用できるみたいなので、MeadowのGnusで挑戦してみたんだけど死ぬほどはまった。
Emacsで暗号化された通信路を確立するには、SSLならopenssl、TLSならgnutlsといった外部コマンドが必要だ。これらはCygwin用のパッケージが存在するのでインストールすればいい。MeadowからCygwinのコマンドを実行できるように、C:\cygwin\binに実行パスを通すのは基本。あとは先のページの通りに設定すれば、適切にコマンドが呼ばれて通信が行われる。これでIMAP over SSLはうまくいくのだが、SMTP over TLSの途中でMeadowが固まってしまう。
この原因は、gnutls-cliがSIGALRMを受け取らないとTLSのネゴシエーションに入らないことにある。starttls.elでは(signal-process (process-id process) 'SIGALRM)として、SIGALRMを送ったつもりになっているのだが、MeadowからCygwinのプロセスにこの方法でSIGALRMを送ることはできない。この問題を解決するには、以下のようにsignal-processにadviceを設定して、CygwinのkillコマンドでSIGALRMが送られるようにすればよい。
(defadvice signal-process (around call-kill-command activate) (let ((process (ad-get-arg 0)) (signal (ad-get-arg 1))) (or (numberp process)(setq process (process-id process))) (if (eq signal 'SIGALRM) (setq ad-return-value (call-process "C:\\cygwin\\bin\\kill.exe" nil nil nil "-ALRM" (format "%d" process)))
それとMeadow 3だと日本語のフォルダのUTF-7のデコードに失敗するので、Gnusのutf7.elにちょっとしたパッチを当ててやる必要がある。参考にしたのはこのメール。
(defconst utf7-utf-16-coding-system (cond ((mm-coding-system-p 'utf-16-be-no-signature) ; Mule-UCS 'utf-16-be-no-signature) ((and (mm-coding-system-p 'utf-16-be) ; Emacs 21.3, Emacs 22 (BOM?) ;; Avoid versions with BOM. (= 2 (length (encode-coding-string "a" 'utf-16-be)))) 'utf-16-be) + ((and (mm-coding-system-p 'utf-16be) ; Emacs 22 and later + ;; Avoid versions with BOM. + (= 2 (length (encode-coding-string "a" 'utf-16be)))) + 'utf-16be) ((mm-coding-system-p 'utf-16-be-nosig) ; ? 'utf-16-be-nosig)) "Coding system which encodes big endian UTF-16 without a BOM signature.")