;;; 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