I have implemented a special remote that stores files as email messages on an imap server. You need   to install three utilities that the hooks invoke to deal with the email: mutt, imaputils, and         munpack. I use mutt to send the email with the file as a mime attachment; imaputils talks to the imap server to check for and retrieve the message containing the desired file; and munpack extracts and    decodes the attachment to get our file back.

Several programs could be used in place of mutt, but the latter has a convenient command-line option  for attaching files; mutt is of course available in the repositories of most linux distributions.

imaputils is a perl program available at http://sourceforge.net/projects/imaputils/
It has several perl library dependencies that you might need to download using the cpan tool.
What imaputils does for you is provide a command line tool for interacting with the mail server. You  can search for mail with a particular subject (for example), delete mail, retrieve messages, and in   general do anything that you can do with a mail client such as mutt, but from the command line rather than a curses interface. This allows you to in turn write scripts that talk to imap servers.

munpack is part of the mpack package. This is included in the Ubuntu and Debian repositories, and can probably be easily obtained for most linuxes. munpack extracts and decodes mime attachments from the  command line.

I define the special remote with

    git annex initremote hogneygmail type=hook encryption=gitannex hooktype=hogneygmail

The pgp key "gitannex" is a key established just for this purpose, that has no passphrase. This       allows me to use encryption transparently. You could also use encryption=shared if your version of    git-annex is recent enough. I also did

    git annex untrust hogneygmail

Here are the hooks:

        hogneygmail-store-hook = mutt -n -s $ANNEX_KEY -a $ANNEX_FILE -- {email address} < /dev/null
        hogneygmail-checkpresent-hook = "(imaputils.pl --conf {imap config file} --subject $ANNEX_KEY --count | grep -q \"1 messages\" -) && echo $ANNEX_KEY"
        hogneygmail-retrieve-hook =  "imaputils.pl --conf {imap config file} --subject $ANNEX_KEY --display | munpack -fq && mv $ANNEX_KEY $ANNEX_FILE; rm $ANNEX_KEY.desc"
        hogneygmail-remove-hook = "imaputils.pl --conf {imap config file} --subject $ANNEX_KEY --delete"

The bits inside of the curly brackets, for example {email address}, are what you need to specialize   for your particular case (removing the brackets as well). The {imap config file} is a file that       contains some configuration for imaputils. In my case it contains

    ssl
    pass {password}
    host {mail host}
    user {mail username}
    box  {name of mailbox to check}

The first line tells imaputils to use ssl, and the third line is the address of the mail host. I      include my username and password so I won't need to type these in repeatedly. Of course this means    that you need to protect this file carefully.



The operation of the hooks is pretty straightforward. The store-hook attaches the file to an          otherwise empty email message with a subject equal to the name of the key, and mails it off. Note     that if you use encryption then the keys generated by git-annex here will not be the same ones you    see on your local disc. The checkpresent-hook asks the imap server how many emails have the subject   equal to the key we are looking for; only if the reply contains "1 messages" are we sure the right    one is there. The retrieve-hook uses the "--display" option to imaputils to stream the message, pipes it to munpack to silently extract the attachment (which is our (encrypted) file), and moves the       result into the file contents. It then cleans up by deleting the .desc file that I can't prevent      munpack from leaving on the disk, even when the message is blank. The remove-hook passes the "--      delete" option to imaputils to supposedly delete the target message from the mail server.

I've performed very limited testing of this, and my knowledge of git and, especially, git-annex is    very primitive, so I'm sure this could be vastly improved. In my testing with gmail this seems to     work fine, except that messages do not get deleted from the server - I don't know why.

I've developed this as an experiment and proof of concept, and have no knowledge of whether actually  using this is in accord with the terms of service of gmail or any other mail service you might be     using, nor whether it is safe or a good idea.

-- Lee
