A couple weeks ago, I showed you how to send emails without an email client. In this blog post, I'm going to show you how to do the opposite--how to retrieve emails from an email server without an email client. As before, everything will be done on the command-line.
To do this, I'll be using the POP3 protocol. POP3 stands for Post Office Protocol version 3. Its purpose is to retrieve emails from an email server (like picking up mail from the post office, hence the name). The other popular email retreival protocol, which you may have heard of, is IMAP. IMAP offers many more features, like the ability to organize emails into folders, but as a consequence, it is more complex. POP3's feature-set is limited to just retrieving and deleting messages, so it's a lot simpler.
POP3 is similar to SMTP in that client/server communication is text-based. However, POP3 is a little simpler because the responses from the server do not have a plethora of numeric status codes. In POP3, there are only two responses: success responses (which begin with
+OK) and failure responses (which begin with
Connecting to a POP3 server
So let me show you how it works. I will be opening a POP3 connection to my Gmail account. Gmail requires that POP3 transactions be encrypted, so I can't use
telnet like I did in my previous SMTP demo. The
openssl command will allow me to open a sort of "encrypted telnet" connection.
openssl s_client -connect pop.gmail.com:995 -crlf -ign_eof
For more information on this command, read its man page:
If the POP3 server is not encrypted, the
telnet command will work:
telnet pop3.server.com 110
Note: Most webmail services support POP3. You should be able to find the POP3 URL of your webmail service in your webmail's configuration settings or help pages.
First, you obviously must authenticate yourself. There are many ways to perform authentication in POP3, but the simplest way is by using the
PASS commands. These allow you to enter your username and password directly.
+OK Gpop ready for requests from 18.104.22.168 cn9pf9267980vdc.5 USER mike.angstadt +OK send PASS PASS secret +OK Welcome.
Now that I'm authenticated, I can start retrieving emails. The
LIST command returns a list of all of my emails. Each email has an ID (the first number on each line) which is used to retrieve and delete individual emails. Note that these IDs can change with every POP3 session, so do not consider these to be permanent IDs! For instance, if you deleted one or more emails in a previous session, then the IDs of all the emails below the deleted emails will change in your next POP3 session. The number to the right of the ID is the size of the email in bytes. With Gmail, only the first 300 or so messages are shown for some reason. If anyone knows how to get the rest, leave a comment!
LIST +OK 305 messages (57774596 bytes) 1 2017 2 3751155 3 10873184 ... 305 3021
STAT command is handy to have. It shows the total number of emails (the first number) as well as the total size in bytes of all the emails combined (the second number).
STAT +OK 305 57791921
RETR command retrieves an email, including both the headers and the body. The syntax is
RETR <num> where
<num> is the message ID. For example, to retrieve the fifth email, I would type
RETR 5 +OK message follows Date: Mon, 17 Jan 2005 17:20:17 -0500 From: Mike Angstadt <firstname.lastname@example.org> To: John Doe <email@example.com> Subject: Hello John ...more headers... Dear John, How are you doing? -Mike .
!! Warning !!: Even though I have my Gmail POP3 access configured so that emails are not deleted when they are retrieved, it seems to be doing that anyway and I don't know why! Make sure that your email account is configured so that when you retrieve an email with POP3, it is not deleted from your inbox.
DELE command, you guessed it, deletes an email. Like
RETR, the syntax is
DELE <num> where
<num> is the message number. Note that the email won't actually be deleted until you terminate the POP3 session with the
QUIT command. If your connection terminates unexpectedly, your emails will NOT be deleted.
DELE 1 +OK marked for deletion
If you mark an email for deletion by mistake, you can use the
RSET command to undo it. This command will unmark all messages that have been marked for deletion. This means that when
QUIT is sent, the emails won't be deleted.
And, as was already mentioned, the
QUIT command closes the POP3 session, deleting all messages that were marked for deletion with
QUIT +OK Farewell.
For more information on POP3, check out its specification document: RFC-1939
Also check out the SMTP server that I wrote, which supports POP3: https://github.com/mangstadt/Sleet