4
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Spacemacsに乗り換えてみた(5)メーラ編

Last updated at Posted at 2018-10-04

はじめに

  • Spacemacsでメールを読み書きできるようにした
  • mu4eを使うことにした
  • あとでいろいろ追記するつもりだけど、とりあえず送受信できるようになった

設定の方針

  1. メール受信 : GmailからIMAPで受信する(offlineimapを使う)
  2. メール送信 : GmailのSMTPを使って送信する(msmtpを使う)
  3. メール検索 : muを使って受信したメールを検索できるようにする
  4. メーラ : mu4eを使ってEmacs上でメールを受信・送信できるようにする

インストールしたもの

$ brew install offlineimap
$ brew install msmtp
$ brew install mu --with-emacs
  • offlineimap : IMAPを使ってメールを受信するコマンド
  • msmtp : メールを送信するコマンド
  • mu : メールのインデックスを作成したり、検索するコマンド。--with-emacsオプションをつけてインストールする

Gmailのアプリパスワードの作成

  • GmailIMAPSMTPを使うためにアプリパスワードを作る必要がある
  • Gmailヘルプ - アプリパスワードでログインを参考に作成する
    • アプリを選択その他(名前を入力)EmacsMu4eとかなんでもOK)
    • 端末を選択:入力不要(というか、できなくなる)
    • 生成
    • パスワード:16桁の文字列(ターミナルで$ pwgen -s 16 1で自動生成した)

メール受信:OfflineIMAPの設定

  • GmailIMAPサーバを使ってメールを受信できるようにした
  • 設定ファイル ~/.offlineimaprc を新規に作成した
  • 設定内容はGitLab snippet - offlineimapにまとめた

.offlineimaprcのサンプルの場所

$ locate offlineimap.conf
/usr/local/etc/offlineimap.conf
/usr/local/etc/offlineimap.conf.default
/usr/local/etc/offlineimap.conf.minimal
  • OfflineIMAPをインストールしたら、上記の設定サンプルもインストールされてた
  • それぞれのファイルの使い方は、中に書いてあるのでよく読む

.offlineimaprcの作成

$ cp -n /usr/local/etc/offlineimap.conf.minimal ~/.offlineimaprc
$ chmod 600 ~/.offlineimaprc
  • minimalな設定ファイルをもとに、自分用に書き直すことにした
  • ファイルのパーミッションは600にする

メール送信:MSMTPの設定

  • GmailSMTPサーバを使ってメールを送信できるようにした
  • 設定ファイル ~/.msmtprc を新規に作成した
  • 設定する内容はGitLab snippet - msmtpにまとめた

送信テスト

設定ファイルが正しく動くのか、コマンドラインでテストした

送信テスト
$ msmtp -t ## 入力待ち状態になるので、下記の内容を入力する
To: 宛先を入力する(例:自分のGmailアドレス)
From: 送信元を入力する(例:自分のGmailアドレス)
Subject: 件名を入力する(例:MSMTPの送信テストだよ)
本文を入力する
(例:
 これはMSMTPの送信テストだよ。
 自分のGmail → 自分のGmailに送信)
