Managing Apple iCloud Notes with Python

iCloud with PythonThis is my first post in 2013! Every begining of a new year, people tend to make a list of good resolution. I also did and one of them is to switch from Perl to Python to develop! Being a Perl addict for years, I don’t expect to completely abandon my beloved language but… I must be able to write better Python scripts! It’s a fact: Python is more and more chosen as the preferred language in many open source projects. I just started to read the bookViolent Python: A Cookbook for Hackers, Forensic Analysts, Penetration Testers and Security Engineers“. Based on my experience with Python, It looks very good and I hope to write a quick review soon. So, here is my first Python script!

I’m using several “iDevices” and all of them are connected to iCloud. Let’s put aside the pros & cons of cloud storage (of course, I don’t store sensitive information in my iCloud account). It’s so convenient to take some notes during a conference on your iPad and have them already synchronized on your Macbook when you’re back at home! But I’m also using several UNIX systems and sometimes, sharing notes from them could also have multiple benefits. You can of course access your iCloud data via a regular browser but I was looking for something more “command line” based. I did not find a solution so I wrote mine!

If you have a iCloud email address (, you can already access your mail via the IMAP protocol. The good news? Your notes are stored in a specific IMAP folder called “Notes“. Using your preferred MUA, connect to your IMAP account via and list the messages in the Notes folder. Their format looks like:

Date: Fri, 11 Jan 2013 13:08:33 +0100
Content-Type: text/html;
Subject: Test


To make a message seen as a “Note” by the Apple applications, you just add the following header:


That’s easy! To manage your iCloud notes, you just need an … IMAP client! Python has a wonderful set of libraries to extend its capabilities. Of course, one of them supports… IMAP! It is called imaplib. This library implements all the required classes to perform all the operation that I wanted on an IMAP folder (read: my Notes):

  • List the notes
  • Search for a keyword in notes
  • Create a new note
All those actions are covered by the script
$ ./ -h
Usage: [options]

  --version            show program's version number and exit
  -h, --help           show this help message and exit
                       specify the configuration file
 -C, --count           count the number of notes
 -d, --debug           display this message
 -H, --html            save the new note in HTML format
 -l, --list            list saved notes
 -q QUERY, --query=QUERY
                       search fo keyword in saved notes
 -s SUBJECT, --subject=SUBJECT
                       create a new note with subject
 -S, --striphtml       remove HTML tags from displayed notes

The script (default location: $HOME/inotes.cfg) requires a small configuration file which contains your credentials:

username: mylogin
password: MySup3rS3cr3tP4$$W0rD

To create a note note, just type it:

$ ./ -c inotes.cfg -s "Test Note"

Or use the output of another command (it reads from STDIN):

$ cat foo.conf | ./ -c inotes.cfg -s "foo configuration"

Again, do NOT store sensitive information in iCloud notes! To search for a specific keyboard in all notes:

$ ./ -c inotes.cfg -q UNIQUEKEYWORD
Subject: Test Note

By default, the Apple tools store notes in HTML format. To handle this, I added two switches:

  • ‘-S’ to strip the HTML tags while searching for notes
  • ‘-H’ to save a new note in HTML

As you can see, nothing fancy but it does what I need! The code is maybe hugly, buggy but available here. Feel free to use (and improve!) it. Note that you could use this script with any IMAP server, no need to have an iCloud access.


  1. Hi Xavier,

    Since El Capitan, Apple has changed the way notes ares stored on iCloud. They aren’t stored on an imap server.
    Do you know how they are managed now?
    Thanks in advance

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.