はじめに
-
Spacemacsでメールを読み書きできるようにした -
mu4eを使うことにした - あとでいろいろ追記するつもりだけど、とりあえず送受信できるようになった
設定の方針
- メール受信 :
GmailからIMAPで受信する(offlineimapを使う) - メール送信 :
GmailのSMTPを使って送信する(msmtpを使う) - メール検索 :
muを使って受信したメールを検索できるようにする - メーラ :
mu4eを使ってEmacs上でメールを受信・送信できるようにする
インストールしたもの
$ brew install offlineimap
$ brew install msmtp
$ brew install mu --with-emacs
-
offlineimap:IMAPを使ってメールを受信するコマンド -
msmtp: メールを送信するコマンド -
mu: メールのインデックスを作成したり、検索するコマンド。--with-emacsオプションをつけてインストールする
Gmailのアプリパスワードの作成
-
GmailのIMAP、SMTPを使うためにアプリパスワードを作る必要がある -
Gmailヘルプ - アプリパスワードでログインを参考に作成する
-
アプリを選択:その他(名前を入力)(EmacsMu4eとかなんでもOK) -
端末を選択:入力不要(というか、できなくなる) 生成-
パスワード:16桁の文字列(ターミナルで$ pwgen -s 16 1で自動生成した)
-
メール受信:OfflineIMAPの設定
-
GmailのIMAPサーバを使ってメールを受信できるようにした - 設定ファイル
~/.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の設定
-
GmailのSMTPサーバを使ってメールを送信できるようにした - 設定ファイル
~/.msmtprcを新規に作成した - 設定する内容はGitLab snippet - msmtpにまとめた
送信テスト
設定ファイルが正しく動くのか、コマンドラインでテストした
送信テスト
$ msmtp -t ## 入力待ち状態になるので、下記の内容を入力する
To: 宛先を入力する(例:自分のGmailアドレス)
From: 送信元を入力する(例:自分のGmailアドレス)
Subject: 件名を入力する(例:MSMTPの送信テストだよ)
本文を入力する
(例:
これはMSMTPの送信テストだよ。
自分のGmail → 自分のGmailに送信)
# (C-dで終了すると送信される)
-
$ msmtp -tで起動 - 宛先を入力する:
To:から自分で入力する - 送信元を入力する:
From:から自分で入力する(省略した場合、設定ファイルのaccount defaultで指定したアドレスになる) - 件名を入力する:
Subject:から入力する(例:Subject: MSMTPの送信テストだよ) - メールの送信:
C-dで終了するとメールが送信される(送信のキャンセルはC-c) - 宛先に指定したメールボックスを確認する
メール検索: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の場合は日付を表示するようになっている-
today:mu4e-headers-time-format(時刻) -
older:mu4e-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.el内の
-
日付フィールドに表示する文字数を増やした-
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 %T(YYYY-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を読むのがよい
- 設定できる項目はmu4e-context.elにある
-
:nameはmu4e上でアカウントを切り替えるのに使う名前。使いやすいのに設定すればよい(頭文字が同じにならないほうがよいと思う)
その他の変数について
- あとで追記する予定
使い方
- いろいろ設定に関して書いていたら長くなってしまったが、使い方に関しても書いておく
-
mu4eにはMain View、Headers View、Message Viewというモードがあるので、この3つのどれを使っているかを頭に入れておくと、操作が理解しやすくなると思う-
Main View:メールボックス(とかラベル)を選択するモード -
Headers View:件名表示、メールを選択するモード -
Message View:メールを読むモード
-
キーバインド
| キー | 動作 |
|---|---|
SPC a M |
mu4eを起動する |
y |
Message ViewとHeaders Viewを行き来する |
C-j |
次のメールに移動 |
C-k |
前のメールに移動 |
C-S-u |
アップデート(offlineimap -oを走らせる) |
q |
いろいろQuitする |
e |
添付ファイルをダウンロード(Message View) |
目次
- Spacemacsに乗り換えてみた(1)導入編
- Spacemacsに乗り換えてみた(2)キーバインド編
- Spacemacsに乗り換えてみた(3)レイヤー編
- Spacemacsに乗り換えてみた(4)ウェブ制作編
- Spacemacsに乗り換えてみた(5)メーラ編
- Spacemacsに乗り換えてみた(6)LaTeX編(予定)