~cytrogen/.emacs.d

ref: 40b26f90a0a33e58fafcaa386388cc51a0ab64cc .emacs.d/config/pkg-email.el -rw-r--r-- 4.4 KiB
40b26f90 — Cytrogen feat(org): 添加动态 Capture/Refile 系统和阅读列表 Agenda a month ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
;;; pkg-email.el --- Email client configuration -*- lexical-binding: t -*-

;; Copyright (C) 2024 Cytrogen

;;; Commentary:

;; Email configuration using mu4e.
;; Account configuration is stored in ~/.emacs.d/email-accounts.el

;;; Code:

;;; ============================================================
;;; Account Configuration (不依赖 mu4e)
;;; ============================================================

(defvar my/email-accounts nil
  "Email account configurations loaded from external file.")

(defvar my/email-accounts-file
  (expand-file-name "email-accounts.el" user-emacs-directory)
  "Path to the email accounts configuration file.")

(defun my/email--load-accounts ()
  "Load email accounts from external config file."
  (when (file-exists-p my/email-accounts-file)
    (load-file my/email-accounts-file)))

;; 立即加载账号(不依赖 mu4e)
(my/email--load-accounts)

;;; ============================================================
;;; mu4e Setup (延迟加载)
;;; ============================================================

;; 添加 mu4e 路径
(let ((mu4e-path "/usr/share/emacs/site-lisp/mu4e"))
  (when (file-directory-p mu4e-path)
    (add-to-list 'load-path mu4e-path)))

(with-eval-after-load 'mu4e
  ;; Context 生成函数
  (defun my/email--make-context (account)
    "Create a mu4e-context from ACCOUNT plist."
    (let* ((name     (plist-get account :name))
           (email    (plist-get account :email))
           (fullname (plist-get account :fullname))
           (maildir  (plist-get account :maildir))
           (inbox    (plist-get account :inbox))
           (sent     (plist-get account :sent))
           (drafts   (plist-get account :drafts))
           (trash    (plist-get account :trash))
           (archive  (plist-get account :archive))
           (maildir-prefix (concat "/" maildir)))
      (make-mu4e-context
       :name name
       :enter-func (lambda () (mu4e-message "Switched to %s" name))
       :leave-func (lambda () (mu4e-message "Left %s" name))
       :match-func (lambda (msg)
                     (when msg
                       (string-prefix-p maildir-prefix
                                        (mu4e-message-field msg :maildir))))
       :vars `((user-mail-address  . ,email)
               (user-full-name     . ,fullname)
               (mu4e-sent-folder   . ,(concat maildir-prefix "/" sent))
               (mu4e-drafts-folder . ,(concat maildir-prefix "/" drafts))
               (mu4e-trash-folder  . ,(concat maildir-prefix "/" trash))
               (mu4e-refile-folder . ,(concat maildir-prefix "/" archive))
               (mu4e-maildir-shortcuts
                . ((:maildir ,(concat maildir-prefix "/" inbox)   :key ?i)
                   (:maildir ,(concat maildir-prefix "/" sent)    :key ?s)
                   (:maildir ,(concat maildir-prefix "/" drafts)  :key ?d)
                   (:maildir ,(concat maildir-prefix "/" trash)   :key ?t)
                   (:maildir ,(concat maildir-prefix "/" archive) :key ?a)))))))

  (defun my/email--setup-contexts ()
    "Generate mu4e-contexts from `my/email-accounts'."
    (when my/email-accounts
      (setq mu4e-contexts
            (mapcar #'my/email--make-context my/email-accounts))
      (setq mu4e-context-policy 'pick-first)
      (setq mu4e-compose-context-policy 'ask-if-none)))

  ;; mu4e 基础配置
  (setq mu4e-maildir "~/Mail")
  (setq mu4e-get-mail-command "mbsync -a")
  (setq mu4e-update-interval 300)
  (setq message-kill-buffer-on-exit t)
  (setq mu4e-headers-auto-update t)
  (setq mu4e-compose-signature-auto-include nil)
  (setq mu4e-view-show-images t)
  (setq mu4e-view-show-addresses t)
  (setq mu4e-use-fancy-chars t)
  (setq mu4e-compose-dont-reply-to-self t)

  ;; msmtp 发送配置
  (setq sendmail-program "/usr/bin/msmtp")
  (setq send-mail-function 'message-send-mail-with-sendmail)
  (setq message-send-mail-function 'message-send-mail-with-sendmail)
  (setq message-sendmail-f-is-evil t)
  (setq message-sendmail-extra-arguments '("--read-envelope-from"))

  ;; 设置 contexts
  (my/email--setup-contexts))

;;; ============================================================
;;; Interactive Commands
;;; ============================================================

(defun my/email-reload-accounts ()
  "Reload email accounts from config file."
  (interactive)
  (my/email--load-accounts)
  (when (featurep 'mu4e)
    (my/email--setup-contexts))
  (message "Loaded %d email account(s)" (length my/email-accounts)))

(provide 'pkg-email)
;;; pkg-email.el ends here