User Tools

Site Tools


curl:perform_imap_queries_using_curl

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
curl:perform_imap_queries_using_curl [2016/11/16 16:38] – created petercurl:perform_imap_queries_using_curl [2020/09/25 13:02] (current) 192.168.1.1
Line 1: Line 1:
 ====== Curl - Perform imap queries using Curl ====== ====== Curl - Perform imap queries using Curl ======
  
-If you have an IMAP or IMAPS server you can "read your email" using Curl. To get started you'll first of all need to know:+If you have an IMAP or IMAPS server you can "read your email" using Curl.  To get started you'll first of all need to know:
  
   * Your mail-server address.   * Your mail-server address.
   * Your mail login.   * Your mail login.
   * Your mail password.   * Your mail password.
 +
 +----
  
 ===== Listing Folders ===== ===== Listing Folders =====
Line 16: Line 18:
  
 <WRAP info> <WRAP info>
-If you leave out the password from the --user argument, curl will prompt you for the password before it preforms the request. This way you're not leaking your password to your shell history or the process list.+If you leave out the password from the **<nowiki>--user</nowiki>** argument, curl will prompt you for the password before it preforms the request. This way you're not leaking your password to your shell history or the process list.
  
-Curl also supports .netrc lookup of user:password with -n, if the --user argument is left off.+Curl also supports .netrc lookup of user:password with -n, if the **<nowiki>--user</nowiki>** argument is left off.
 </WRAP> </WRAP>
  
 +returns
  
-Returns +<code bash>
- +
-<code>+
 .. ..
 .. ..
Line 35: Line 36:
 Here we see that we've connected, and received a list of folders, including "xen-users", "fairshare", and the "INBOX". Here we see that we've connected, and received a list of folders, including "xen-users", "fairshare", and the "INBOX".
  
-If your mail-server is running over SSL then instead of using **imap://** you should set the schema to **imaps://**, it may be that you're using a self-signed certificate in that case you'd add **--insecure** to avoid checking the certificate trust-chain.+If your mail-server is running over SSL then instead of using **<nowiki>imap://</nowiki>** you should set the schema to **<nowiki>imaps://</nowiki>**, it may be that you're using a self-signed certificate in that case you'd add **<nowiki>--insecure</nowiki>** to avoid checking the certificate trust-chain.
  
 This would look like so: This would look like so:
Line 43: Line 44:
 </code> </code>
  
 +----
  
 ===== Discovering Messages ===== ===== Discovering Messages =====
  
-With the previous example we looked at listing mailboxes.  What if we wanted to actually view a message?  To fetch a message we need the identifier of the message to fetch - so we need to find out how many messages exist, as message-IDs are sequential.+With the previous example we looked at listing mailboxes.  What if we wanted to actually view a message? 
 + 
 +To fetch a message we need the identifier of the message to fetch - so we need to find out how many messages exist, as message-IDs are sequential.
  
 To see how many messages exist in the folder "People-Steve" we'd run this: To see how many messages exist in the folder "People-Steve" we'd run this:
Line 57: Line 61:
 </code> </code>
  
-Returns+returns:
  
-<code>+<code bash>
 * OK [PERMANENTFLAGS ()] Read-only mailbox. * OK [PERMANENTFLAGS ()] Read-only mailbox.
 * 9465 EXISTS * 9465 EXISTS
Line 69: Line 73:
 This tells us that there are 9465 messages.  So we can probably assume that fetching a message with each of these IDs will work: 1, 2, 3, ... 9465, & 9465. This tells us that there are 9465 messages.  So we can probably assume that fetching a message with each of these IDs will work: 1, 2, 3, ... 9465, & 9465.
  
 +----
  
 ===== Fetching A Single Message ===== ===== Fetching A Single Message =====
Line 82: Line 87:
 </code> </code>
  
-Returns+returns:
  
-<code>+<code bash>
 .. ..
 X-HELO: mail.cs.helsinki.fi X-HELO: mail.cs.helsinki.fi
Line 103: Line 108:
 </code> </code>
  
-Returns+returns:
  
-<code>+<code bash>
 Date: Sat, 14 Apr 2012 14:13:41 +0300 (EEST) Date: Sat, 14 Apr 2012 14:13:41 +0300 (EEST)
 From: Steve Kemp <steve@steve.org.uk> From: Steve Kemp <steve@steve.org.uk>
Line 114: Line 119:
 We could have avoided the use of URL-encoding and instead sent a custom-request, like so: We could have avoided the use of URL-encoding and instead sent a custom-request, like so:
  
-<code>+<code bash>
 curl --insecure --verbose \ curl --insecure --verbose \
     --url "imaps://imap.example.com/People-Steve" \     --url "imaps://imap.example.com/People-Steve" \
