Capturing Data for Org Via Email

Table of Contents

Why

When I’m away from my computer, I like to be able to still capture notes. And while I’d love to use MobileOrg, it’s not quite as full-featured as I’d like. Because of this, I use email to send myself notes and the like. Originally, I’d send them to my main inbox and go through them manually. This, however, took a lot of time, so I decided to automate it. It started out based on Karl Voit’s implementation, but have since extended it, adding a couple of features, making it more useful for me.

How

So, the question is how. I mostly use standard unix utilities, but this does require the following:

Fetchmail Config

The fetchmail config is what does the heavy lifting. As it stands, it’s a relatively simple configuration, selecting the server, protocol and setting the MDA, making sure that it doesn’t keep emails on the server, fetches everything and doesn’t rewrite the headers, not that that’s a big deal in this case, as only 2 headers are required (From and Subject).

poll mail-server proto POP3
     user "email-address" pass "the-password"
     fetchall
     no keep
     no rewrite
     mda "~/.dotfiles/do-capture.sh";

Capture Script

This is the capture script, and honestly, it’s quite simple. It defines the target file as $ORGFILE, reading in the email into $EMAIL using a while loop and read, and parsing out the Subject, Send Date, and popping all of the mime data into a directory. It then gets all of the body text and converts it to org-mode syntax. From there, it generates an org entry and appends it to the $ORGFILE.

#!/bin/sh

## generates an org-file-entry from the email sent through stdin

ORGFILE="/path/to/email-capture.org"

## build email by adding input from stdin line by line:
while IFS= read -r line
do
    EMAIL="${EMAIL}
${line}"
done

## extract header information:
SUBJECT=$(echo "${EMAIL}" | formail -x Subject | sed -e 's/^ //')
DATE=$(echo "${EMAIL}" | formail -x Date | sed -e 's/^ //')

## Create Data Directory
COUNT=1
DATADIR="/home/swflint/org/email-data/$(date +%F)/${COUNT}"
until [ ! -d "${DATADIR}" ] ;
do
    COUNT=$((COUNT + 1))
    DATADIR="/home/swflint/org/email-data/$(date +%F)/${COUNT}"
done

mkdir -p "${DATADIR}"
echo "${EMAIL}" | ripmime -i - -d "${DATADIR}"
for BODYFILE in ${DATADIR}/textfile* ; do
    BODY="${BODY}
$(pandoc -t org < ${BODYFILE})"
done

## append mail header and body as new TODO heading to ORGFILE:
cat <<EOF >>${ORGFILE}
* TODO Email: ${SUBJECT}
${DATE}
[[file:${DATADIR}]]

${BODY}

EOF

Wrapper Script

This part is completely and entirely optional, but it runs fetchmail, cd’s to the capture directory, adds the changes to git and commits it.

#!/bin/sh

fetchmail

cd ~/path/to/capture/directory || exit 1
git add capture-file.org email-data && \
    git commit -m "Pulled Emails for Capture"

How Well Does It Work?

So far, this works great! It’s fairly efficient, and let’s me email myself notes and links. I’m really excited about having it and it working!

Date: 2017-03-13 Mon 16:40

Author: Sam Flint

Created: 2017-03-16 Thu 23:13

Validate