FAQ
I have a (fairly) simple script that does 'catchall' processing on my
POP3 mailbox. It looks for messages To: strings that *might* be for
me and then throws everything else away.


I was getting the occasional error as follows:-


     Traceback (most recent call last):
       File "/home/chris/.mutt/bin/getCatchall.py", line 59, in <module>
         popmsg = pop3.retr(i+1)
       File "/usr/lib/python2.7/poplib.py", line 232, in retr
         return self._longcmd('RETR %s' % which)
       File "/usr/lib/python2.7/poplib.py", line 167, in _longcmd
         return self._getlongresp()
       File "/usr/lib/python2.7/poplib.py", line 152, in _getlongresp
         line, o = self._getline()
       File "/usr/lib/python2.7/poplib.py", line 377, in _getline
         raise error_proto('line too long')
     poplib.error_proto: line too long




So I added a try/except round the pop3.retr() and now I get this error:-


     Traceback (most recent call last):
       File "/home/chris/.mutt/bin/getCatchall.py", line 63, in <module>
         x = pop3.dele(i+1)
       File "/usr/lib/python2.7/poplib.py", line 240, in dele
         return self._shortcmd('DELE %s' % which)
       File "/usr/lib/python2.7/poplib.py", line 160, in _shortcmd
         return self._getresp()
       File "/usr/lib/python2.7/poplib.py", line 136, in _getresp
         raise error_proto(resp)
     poplib.error_proto: Data Base /Diamond /Arm /Freeway /Pocket /Barbecue
     /Bathroom /Eyes /Train /Hat /Planet /Web /Girl /Surveyor /Rocket
     /Slave /Software /Vampire /Vacuum /Sun /Egg /Leg /Ice /Guitar
     /Post-office /Pepper /Hat /Eartupletters:10,50:
     AAMGQLMUHSMCCVXEOPQRDWUSFEJFSHPEAQWHh /Spiral /Garden /Tennis racquet
     /Banana /Spectrum /Bed /Fruit /Earth /Wheelchair /Spoon /Bee /Highway
     /God /Guitar /Sandpaper /Typewriter /Finger /Feather /Salt
     /Electricity /Pants /Sphere /Table /Comet / /Bee /Button /Map /Data
     Base /Hieroglyph /Carpet /Hose /Bank /Fire /Solid /Staircase /Eyes
     /Rope /School /Onion /Barbecue /Gemstone /Ice-cream /Nail /Alphabet
     /Feather /Compass /Bottle /Shop /Fruit /Map /Sphere /Coffee /Radar
     /Tongue /Tapestry /Radar /Sandwich /Circus /Spectrum /Aeroplane /Clock
     /Room /Stomach /Snail / Satellite /Worm /Money $$$$ /Bed /Pyramid /Boy
     /Pepper /Fruit /Junk /Bank /Bird /Pebble /Chair /Microscope /Satellite
     /Woman /Kaleidoscope /Perfume /Triangle /Sunglasses /Needle
     /Thermometer /Freeway /Man /Mist upletters:10,50:
     TQDPDUGSMYEPJGBPYCTEIKMNFXKCSNDY/Vulture /Thermometer /Treadmill
     /Pillow /Hose /Necklace /Coffee-shop /Space Shuttle /Pyramid /Rope
     /Surveyor /Spot Light /Nail /Bed /Mist /Sandwich /Family /Salt /Fan
     /Air /Maze /Mouth /Vacuum /Tongue /Bible /Gate /Wheelchair /Jet
     fighter /Bible /Tunnel /Navy /Festival /Shop /Tapestry /Shower
     /Cappuccino /Sandpaper /PaintBrush /Prison /Sex /Church /Man /Meat
     /Ring /Snail /Floodlight /Toilet /Shower /Computer /Tiger /Diamond
     /Bathroom /Boss /Leather jacket /Dress /Ship /Finger /Torpedo /Car
     /Compass /Water /Mist /Butterfly /Staircase /Child /Backpack /Umbrella
     /Tiger /School /Explosive /Restaurant /Bird /Cycle /Television
     /Cappuccino /Bible /Kaleidoscope /Drill /Church /Television
     /Hieroglyph /Game /Fungus /Sword /Gloves /Highway /Box functon /2022
     /browser /cowritten /livinglogic /ione /800 /susceptibles /psz




Can anyone make any suggestions as to how to overcome this issue, all
I want to do is throw away the offending message.




