summary refs log tree commit diff
diff options
context:
space:
mode:
authornoa@gaiwan.org2024-07-03 11:07:40 +0000
committernoa@gaiwan.org2024-07-03 11:07:40 +0000
commit69c17edd39511002b0651b47801ccffa3c93a7d8 (patch)
tree8dd64fcfd662a3f37c339b7c65e76ed9cefb1fa4
parent71c36b303948353b49944fedcb09589a9128f961 (diff)
Update mail reading and replying flow
-rw-r--r--config.org98
1 files 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 <noa@noa.pub>
   :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)