It might be interesting to run w/ -X:ExceptionDetail to see where the OOM is 
actually coming from.  It could be that there's one giant allocation which is 
failing or it could be that something's broken and causing a big loop which 
allocates forever.  -X:ExceptionDetail might given an indication of which one 
it is.

From: users-boun...@lists.ironpython.com 
[mailto:users-boun...@lists.ironpython.com] On Behalf Of matan keret
Sent: Sunday, November 15, 2009 8:34 AM
To: Discussion of IronPython
Subject: [IronPython] poplib.POP3_SSL OutOfMemory Issue

Hi everyone!

i wrote the next code which suppose to go to my hotmail account, fetch the last 
email's image attachment and save it to a file:


import email, poplib, os, string
def get_messages_id(message_list):
    items = []
    for message in message_list[1]:
        message_parts = string.split(message,' ')
        message_id = message_parts[0]
        items.append(message_id)
#        print 'message id is: %s\n' % message_id
#    print 'done getting ids'
    return items

host = "pop3.live.com<http://pop3.live.com>"
detach_dir = 'D:\\test-attachments\\'  # directory where to save attachments 
(default: current)
user = "matan...@hotmail.com<mailto:matan...@hotmail.com>"
pwd = "0okmnji9"
server = poplib.POP3_SSL(host)
server.user(user)
server.pass_(pwd)

numMessages = len(server.list()[1])
#print numMessages
# server.list() returns messages info from server in
# form of response, message_list, size where message_list
# is. a list of messages in form of 'message_id size'
message_list = server.list()
# get the list of items id
items = get_messages_id(message_list)
items.reverse() # puts the last received mail's id in the first place in list
is_image = False
# find the first mail in items that has an attachment and get the attachment
for emailid in items:
    # if we found an email with an image we break
    if is_image:
        break

    total_email_message = server.retr(emailid)[1]
    messageText = string.join(total_email_message, "\n")

    mail = email.message_from_string(messageText) # parsing the mail content to 
get a mail object

    # Check if there are any attachments at all
    if mail.get_content_maintype() != 'multipart':
        continue

    # we use walk to create a generator so we can iterate on the parts
    for part in mail.walk():

        # skip any attachment which is not an image
        if part.get_content_maintype() != 'image':
            continue

        # is this part an attachment ?
        if part.get('Content-Disposition') is None:
            continue

        filename = part.get_filename()
        is_image = True

        # if there is no filename, we create one with a counter to avoid 
duplicates
        if not filename:
            filename = 'part-%03d%s' % (1, 'bin')

        att_path = os.path.join(detach_dir, filename)

        # Check if its not already there and finally write the file
        if not os.path.isfile(att_path) :
            fp = open(att_path, 'wb')
            fp.write(part.get_payload(decode=True))
            fp.close()

        # if we found an email with an image we break after first image 
downloaded
        if is_image:
            break
server.quit()
print 'Finished fetching the image'
# THE END

also available at: http://pastebin.org/53873


This works fine on Cpython but on IronPython 2.0.3 I get:

Traceback (most recent call last):
  File "get_first_attachment.py", line 21, in get_first_attachment.py
  File "D:\IronPython 2.0.3\Lib\poplib.py", line 361, in __init__
  File "D:\IronPython 2.0.3\Lib\poplib.py", line 137, in _getresp
  File "D:\IronPython 2.0.3\Lib\poplib.py", line 374, in _getline
  File "D:\IronPython 2.0.3\Lib\poplib.py", line 364, in _fillBuffer
MemoryError: Exception of type 'System.OutOfMemoryException' was thrown.

this comes out from line 21:

server = poplib.POP3_SSL(host)

Any ideas why is that? How to fix it? Is it a known issue (tried to look but 
couldn't find)?

Thanks,

  Matan
_______________________________________________
Users mailing list
Users@lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to