The code for the whole thing is as follows:-


     #!/usr/bin/python
     #
     #
     # Collect E-Mail from my catchall POP3 mailbox on tsohost, deliver anything
     # that looks remotely useful and bin the rest
     #
     #
     import getpass, poplib
     import email
     import mailbox
     import string
     import smtplib
     import time
     import mailLib


     home = "/home/chris"


     log = mailLib.initLog("getCatchall")
     #
     #
     # Read the filter file
     #
     fltr = {}
     f = open(home + "/.mutt/getCatchall.filter", 'r')
     for ln in f: # for each line in filter
         if ln[0] == '#': # ignore comments
             continue
         #
         #
         # split the line into fields and store in a dictionary
         #
         fld = ln.split()
         fltr[fld[0]] = fld[1]
     #
     #
     # Process the messages, do a maximum of 100 at a time
     #
     while (1):
         #
         #
         # Connect to the POP3 server, get message count, exit if no messages
         #
         pop3 = poplib.POP3_SSL('pop.isbd.net')
         pop3.user('catchall at isbd.net')
         pop3.pass_('XXXXXXXX')
         numMessages = len(pop3.list()[1])
         if (numMessages == 0):
             break
         #
         #
         # Process a maximum of 100 messages
         #
         log.info(str(numMessages) + " messages")
         for i in range(min(numMessages, 100)):
             #
             #
             # Read each message into a string and then parse with the email module, if
             # there's an error retrieving the message then just throw it away
             #
             try:
                 popmsg = pop3.retr(i+1)
             except:
                 pop3.dele(i+1)
                 continue


             log.info("Retrieved message number " + str(i+1))
             msgstr = string.join(popmsg[1], "\n") # popmsg[1] is a list containing the lines of the message
             msg = mailbox.mboxMessage(msgstr)
             #
             #
             # Look for names from the filter file in To: and Cc:, deliver message if possibly relevant
             #
             for nm, dest in fltr.items():
                 if (msg.get("To","unknown").find(nm) >= 0) or (msg.get("Cc", "unknown").find(nm) >= 0):
                     log.info( "Sending message, Subject: " + msg.get("Subject", "No subject") + ", To: " + dest)
                     if '@' in dest:
                         try:
                             #
                             #
                             # Connect to the SMTP server and send the message
                             #
                             smtp = smtplib.SMTP('smtp.isbd.net')
                             smtp.login("catchall at isbd.net", "XXXXXXXX")
                             smtp.sendmail("catchall at isbd.net", dest, msgstr)
                             smtp.quit()
                         except:
                             #
                             #
                             # If the message can't be sent then give it to me locally
                             #
                             mailLib.deliverMboxMsg(dest, msg, log)
                     else:
                         #
                         #
                         # Put message in local mbox
                         #
                         mailLib.deliverMboxMsg(dest, msg, log)
                     break
             #
             #
             # delete the message from the POP3 mailbox
             #
             log.info("Deleting message " + msg.get("To","unknown"))
             pop3.dele(i+1)
         #
         #
         # disconnect, only when this is done do the POP3 messages actually disappear
         #
         pop3.quit()
         #
         #
         # Exit if no more messages (the normal case) otherwise wait a minute before
         # processing any more, otherwise we get zombie messages which
         # cause "poplib.error_proto: -ERR Can't open the message file - it's gone!"
         #
         if (numMessages > 100):
             time.sleep(60)
         else:
             break






--
Chris Green
?

Search Discussions

  • Cl at Sep 11, 2015 at 5:13 pm

    cl at isbd.net wrote:
    I have a (fairly) simple script that does 'catchall' processing on my
    POP3 mailbox. It looks for messages To: strings that *might* be for
    me and then throws everything else away.
    [snip]


    Sorry folks, I found the problem, it's a known 'bug' due to someone
    trying to protect poplib from excessively long lines. See:-


         https://bugs.python.org/issue16041


    It's easy to work around by something like:-


         import poplib
         poplib._MAXLINE 480




    --
    Chris Green
    ?
  • Laura Creighton at Sep 11, 2015 at 7:17 pm

    In a message of Fri, 11 Sep 2015 17:33:32 +0100, cl at isbd.net writes:
    I have a (fairly) simple script that does 'catchall' processing on my
    POP3 mailbox. It looks for messages To: strings that *might* be for
    me and then throws everything else away.

    Somebody tried to protect you from yourself.
    see https://bugs.python.org/issue1604


    after your imput do
    poplib._MAXLINE=<something large enough>
    20480 has been big enough for me ...


    Laura

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedSep 11, '15 at 4:33p
activeSep 11, '15 at 7:17p
posts3
users2
websitepython.org

2 users in discussion

Cl: 2 posts Laura Creighton: 1 post

People

Translate

site design / logo © 2019 Grokbase