s4ros icon

IMAP attachments download

s4ros | PRO | 11/26/16 06:47:24 PM UTC | 0 ⭐ | 360 👁️ | Never ⏰ | []
Python |

4.32 KB

|

None

|

0 👍

/

0 👎

import email
import getpass, imaplib
import os
import sys, shutil
import datetime
import logging
 
##
## Variables to set
##
detach_dir = '/tmp'
archive_dir = 'archive'
userName = 'uuuu'
passwd = 'pppppppp'
mailserver='mail.mmmm.com'
 
# actual time and date
now = datetime.datetime.now()
 
if not os.path.isdir(detach_dir):
    os.mkdir(detach_dir)
 
log_file=os.path.join(detach_dir,'imap.log')
logging.basicConfig(filename=log_file,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger('imap')
logger.setLevel(logging.DEBUG)
 
if archive_dir not in os.listdir(detach_dir):
    logger.warning('archive directory does not exist, crating one..')
    os.mkdir(os.path.join(detach_dir,archive_dir))
 
# create logger
 
# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
 
# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
 
# add formatter to ch
ch.setFormatter(formatter)
 
# add ch to logger
logger.addHandler(ch)
 
# 'application' code
# logger.debug('debug message')
 
 
def get_attachments():
    try:
        # logging into account
        logger.debug('username: %s, passwd: %s' %(userName,passwd))
        imapSession = imaplib.IMAP4_SSL(mailserver)
        typ, accountDetails = imapSession.login(userName, passwd)
        logger.info('Logging answer: %s' % typ)
        if typ != 'OK':
            print 'Not able to sign in!'
            raise
 
        # open INBOX directory and search only for UNSEEN (unread) messages
        imapSession.select('INBOX')
        typ, data = imapSession.search(None, 'UNSEEN')
        logger.debug('Opening INBOX directory answer: %s' % typ)
        if typ != 'OK':
            print 'Error searching Inbox.'
            raise
 
        # Iterating over all unseen emails
        for msgId in data[0].split():
            typ, messageParts = imapSession.fetch(msgId, '(RFC822)')
            logger.debug('Fetching whole email message answer: %s' % typ)
            if typ != 'OK':
                print 'Error fetching mail.'
                raise
 
            emailBody = messageParts[0][1]
            mail = email.message_from_string(emailBody)
            # iterating over all attachments in email
            for part in mail.walk():
                if part.get_content_maintype() == 'multipart':
                    # print part.as_string()
                    continue
                if part.get('Content-Disposition') is None:
                    # print part.as_string()
                    continue
                # get the filename of attachment
                fileName = part.get_filename()
                logger.debug('I have found file: %s' % fileName)
 
                if bool(fileName):
                    # full path to file where attachment should be saved
                    # filePath = os.path.join(detach_dir, 'archive', fileName)
                    filePath = os.path.join(detach_dir, fileName)
                    # move existing file to the archive
                    if os.path.isfile(filePath):
                        logger.debug('Moving old %s to %s dir.' % (fileName,archive_dir))
                        try:
                            deltatime = now - datetime.timedelta(days=7)
                            path_date = deltatime.strftime("%Y-%m-%d")
                            new_fileName = '%s_%s' % (path_date,fileName)
                            shutil.move(filePath,os.path.join(detach_dir,archive_dir,new_fileName))
                        except:
                            logger.error('Couldnt move %s to %s directory' % (fileName, archive_dir))
                    logger.info('Attachment %s will be saved as %s' % (fileName,filePath))
                    # if not os.path.isfile(filePath) :
                    # print fileName
                    fp = open(filePath, 'wb')
                    fp.write(part.get_payload(decode=True))
                    fp.close()
        imapSession.close()
        imapSession.logout()
        return 0
    except :
        logger.error('Not able to download all attachments.')
        return 1
 
if __name__ == '__main__':
    logger.info('IMAP script session opened.')
    get_attachments()
    logger.info('IMAP script session closed.')

Comments