GnusでIMAPのメールを扱う時、メールを日本語フォルダに移動できない
最近、GnusでGmailを扱おうと試みています。
グループモードにGmailのラベルを表示させ、そのラベルのメール一覧をサマリーモードで表示することはできました。
ところが、メール一覧からメールを「ごみ箱」に移動しようとすると、以下のエラーが表示されてしまいました。
Couldn't Move article 703: BAD Invalid Arguments: Failed to parse UTF7 string
エラー内容から、ラベルが日本語なのが原因というのはわかりましたが、
どこかで、日本語対応してるみたいな情報を見た記憶があったので、何とかならないかなぁと、
ソース見たりデバッグしたりした結果、以下の対処で可能になりました。
対処
以下のアドバイスをかますことで上手くいきました。
(defadvice nnimap-request-move-article (before decode-move-group activate) (when (ad-get-arg 5) (ad-set-arg 5 (nnimap-decode-gnus-group (ad-get-arg 5)))))
対処内容について
メールを移動(gnus-summary-move-article)を実行すると、nnimap-request-move-articleが呼ばれます。
で、この関数の定義が以下です。
(deffoo nnimap-request-move-article (article group server accept-form &optional last internal-move-group) (setq group (nnimap-decode-gnus-group group)) (with-temp-buffer (mm-disable-multibyte) (when (funcall (if internal-move-group 'nnimap-request-head 'nnimap-request-article) article group server (current-buffer)) ;; If the move is internal (on the same server), just do it the easy ;; way. (let ((message-id (message-field-value "message-id"))) (if internal-move-group (let ((result (with-current-buffer (nnimap-buffer) (nnimap-command "UID COPY %d %S" article (utf7-encode internal-move-group t))))) (when (car result) (nnimap-delete-article article) (cons internal-move-group (or (nnimap-find-uid-response "COPYUID" (cadr result)) (nnimap-find-article-by-message-id internal-move-group message-id))))) ;; Move the article to a different method. (let ((result (eval accept-form))) (when result (nnimap-possibly-change-group group server) (nnimap-delete-article article) result)))))))
groupに現在のフォルダ名、internal-move-groupに移動先のフォルダ名が渡されます。
groupの値はnnimap-decode-gnus-groupという関数で変換してますが、internal-move-groupの値はそのままです。
nnimap-decode-gnus-groupで検索すると、どの関数でも渡されたフォルダ名を
nnimap-decode-gnus-groupで変換しているようでした。
なので、internal-move-groupの値をnnimap-decode-gnus-groupで変換する処理をアドバイスで追加したら上手くいきました。
nnimap-request-move-articleの仕様が理解できていないので断言はできないんですが、 ぶっちゃけバグなんじゃないかなぁという気が。
Gnusの開発元に問い合わせるのが良いのでしょうが、私は急いでアクションを起こすつもりがなかったので、
とりあえず現象と対処だけまとめた次第です。
ちなみに、nnimap-decode-gnus-groupで二重に変換しても大丈夫だったので、
仮にこの現象がバグで将来修正された場合、この対処が残ったままでも正常に動作はすると思います。