Gnus でメールの読み書き

Emacs 内でメールを読み書きしようとメーラの設定をしてみました。
以前一時期 Wanderlust を使っていましたが、今回は Wanderlust を選択せず gnus にしました。
選択理由は、最初から Emacs に入っているからです(また、高機能であるという話も耳にするし)。

Gnus とは

ニュースリーダです。ニュースリーダって何といっても自分もよく知らないです。
NNTP というプロトコルを使って配信されるネットニュースを読むためのソフトウェアみたいです。
Gnus には、その機能の1つとして、メールを読む機能があります。


Gnus 自体は、随分前から Emacs に標準で入っています。少くとも 21.4 には既に入っていました。
Emacs 24 では、w3m を使った html レンダラが実装されてたりとかみたいです。
# その機能を使ってるかは知りませんが、実際に Twitter から送られてくる HTML メールも崩れる事なく見れました。


以下、自分が行った設定や普段やるであろう操作について書きます。
何か間違っている部分やもっと良い方法等あるのであれば、教えて頂けると幸いです。

初期設定

はじめての起動時にする初期設定
# 記憶で書いてるので間違ってるかもです…。でもプロセスとしてはこれでやりました。

  1. M-x gnus で gnus を起動
  2. 「^」キーでサーバモードへ以降
  3. 「{nnimap:gmail}」を選択
  4. GMail のラベル(Inbox 等)が全て表示されるので、購読したい項目を選択し、「u」を押し登録する。
  5. 購読したい項目の登録が終わったら、「q」を2度押して、グループモードに戻る。
  6. 購読した項目が追加されているので、「RET」で選択すれば読む事ができる。

これ以降は、M-x gnus した直後から購読した項目が読めるようになっている。
# M-x gnus をすると imap ユーザ名やパスワードを聞かれる。
# 現状における24の場合、ユーザ名も聞かれる。23.3 の場合は聞かれない。たぶん一時的なもの?

主なキー操作

詳しくは、info を参照。
# でかすぎて探しづらいけれども…。

グループモード

ラベル(メールボックス?)の一覧を表示

  • g … 全ラベルの更新取得
  • M-g … ポイント上にあるラベル(特定のラベル)のみの更新を取得
  • RET … ポイント上のラベルにあるメール一覧を表示(サマリモードへ)
  • m … メールを作成
  • G G … ポイント上のラベル内にあるメールを検索
  • q … gnus の終了
サマリモード

選択したラベル(メールボックス)内にあるメールの一覧を表示

  • RET … 選択したメールを読む
  • n … 次のメールへ
  • m … メールを作成
  • r … 送信者へ返信
  • S W … メールを引用つきで全員へ返信
  • t … 詳細にヘッダの内容を表示するかどうかを切り替え
  • A T … スレッド全てのメールが表示されていないメールもそのスレッドのメールを取得・表示
  • B DEL … メールの削除(GMail ではアーカイブ)
  • O m (o 等)… メールの保存
  • q … グループモードへ戻る
メッセージモード

メールの作成

  • C-c C-k … 作成途中のメールを破棄
  • C-c C-c … メールの送信
  • C-c C-a … 添付ファイルの添付
  • C-c C-m o … PGP を使って、電子暗号化
  • C-c C-m p … PGP/MIME を使って、電子暗号化
  • C-M-i … To 欄で押すと、メールアドレスの補完(bbdb の機能)
  • q … グループモードへ戻る
アーティクルモード

メールの参照

  • o … 添付ファイルの保存
  • RET … 添付ファイルのインライン表示(表示可能であれば)
  • C … 添付ファイルの文字コード選択(添付がテキストファイルだったときのインライン表示時等)
  • i … 添付ファイルを現在のバッファ(アーティクルモード)に挿入(インライン表示)

感想

使えるようになるまではまりました。おおいにはまりました。
だいたい感じた事です。

  • 動作がちょっと重い
  • スレッド表示でメールの読み書きイイ
  • たいていのやりたいと思った事は、その機能自体や、その機能を実現するための枠組みがまずある
  • けど、非常に情報を探しづらくて、はまる。良く言えば機能が膨大すぎる

こんな感じです。使ってるうちにまた不満等出るかもしれませんが、
読むには不自由しなくなったので、これで生活してみようかなと思ってます。

設定

最後に自分の設定のせます。以下のようになりました。GMail + Imap です。
# 正規表現っぽくなってないメールアドレスは、なんとなくスパム対策に隠しました。それ以外はそのまま。


設定自体は、そんなにたいした事はしてはいないです。
良い設定とかあったら教えてください。

