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.")