Line 121: Line 126:
 </code> </code>
  
-Returns+returns:
  
-<code>+<code bash>
 .. ..
 Subject: Re: Fancy a cake? Subject: Re: Fancy a cake?
Line 131: Line 136:
 The reason for avoiding custom-requests where possible is that when you're using the curl API programatically you'll discover that responses are not decoded - which is a known issue. The reason for avoiding custom-requests where possible is that when you're using the curl API programatically you'll discover that responses are not decoded - which is a known issue.
  
-In the example above we'd have received zero output unless/until we added the **--verbose** flag.  Precisely because curl has received the output from the IMAP-server but not decoded it and presented it to us.+In the example above we'd have received zero output unless/until we added the **<nowiki>--verbose</nowiki>** flag.  Precisely because curl has received the output from the IMAP-server but not decoded it and presented it to us.
  
 +----
  
 ===== Simple Shell Scripts ===== ===== Simple Shell Scripts =====
Line 152: Line 158:
 This takes no account of the maximum message-ID.  You could just keep going indefinitely, to dump all subjects and stop on error: This takes no account of the maximum message-ID.  You could just keep going indefinitely, to dump all subjects and stop on error:
  
-<code>+<code bash>
 #!/bin/sh #!/bin/sh
 # Dump the subject of all messages in the folder. # Dump the subject of all messages in the folder.
Line 166: Line 172:
 done done
 </code> </code>
 +
 +----
 +
 +===== CurlMail Script =====
 +
 +<code bash>
 +#!/bin/bash
 +#                       /usr/local/bin/curlmail
 +#  http://crystalfaeries.net/posix/bin/curlmail
 +# celeste crystalfaery 2016-02-24 22:27:10+00:00
 +# https://debian-administration.org/article/726/Performing_IMAP_queries_via_curl
 +# read(only) IMAPS INBOX  (using ~/.netrc for password)
 +# (machine example.org login user password my_password)
 +# 1st argument is machine name (else talk to self if not specified)
 +# 2..n argument(s) (optional) are message number(s) to view
 +# e.g.: curlmail example.org 3 1 4
 +help=10 # this line number of file -1
 +# NOTE: remove the "--insecure" argument to curl if server(s) have real certificate vs self-signed certificate
 +# NOTE: we do not sanitize the server argument, so as-is don't make this into a cgi
 +
 +function cleanup {
 +  if [ -e /tmp/$$ ]; then
 +    rm /tmp/$$ # cleanup our temporary file
 +  fi
 +}
 +
 +trap cleanup INT TERM # cleanup our temporary file
 +
 +case $# in
 +
 +0)
 +  exec $0 `hostname` # talk to myself
 +  exit -1 # exec doesn't return, right?
 +  ;;
 +1)
 +  case "$1" in
 +    -v)
 + tail -n +4 $0 | head -n 1
 + ;;
 +    --version)
 + tail -n +4 $0 | head -n 1
 + ;;
 +    -h)
 + head -n $help $0 | tail -n +6
 + ;;
 +    --help)
 + head -n $help $0 | tail -n +6
 + ;;
 +    *)
 + let uid=0
 + while let uid=$uid+1
 + do # iterate available messages
 +   echo -n "${uid}: " >> /tmp/$$
 +   chmod 600    /tmp/$$
 +   curl -# --insecure -n --url \
 + "imaps://${1}/INBOX;UID=${uid};SECTION=HEADER.FIELDS%20(DATE%20FROM%20TO%20SUBJECT)" >> /tmp/$$ 2>/dev/null || break
 + done 
 + sed 's/\n\n/\n/g' /tmp/$$ | less
 + rm    /tmp/$$
 + ;;
 +    esac
 +      exit
 +      ;;
 +*)
 +  server="$1"
 +  shift
 +  while [ $# != 0 ]
 +  do  # iterate requested messages
 +    message=`echo "$1" | tr -d -c '[:digit:]'` # sanitize input
 +    shift
 +    rm    /tmp/$$ 2>/dev/null
 +    echo -n "${message}: " >> /tmp/$$
 +    chmod 600    /tmp/$$
 +    curl -# --insecure -n --url "imaps://${server}/INBOX;UID=${message}" >> /tmp/$$ 2>/dev/null
 +    sed 's/\n\n/\n/g' /tmp/$$ | less
 +    rm    /tmp/$$
 +  done
 +  exit
 +  ;;
 +esac
 +</code>
 +
 +----
 +
 +===== References =====
 +
 +http://crystalfaeries.net/fae/curlmail.html
  
curl/perform_imap_queries_using_curl.1479314306.txt.gz · Last modified: 2020/07/15 09:30 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki