読者です 読者をやめる 読者になる 読者になる

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で二重に変換しても大丈夫だったので、 仮にこの現象がバグで将来修正された場合、この対処が残ったままでも正常に動作はすると思います。

その他

  • Emacsは、GNU Emacs 24.2.1 (i386-mingw-nt5.1.2600) of 2012-12-08 on GNUPACK です。
  • Gnusは、Gnus v5.13 です。