(require 'gnus)
(load "gnus-setup")
(require 'gnus-start)
(require 'gnus-art)
(require 'auth-source)
(require 'starttls)
(require 'nnimap)
(require 'nnir)

;; Username and mail address.
(setq user-full-name "HAMANO Kiyoto"
      user-mail-address "ほげほげ@gmail.com")

;; for reading mail by imap.
(setq gnus-select-method
      '(nnimap "gmail"
	       (nnimap-address "imap.gmail.com")
	       (nnimap-server-port 993)
	       (nnimap-authinfo-file "~/.emacs.d/.authinfo")
	       (nnimap-stream ssl)))

;; for sending mail.
(setq message-send-mail-function 'smtpmail-send-it
      send-mail-function 'smtpmail-send-it
      smtpmail-starttls-credentials '(("smtp.gmail.com" 587 nil nil))
      smtpmail-auth-credentials '(("smtp.gmail.com" 587
				   "ほげほげ@gmail.com" nil))
      smtpmail-default-smtp-server "smtp.gmail.com"
      smtpmail-smtp-server "smtp.gmail.com"
      smtpmail-smtp-service 587
      ;; Cc: and Bcc: to header of message-mode.
      message-default-mail-headers "Cc: \nBcc: \n")

;; customize `gnu-summary-line-foramt'.
(defvar my-gnus-mail-addres-regex "khiker\\.mail\\(\\+[^@]+\\)?@gmail\\.com"
  "*Regular expression of mail address that indicates for me.")

;; from http://emacs.wordpress.com/2007/10/07/gmail-envy/
;; and customize it.
(defun gnus-user-format-function-j (headers)
  "Return a \">\" if variable `my-gnus-mail-addres-regex' matches in To,
CC or Bcc. If not matched, return a \" \"."
  (cond
   ((or (string-match my-gnus-mail-addres-regex
		      (gnus-extra-header 'To headers))
	(string-match my-gnus-mail-addres-regex
		      (gnus-extra-header 'Cc headers))
	(string-match my-gnus-mail-addres-regex
		      (gnus-extra-header 'BCc headers)))
    ">")
   (t
    " ")))
(setq gnus-summary-line-format "%uj%U%R%I%(%[%-23,23f%]%) %s\n")

;; gnu-topic-mode by default
(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)

;; MUA is gnus.
(setq read-mail-command 'gnus
      mail-user-agent 'gnus-user-agent)

(setq ;; Do not use mailcrypt.
      gnus-use-mailcrypt nil
      gnus-check-new-newsgroups nil
      gnus-use-cache t
      gnus-cache-directory "~/Mail/cache/"
      gnus-cache-enter-articles '(ticked dormant read unread)
      gnus-cache-remove-articles nil
      gnus-cacheable-groups "^nnimap"
      gnus-posting-styles '((".*" (name "HAMANO Kiyoto")))
      ;; Do not split the mail when mail was large.
      mime-edit-split-message nil
      ;; treates wide character
      gnus-use-correct-string-widths t
      ;; Do not ask online or not.
      gnus-agent-go-online t
      ;; do not goto cursor to unread group.
      gnus-group-goto-unread nil
      ;; show also user-agent.
      gnus-visible-headers (concat gnus-visible-headers "\\|^User-Agent")
      ;; extra headers to parse.
      gnus-extra-headers '(To Newsgroups X-Newsreader
			      Content-Type CC User-Agent Gnus-Warning)
      nnmail-extra-headers gnus-extra-headers
      ;; If member of thread that includes new article has old
      ;; article, grab old articles to display thread.
      gnus-fetch-old-headers t)

;; Display always 500 articles at least in summary buffer.
(defvar my-gnus-summary-maximum-articles 500
  "*The recent X number of articles that displayed in summary-buffer
by use `gnus-topic-select-group' (RET) in gnus-group-buffer. The default
value is 500. The recent 500 articles are always displayed at least.")
(setq gnus-alter-articles-to-read-function
      #'(lambda (group articles)
	  (let ((active (gnus-active group)))
	    (delete-dups
	     (append articles
		     (gnus-uncompress-range
		      (cond
		       (my-gnus-summary-maximum-articles
			;; show `my-gnus-summary-maximum-articles' messages.
			(cons (max (car active)
				   (- (cdr active)
				      my-gnus-summary-maximum-articles
				      -1))
			      (cdr active)))
		       (t
			;; show always all messages.
			active))))))))

;; Gnus + EasyPG
(require 'epg-config)
(require 'gnus-msg)
(require 'mml2015)
(setq gnus-message-replysign t
      gnus-message-replyencrypt t
      gnus-message-replysignencrypted t
      mm-verify-option 'always
      mm-decrypt-option 'always
      mml2015-use 'epg
      mml2015-encrypt-to-self t
      mml2015-always-trust nil
      mml2015-cache-passphrase t
      mml2015-passphrase-cache-expiry '36000
      mml2015-sign-with-sender t
      gnus-buttonized-mime-types '("multipart/alternative"
				   "multipart/encrypted"
				   "multipart/signed"))

;; mail contacts list manager.
(require 'bbdb)
;; take mail address automatically
(setq bbdb/news-auto-create-p t)
;; add address automatically
(setq bbdb-always-add-addresses t)
;; do not use popup
(setq bbdb-use-pop-up nil)
;; my mail address
(setq bbdb-user-mail-names "khiker\\.mail@gmail\\.com")
(bbdb-initialize 'gnus 'message)

更新時刻

2011/05/08/22:45