Capturing Data for Org via Email


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.


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"
       no keep
       no rewrite
       mda "~/.dotfiles/";

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.


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


  ## build email by adding input from stdin line by line:
  while IFS= read -r line

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

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

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

  ## append mail header and body as new TODO heading to ORGFILE:
  cat <<EOF >>${ORGFILE}
  ,* TODO Email: ${SUBJECT}



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.



  cd ~/path/to/capture/directory || exit 1
  git add 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!