# (C-dで終了すると送信される)
  1. $ msmtp -tで起動
  2. 宛先を入力する:To:から自分で入力する
  3. 送信元を入力する:From:から自分で入力する(省略した場合、設定ファイルのaccount defaultで指定したアドレスになる)
  4. 件名を入力する:Subject:から入力する(例:Subject: MSMTPの送信テストだよ
  5. メールの送信:C-dで終了するとメールが送信される(送信のキャンセルはC-c
  6. 宛先に指定したメールボックスを確認する

メール検索:muの設定

  • 特に設定することはない

mu4eレイヤーの読み込み

(mu4e :variables
      mu4e-installation-path "/usr/local/Cellar/mu/1.0/share/emacs/site-lisp/mu/mu4e/")
  • spacemacs - mu4eに書いてあるとおりにする
  • $ locate mu4e.elなどしてmu4e.elがあるディレクトリを探して設定する

mu4eのユーザ設定

(defun dotspacemacs/user-config()
    ...
    ;; recentf
    (add-to-list 'recentf-exclude (expand-file-name "~/Maildir") )
    
    ;; mu4e
    (use-package mu4e
        :load-path "/usr/local/Cellar/mu/1.0/share/emacs/site-lisp/mu/mu4e/"
        :config
        (setq mu4e-drafts-folder "/Gmail/[Gmail].Drafts") ;; /drafts
        (setq mu4e-sent-folder "/Gmail/[Gmail].Sent Mail") ;; /sent
        (setq mu4e-trash-folder "/Gmail/[Gmail].Trash") ;; /trash
        (setq mu4e-attachment-dir "~/Downloads")
        (setq mu4e-update-interval (* 60 5)) ;; nil
        ;;(setq mu4e-use-fancy-chars t)
        (setq mu4e-headers-visible-lines 20) ;; 10
        (setq mu4e-headers-skip-duplicates t) ;; t
        (setq mu4e-sent-messages-behavior 'delete) ;; 'sent
        (setq mu4e-get-mail-command "offlineimap -o") ;; true
        (setq message-kill-buffer-on-exit t) ;; nil
        ;; mu4e - msmtp
        (setq message-send-mail-function 'message-send-mail-with-sendmail) ;; sendmail-query-once
        (setq sendmail-program "msmtp")  ;; /usr/sbin/sendmail
        ;;(setq message-sendmail-extra-arguments)
        ;;(setq message-sendmail-f-is-evil t) ;; nil

        ;; mu4e - multiple mail accounts
        (setq mu4e-contexts
              `( ,(make-mu4e-context
                   :name "work"
                   :enter-func (lambda () (mu4e-message "Entering WORK context"))
                   :leave-func (lambda () (mu4e-message "Leaving WORK context"))
                   :match-func (lambda (msg) (when msg (mu4e-message-contact-field-matches msg :to "YOUR_MAIL_ADDRESS@WORK")))
                   :vars '( (user-mail-address . "YOUR_MAIL_ADDRESS@WORK")
                            (user-full-name . "YOUR_NAME")
                            (mu4e-compose-signature . (concat "YOUR_SIGNATURE_LINE01\n"
                                                              "YOUR_SIGNATURE_LINE02\n"
                                                              "YOUR_SIGNATURE_LINE03"
                                                       )
                       ))
                   )
                 ,(make-mu4e-context
                   :name "home"
                   :enter-func (lambda () (mu4e-message "Switch to the Gmail context"))
                   :match-func (lambda (msg) (when msg (mu4e-message-contact-field-matches msg :to "YOUR_ADDRESS@GMAIL")))
                   :vars '( (user-mail-address . "YOUR_ADDRESS@GMAIL")
                            (user-full-name . "YOUR_NAME (Gmail)")
                            (mu4e-compose-signature . (concat "YOUR_SIGNATURE_LINE01\n"
                                                              "YOUR_SIGNATURE_LIEN02"
                                                      )
                           ))
                   )
                 )
              )
        )
    ...
)
  • 基本的な設定内容はGitLab snippet - emacs-mu4eにまとめた
  • 以上は、dotspacemacs/user-config に書いた設定から抜粋した
    • 設定に必要な箇所だけ抜き出してきたけれど、カッコの数があってるか心配・・・これを参考にする際は、うまいことやってください
    • smartparensを有効にすれば、マッチしてるカッコを教えてくれる

recentf-exclude~/Maildir/を追加した

(add-to-list 'recentf-exclude (expand-file-name "~/Maildir/") )
  • mu4eをしばらく使ってみると分かるが、開いたメールもrecentfに追加されてしまう
  • メールのファイル本体を直接開くことはまずないため、除外リスト(recentf-exclude)に追加した

use-packageで囲む理由

  • 複数アカウントを設定する箇所(mu4e-contexts)で下記のエラーがでた
    • (Spacemacs) Error in dotspacemacs/user-config: Symbol’s function definition is void: make-mu4e-context
  • このエラーで検索したらIssue #9176がヒット。with-eval-after-loadしないといけないみたい。
  • with-eval-after-loadの代わりにuse-pakcageで囲むことにした
    • そのままだとmu4eの場所が分からないので、:load-pathでディレクトリを指定する
    • mu4eレイヤーの設定のときと重複するが、こうしておけば動くのだからよしとする

送信済みフォルダの設定

(setq mu4e-drafts-folder "/Gmail/[Gmail].Drafts") ;; /drafts
(setq mu4e-sent-folder "/Gmail/[Gmail].Sent Mail") ;; /sent
(setq mu4e-trash-folder "/Gmail/[Gmail].Trash") ;; /trash
  • mu4e-maildirに対する相対パスで設定する
  • OfflineIMAPで設定したlocalfolders = ~/Maildir/Gmail/に合わせるようにする
    • GmailのSMTPを使わない場合は、デフォルトのまま使えばよい
    • ディレクトリが存在しない場合は、必要になったときにEmacsが聞いてくる

添付ファイルを保存するフォルダの設定

(setq mu4e-attachment-dir "~/Downloads")
  • 添付ファイルは~/Downloadsに保存することにした

送信済みメールの保存方法

(setq mu4e-sent-messages-behavior 'delete) ;; 'sent
  • Gmailがよきに取り計らってくれるそうなので、'deleteもしくは'trashにしておけばよいらしい
  • GmailのSMTPを使わない場合は、デフォルトの'sentにして、mu4e-sent-folderに保存する。'deleteになっていると、送信したメッセージがどこかにいってしまう(というか、消えてしまう)ので、とても不便だった

自動更新のタイミングを設定

(setq mu4e-update-interval (* 60 5)) ;; nil
  • デフォルトだと、インデックス(mu index)の自動更新はされない
  • mu4e-update-intervalに秒数を指定する
  • OfflineIMAPの更新が3分間隔なので、こっちは5分間隔にした(適当)
    • あとで変更するときに分かりやすいように、60 × 5秒(=5分間隔)と書いた

Headers viewの設定

;;(setq mu4e-use-fancy-chars t)
(setq mu4e-headers-visible-lines 20) ;; 10
(setq mu4e-headers-skip-duplicates t) ;; t
(setq mu4e-headers-date-format "%F %T")
(setq mu4e-headers-fields '((:human-date . 20)
                            (:flags . 6)
                            (:mailing-list . 10)
                            (:from . 22)
                            (:subject)))

mu4e-headers-visible-lines

  • Headers viewに表示させる行数を設定
  • デフォルト(10行)だと少なく感じたので20行に変更した

mu4e-headers-skip-duplicates

  • 重複したメッセージの表示方法
    • Gmail + OfflineIMAPだと、ラベル管理の仕組みからメッセージが重複してしまうので、スキップさせることにした
  • Vでトグルできる
  • Message-IDを見て、重複してるかどうかを判断している

メール受信日時の表示方法の変更

  • デフォルトではtodayの場合は時刻、olderの場合は日付を表示するようになっている
    • todaymu4e-headers-time-format(時刻)
    • oldermu4e-headers-date-format(日付)
  • しばらく使っているうちに、olderなメッセージにも受信時刻がほしいなと感じたのででmu4e-headers-date-formatを変更した
    • mu4e-headers.el内のmu4e-headers-date-formatを読むと、format-time-string関数で設定していることが分かった
    • Time Parsingに記載されているフォーマットを使って設定する
    • %F%Y-%m-%dの省略形
    • %T%H:%M:%Sの省略形
  • 日付フィールドに表示する文字数を増やした
    • mu4e-headers-fields:human-dateの文字数を20に変更した

Message viewの設定

(setq mu4e-view-date-format "%F %T") ;; %c
(setq mu4e-view-fields '(:from
                         :to
                         :cc
                         :subject
                         :flags
                         :date
                         :maildir
                         :mailing-list
                         :tags
                         :attachments
                         :signature
                         :decryption
                         :message-id
                         :path
                         :user-agent
                         )
      )
  • メッセージ本文の頭に表示する情報を増やしてみた
  • 日付の表示方法を%cから%F %TYYYY-mm-dd HH:MM:ss)に変更した
    • :human-dateが使えなかったので、mu4e-view-date-formatを修正した
  • 重複したメッセージが本当に同じIDを持つのか知りたくて:message-idを表示するようにした
  • メッセージの場所が分かるように:pathを表示することにした
  • 他の人のメーラ情報(:user-agent)も表示することにした

オフラインで使う場合

(setq smtpmail-queue-mail t)
(setq smtpmail-queue-dir "~/Maildir/queue/cur")
  • 送信メールをqueueに入れることができる
  • ラップトップの場合、これを設定しておくといいかも
$ mu mkdir ~/Maildir/queue
$ touch ~/Maildir/queue/.noindex
  • $ mu mkdirを使って~/Maildir/queue/を作成する
  • ~/Maildir/queue/.noindexを作成し、mu indexの対象外にしておく

アカウントの設定

(setq mu4e-contexts
    `( ,(make-mu4e-context
         :name "work"
         :enter-func (lambda () (mu4e-message "Entering WORK context"))
         :leave-func (lambda () (mu4e-message "Leaving WORK context"))
         :match-func (lambda (msg) (when msg (mu4e-message-contact-field-matches msg :to "YOUR_MAIL_ADDRESS@WORK")))
         :vars '( (user-mail-address . "YOUR_MAIL_ADDRESS@WORK")
                   ...
                 )
         )
        ,(make-mu4e-context
          :name "home"
          ...
         )
    )
)
  • すべてのアカウントはmu4e-contextsに追加する
  • 個々のアカウントはmake-mu4e-contextで設定する
    • 設定できる項目はmu4e-context.elにあるdefstruct mu4e-contextを読むのがよい
  • :namemu4e上でアカウントを切り替えるのに使う名前。使いやすいのに設定すればよい(頭文字が同じにならないほうがよいと思う)

その他の変数について

  • あとで追記する予定

使い方

  • いろいろ設定に関して書いていたら長くなってしまったが、使い方に関しても書いておく
  • mu4eにはMain ViewHeaders ViewMessage Viewというモードがあるので、この3つのどれを使っているかを頭に入れておくと、操作が理解しやすくなると思う
    • Main View:メールボックス(とかラベル)を選択するモード
    • Headers View:件名表示、メールを選択するモード
    • Message View:メールを読むモード

キーバインド

キー 動作
SPC a M mu4eを起動する
y Message ViewHeaders Viewを行き来する
C-j 次のメールに移動
C-k 前のメールに移動
C-S-u アップデート(offlineimap -oを走らせる)
q いろいろQuitする
e 添付ファイルをダウンロード(Message View

目次

  1. Spacemacsに乗り換えてみた(1)導入編
  2. Spacemacsに乗り換えてみた(2)キーバインド編
  3. Spacemacsに乗り換えてみた(3)レイヤー編
  4. Spacemacsに乗り換えてみた(4)ウェブ制作編
  5. Spacemacsに乗り換えてみた(5)メーラ編
  6. Spacemacsに乗り換えてみた(6)LaTeX編(予定)
4
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?