Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get emails with Python and poplib

I would like to log into my account with Python and get python to print the messages I received in my mailbox. I know how to connect

import getpass, poplib
user = 'my_user_name' 
Mailbox = poplib.POP3_SSL('pop.googlemail.com', '995') 
Mailbox.user(user) 
Mailbox.pass_('my_password') 

I don't know how to get Python to display my messages. I tried all the functions in the poplib doc. They only display numbers.

like image 983
user1119429 Avatar asked Dec 29 '11 14:12

user1119429


People also ask

What is Poplib?

Source code: Lib/poplib.py. This module defines a class, POP3 , which encapsulates a connection to a POP3 server and implements the protocol as defined in RFC 1939. The POP3 class supports both the minimal and optional command sets from RFC 1939.

What is POP3 access?

POP3 (Incoming) Post Office Protocol version 3 (POP3) is an mail protocol used to retrieve mail from a remote server to a local email client. POP3 copies the mail from the remote server into the local mail client. Optionally, mail is deleted after it is downloaded from the server. This saves space on the server.


2 Answers

Using the POP3 example from the docs:

import getpass, poplib
user = 'my_user_name' 
Mailbox = poplib.POP3_SSL('pop.googlemail.com', '995') 
Mailbox.user(user) 
Mailbox.pass_('my_password') 
numMessages = len(Mailbox.list()[1])
for i in range(numMessages):
    for msg in Mailbox.retr(i+1)[1]:
        print msg
Mailbox.quit()
like image 178
unutbu Avatar answered Oct 20 '22 10:10

unutbu


You have not posted your source code, but here is my response:

How to get the total number of messages:

(numMsgs, totalSize) = self.conn_pop3.stat()

How to get a specific message, knowing its number in the mailbox:

(server_msg, body, octets) = self.conn_pop3.retr(number)

So the function you might need is retr, it returns a tuple. See here.

Careful it also sets the respective email as SEEN on the server! You can probably undo that, at least with IMAP you can.

And my implementation of a pop3 lib email read:

from poplib  import POP3
...
    if self.pop3_connected:            
        try:
            #------Check if email number is valid----------------------
            (numMsgs, totalSize) = self.conn_pop3.stat()
            self.debug(200, "Total number of server messages:    ", numMsgs)                
            self.debug(200, "Total size   of server messages:    ", totalSize)
            if  number>numMsgs:
                self.debug(200, "\nSorry - there aren't that many messages in your inbox\n")
                return False
            else:
                (server_msg, body, octets) = self.conn_pop3.retr(number)
                self.debug(200, "Server Message:    "   , server_msg)
                self.debug(200, "Number of Octets:    " , octets)
                self.debug(200, "Message body:")
                for line in body:
                    print line
                #end for
                return True
            #endif
        finally:
            self.__disconnect__()      
    #endif 

Also here is the POP3 connection, at least how I implemented it...sort of tricky using a string comparison, but it worked for my app:

def __connect_pop3__(self):
    """\brief Method for connecting to POP3 server                        
       \return True   If connection to POP3 succeeds or if POP3 is already connected
       \return False  If connection to POP3 fails
    """
    #------Check that POP3 is not already connected-----------------------
    if not self.pop3_connected:
        #------Connect POP3-----------------------------------------------
        self.debug(100, 'Connecting POP3 with: ', self.host_name, self.user_name, self.pass_name)
        self.conn_pop3 = POP3(self.host_name)            
        res1 = self.conn_pop3.user(self.user_name)
        string1 = str(res1)      
        self.debug(100, 'User identification result:', string1) 
        res2 = self.conn_pop3.pass_(self.pass_name)        
        string2 = str(res2)                
        self.debug(100, 'Pass identification result:', string2)                        
        #------Check if connection resulted in success--------------------
        #------Server on DavMail returns 'User successfully logged on'----
        if  string2.find('User successfully logged on')<>-1 or string1.find('User successfully logged on')<>-1 :
            self.pop3_connected = True            
            return True
        else:
            return False
        #endif         
    else:       
        self.debug(255, 'POP3 already connected')
        return True
    #endif 
like image 22
Radu Avatar answered Oct 20 '22 11:10

Radu