From 69c17edd39511002b0651b47801ccffa3c93a7d8 Mon Sep 17 00:00:00 2001 From: noa@gaiwan.org Date: Wed, 3 Jul 2024 11:07:40 +0000 Subject: Update mail reading and replying flow --- config.org | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 88 insertions(+), 10 deletions(-) diff --git a/config.org b/config.org index 5866bda..5901aea 100644 --- a/config.org +++ b/config.org @@ -549,6 +549,14 @@ If we enable this, emphasis markers will be hidden for a more word processor fee #+end_src #+begin_src elisp + (defun noa/org-capture-get-mail-body () + "Returns the body of the current mail shown in rmail buffer as a string. For us during org-capture." + (with-current-buffer (org-capture-get :original-buffer) + (save-excursion + (goto-char (point-min)) + (search-forward "\n\n") + (buffer-substring-no-properties (point) (point-max))))) + (setopt org-startup-with-inline-images t) (setopt org-image-actual-width '(300)) (setopt org-auto-align-tags nil) @@ -566,18 +574,44 @@ If we enable this, emphasis markers will be hidden for a more word processor fee (setopt org-return-follows-link t) (setopt org-agenda-files '("~/data/notes/notes.org")) (setopt org-capture-bookmark nil) - (setopt org-capture-templates '(("j" "Journal" entry (file+olp+datetree "~/data/notes/notes.org") "* %?\n" :empty-lines 1) - ("w" "Website" entry (file+olp+datetree "~/data/notes/notes.org") "* %a\n%?\n" :empty-lines 1) - ("c" "Contact" entry (file+olp+datetree "~/data/notes/notes.org") - "* %^{Name} + (setopt org-capture-templates + '(("j" "Journal" entry (file+olp+datetree "~/data/notes/notes.org") "* %?\n" :empty-lines 1) + + ("l" "Website" entry (file+olp+datetree "~/data/notes/notes.org") "* %a\n%?\n" :empty-lines 1) + + ("M" "Mail" entry (file+olp+datetree "~/data/notes/notes.org") "* %:fromname—%:subject :mail:%^g + :PROPERTIES: + :MAIL_TO: %:to + :MAIL_FROM: %:from + :MAIL_DATE: %:date + :MAIL_SUBJECT: %:subject + :MAIL_MESSAGE_ID: %:message-id + :END: + + %?%(noa/org-capture-get-mail-body)\n" :empty-lines 1 :immediate-finish t) + + ("m" "Compose mail" entry (file+olp+datetree "~/data/notes/notes.org") "* Email :PROPERTIES: - :ADDRESS: %^{Address} - :BIRTHDAY: %^{yyyy-mm-dd} - :EMAIL: %^{EMAIL}p - :NOTE: %^{NOTE} + :MAIL_TO: %? + :MAIL_SUBJECT: + :MAIL_FROM: noa :END:" - :empty-lines 1) - )) + :empty-lines 1 + :jump-to-captured t + :immediate-finish t + ) + + ("r" "Reply to this mail" entry (file+olp+datetree "~/data/notes/notes.org") "* TODO Reply to %:fromname—%:subject :mail: + :PROPERTIES: + :MAIL_TO: %:from + :MAIL_FROM: %:to + :MAIL_SUBJECT: %:subject + :MAIL_IN_REPLY_TO: %:message-id + :END: + + %?%(noa/org-capture-get-mail-body)\n" + :empty-lines 1 + :immediate-finish t))) #+end_src #+begin_src elisp @@ -1834,6 +1868,50 @@ I have experimented with lots of different methods of reading mail, both in and (setopt mairix-search-file "search.mbox") #+end_src +** Composing mail from an org buffer +As i keep mentioning, i have a big org file which i put everything into. This includes interesting web articles, which i will paraphrase or quote. However, this does not include mail, because mail is a bit of a beast. + +I have written this function as the first step in bridging that gap. I can compose an email in org, via an org-capture template that will prompt me for a recipient and subject. Then i can send the subtree to the mail buffer. + +At the moment, i am still recording sent mail in the outbox directory of my mail directory. This is because at the moment i don't have a way to move whole emails from rmail to org (although i think there are ways to do that, and i have added the in_reply_to header for the future). + +#+begin_src elisp + (defun noa/org-mail-subtree () + "Prepare a mail buffer to send the current subtree as an email. Respects the headline properties MAIL_SUBJECT MAIL_TO MAIL_CC MAIL_BCC MAIL_FROM." + (interactive) + (save-excursion + (let* ((subject (org-entry-get nil "MAIL_SUBJECT" nil)) + (to (org-entry-get nil "MAIL_TO" nil)) + (from (org-entry-get nil "MAIL_FROM")) + (cc (org-entry-get nil "MAIL_CC" nil)) + (bcc (org-entry-get nil "MAIL_BCC" nil)) + (in-reply-to (org-entry-get nil "MAIL_IN_REPLY_TO" nil)) + (other-headers (list (cons "Cc" cc) + (cons "Bcc" bcc) + (cons "From" from ) + (cons "In-Reply-To" in-reply-to))) + (body (save-restriction (org-narrow-to-subtree) + (beginning-of-buffer) + (search-forward-regexp ":END:\n*") + (buffer-substring (point) (point-max))))) + (compose-mail to subject other-headers) + (message-goto-body) + (insert body)) + (message-goto-to))) +#+end_src + +#+begin_src elisp + (defun noa/org-compose-mail () + "Launch an org buffer to compose a mail." + (interactive) + (org-capture nil "m")) + + (defun noa/org-todo-reply-mail () + "Capture the current mail as a todo ready to be replied to." + (interactive) + (org-capture nil "r")) +#+end_src + ** Sending mail with msmtp #+begin_src elisp (setopt message-send-mail-function 'message-send-mail-with-sendmail) -- cgit 1.4.1-2-gfad0