;;; ravi-init-mu.el --- mail ;; Copyright (C) 2014 ;; Author: ;; Keywords: ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; Set up mu4e conditionally ;; - actual account information should be in local.el ;; - requires definition of ravi/setup-mu4e-locals ;;; Code: (setq ravi/epg-gpg-program "gpg2") (setq epg-gpg-program ravi/epg-gpg-program) (defvar ravi/use-mu-for-email nil "Use mu for email") (defvar ravi/mu4e-update-interval 1800 ; 30 minutes "Basic update interval; all other update intervals are multiples") (setq message-citation-line-format "On %a %Y-%m-%d %l:%M:%S%p %Z, %f wrote:" message-citation-line-function 'message-insert-formatted-citation-line) (when ravi/use-mu-for-email (use-package mu4e :load-path (lambda () (ravi/emacs-file "site-lisp/mu/mu4e")) :commands mu4e :init (progn (add-to-list 'Info-additional-directory-list (ravi/emacs-file "site-lisp/mu/mu4e")) (defun ravi/switch-to-mu4e () (interactive) (let ((buf (or (and (boundp 'mu4e~headers-buffer-name) (get-buffer mu4e~headers-buffer-name)) (get-buffer "*mu4e-main*")))) (if buf (if (get-buffer-window buf t) (select-window (get-buffer-window buf t)) (switch-to-buffer buf)) (mu4e)))) (bind-key "C-'" 'ravi/switch-to-mu4e) ) :config (progn ;; Basic identity for sending mail (require 'smtpmail) (setq send-mail-function 'smtpmail-send-it) (setq message-send-mail-function 'smtpmail-send-it) ;; Set up accounts (when (fboundp 'ravi/setup-mu4e-locals) (ravi/setup-mu4e-locals)) (setq mu4e-compose-dont-reply-to-self t) (setq mu4e-user-mail-address-list (delq nil (mapcar (lambda (context) (when (mu4e-context-vars context) (cdr (assq 'user-mail-address (mu4e-context-vars context))))) mu4e-contexts))) (setq smtpmail-smtp-service 587) ;; Use async method of sending email, if possible (use-package async :config (progn (require 'smtpmail-async) ;; To do: set this from ravi/epg-gpg-program (add-hook 'async-smtpmail-before-send-hook (lambda () (setq epg-gpg-program "gpg2"))) (setq send-mail-function 'async-smtpmail-send-it) (setq message-send-mail-function 'async-smtpmail-send-it))) ;; Basic mu4e configuration parameters (setq mu4e-mu-binary (ravi/emacs-file "site-lisp/mu/mu/mu")) (setq mu4e-maildir "~/.mail") ;; Poll accounts only as often as necessary (defvar ravi/mu4e-get-mail-attempts 0 "Number of attempts so far to get mail") (defvar ravi/mu4e-last-fetched-contexts nil "The contexts for the last fetch") (defvar ravi/mbsync-command "mbsync -q -q" "Mailbox sync command; takes context(s) as argument") (defun ravi/check-whether-to-get-mail-for-account (context) (let* ((account-interval (when (mu4e-context-vars context) (assq 'ravi/account-update-interval (mu4e-context-vars context)))) (account-update-interval (if account-interval (cdr account-interval) 1))) (and (> account-update-interval 0) (= (% ravi/mu4e-get-mail-attempts account-update-interval) 0)))) (defun ravi/get-mu4e-get-mail-command () "Figure out arguments to mbsync" (let* ((contexts-to-get (seq-filter #'ravi/check-whether-to-get-mail-for-account mu4e-contexts)) (context-string (mapconcat (lambda (ctx) (alist-get 'ravi/account-name (mu4e-context-vars ctx))) contexts-to-get " "))) (setq ravi/mu4e-get-mail-attempts (1+ ravi/mu4e-get-mail-attempts)) (setq ravi/mu4e-last-fetched-contexts contexts-to-get) (if contexts-to-get (concat ravi/mbsync-command " " context-string) "true"))) ;; do nothing command (add-hook 'mu4e-update-pre-hook (lambda () (setq mu4e-get-mail-command (ravi/get-mu4e-get-mail-command)) (message "Get mail command: %s" mu4e-get-mail-command))) ;(message "%d: '%s'" ravi/mu4e-get-mail-attempts (ravi/get-mu4e-get-mail-command)) ;; Default update command if something goes wrong (setq mu4e-get-mail-command "mbsync -a -q -q") (setq mu4e-update-interval ravi/mu4e-update-interval) (setq mu4e-change-filenames-when-moving t) ;; User interface (setq mu4e-html-renderer 'w3m) (setq mu4e-html2text-command "w3m -T text/html") (setq mu4e-view-show-images t) (setq mu4e-view-show-addresses t) (when (boundp 'ravi/mu4e-maildir-shortcuts) (setq mu4e-maildir-shortcuts ravi/mu4e-maildir-shortcuts)) (add-to-list 'mu4e-view-actions '("ViewInBrowser" . mu4e-action-view-in-browser) t) ;; Display desktop notifications (use-package mu4e-alert :disabled t :config (progn (mu4e-alert-set-default-style 'libnotify) (mu4e-alert-disable-mode-line-display) (mu4e-alert-enable-notifications))) (use-package mu4e-jump-to-list) (use-package mu4e-query-fragments) (setq message-citation-line-function 'message-insert-formatted-citation-line) (setq message-kill-buffer-on-exit t) (setq mu4e-compose-signature-auto-include nil) (bind-key "C-c C-d" 'ravi/erase-from-point mu4e-compose-mode-map) ;; Allow attaching files from dired (require 'gnus-dired) ;; make the `gnus-dired-mail-buffers' function also work on ;; message-mode derived modes, such as mu4e-compose-mode (defun gnus-dired-mail-buffers () "Return a list of active message buffers." (let (buffers) (save-current-buffer (dolist (buffer (buffer-list t)) (set-buffer buffer) (when (and (derived-mode-p 'message-mode) (null message-sent-message-via)) (push (buffer-name buffer) buffers)))) (nreverse buffers))) (setq gnus-dired-mail-mode 'mu4e-user-agent) (add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode) (when (equal ravi/use-selection-system 'helm) (add-to-list 'helm-find-files-actions '("Attach files for mu4e" . helm-mu4e-attach) t) (defun helm-mu4e-attach (_file) (gnus-dired-attach (helm-marked-candidates)))) (imagemagick-register-types) ) ) ) (use-package elfeed :bind (("C-x w" . elfeed)) :config (progn (use-package elfeed-goodies :config (elfeed-goodies/setup)))) (provide 'ravi-init-mu) ;;; ravi-init-mu.el ends here