Inspired by an e-mail-based customer relationship management system briefly described by Daniel Charles of digital ketchup at Shoeless Joe’s last Friday, I decided to hack together a system that would allow me to see the notes from my contact database (aptly named the Big Brother Database, or BBDB) when I write e-mail using the Gnus mail client in Emacs.
The first thing I needed to build, of course, was something that
removed my notes from outgoing messages. People really don’t need to
see the kinds of notes I keep on them. ;) Well, they’re fairly
innocuous notes: how we met and what they’re interested in, usually,
although sometimes I’ll have notes on people’s food preferences or
shoe sizes. I’ve recently started keeping track of the subjects of
e-mail I send them, too.
(defun sacha/gnus-remove-notes () "Remove everything from --- NOTES --- to the signature." (goto-char (point-min)) (when (re-search-forward "^--- NOTES ---" nil t) (let ((start (match-beginning 0)) (end (and (re-search-forward "^--- END NOTES ---") (match-end 0)))) (delete-region start end)))) (add-hook 'message-send-hook 'sacha/gnus-remove-notes)
Then it was easy to write another function that composed individual
messages to all the people currently displayed in the BBDB buffer,
adding notes to each message.
(defun sacha/gnus-send-message-to-all (subject) "Compose message to everyone, with notes." (interactive "MSubject: ") (let ((records bbdb-records)) (while records (when (bbdb-record-net (caar records)) (bbdb-send-mail (caar records) subject) (when (bbdb-record-notes (caar records)) (save-excursion (insert "\n--- NOTES ---\n" (bbdb-record-notes (caar records)) "\n--- END NOTES ---\n")))) (setq records (cdr records)))))
I use BBDB to display only the people I want to e-mail, then I call
M-x sacha/gnus-send-message-to-all and specify a message subject. This
creates a gazillion message buffers which I can then edit. If I feel
particularly paranoid, I can remove the notes section myself with C-c
C-z (message-kill-to-signature), but sacha/gnus-remove-notes does it
as long as it’s in message-send-hook.
This code works particularly well with these other customizations:
- Emacs BBDB magic: Greeting people with nicknames
- Emacs: Keep track of messages sent
- BBDB pinging code – for adding datestamped notes to people’s entries; can be rewritten without the use of Planner
It supersedes More Emacs fun: Composing mail to everyone with notes.