FromDate='24-11-2019' ## Mention the date range to start
ToDate='25-11-2019' ## Mention the date range to stop
emailto=['XXX@XXXX.com'] ## Provide an email where you need to send the report.
emailfrom='YYYY@YYY.com' ## Mention the valid email id for sending the mail for "emailto" option
password='ZBC@123' ## Mention your password for "emailfrom"
smtpserver='smtp.gmail.com' # Provide a valid server ,for example: smtp.gmail.com
port=587                    #Provide a valid port number

msgbody=r'''
Hi

Please find the attachment which contains all the browser' history

Thank you.
'''


import os
import socket
import smtplib
import mimetypes
import ctypes
import urllib2
import zipfile
import shutil
from email.mime.multipart import MIMEMultipart
from email import encoders
from email.message import Message
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from subprocess import PIPE, Popen

def computername():
    return os.environ['COMPUTERNAME']

def ipaddress():
    return socket.gethostbyname(socket.gethostname())

def emailreport(subject, emailto,emailfrom,fileToSend,password,smtpserver,port,msgbody):
    msg = MIMEMultipart()
    msg["From"] = emailfrom
    msg["To"] = ",".join(emailto)
    msg["Subject"] = subject
    msg.preamble = subject
    body = MIMEText(msgbody)
    msg.attach(body)       
    with open(fileToSend, 'rb') as fp:
        record = MIMEBase('text', 'octet-stream')
        record.set_payload(fp.read())
        encoders.encode_base64(record)
        record.add_header('Content-Disposition', 'attachment', filename=os.path.basename(fileToSend))
        msg.attach(record)
    try:
        server = smtplib.SMTP(smtpserver,port)
        server.ehlo()
        server.starttls()
        server.login(emailfrom, password)
        server.sendmail(emailfrom, emailto, msg.as_string())
        server.quit()
        return "the email report has been sent to "+msg["To"]
    except Exception as e:
        return e

def ecmd(CMD, r=False):
    class disable_file_system_redirection:
        _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection
        _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection
        def __enter__(self):
            self.old_value = ctypes.c_long()
            self.success = self._disable(ctypes.byref(self.old_value))
        def __exit__(self, type, value, traceback):
            if self.success:
                self._revert(self.old_value)
    
    with disable_file_system_redirection():
        OBJ = Popen(CMD, shell = True, stdout = PIPE, stderr = PIPE)
    out, err = OBJ.communicate()
    ret=OBJ.returncode
    if r:
        return ret
    else:            
        if ret==0:
            return out
        else:
            return ret

if 'PROGRAMW6432' in os.environ.keys():
    url='http://www.nirsoft.net/utils/browsinghistoryview-x64.zip'
else:
    url='http://www.nirsoft.net/utils/browsinghistoryview.zip'

open_url=urllib2.urlopen(url)
url_returncode=open_url.code
temp=os.environ['ProgramData']
if url_returncode==200:
    zf=os.path.join(temp, url.split('/')[-1])
    with open(zf, 'wb') as w:
        w.write(open_url.read())
        
            
else:
    print url_returncode, 'error with download url'

z=zipfile.ZipFile(zf, 'r')
ep=os.path.join(temp, url.split('/')[-1][:-4])
z.extractall(ep)
z.close()
os.remove(zf)
if os.path.exists(ep):
    pf=os.path.join(ep, 'BrowsingHistoryView.exe')
    if os.path.isfile(pf):
        pf =os.path.join(ep, 'BrowsingHistoryView.exe /HistorySource 1 /VisitTimeFilterType 4 /VisitTimeFrom "%s" /VisitTimeTo "%s 12:00:00" /sort "Visit Time" '%(FromDate,ToDate))
        cf=os.path.join(temp, 'browsinghistory.csv')
        c = '%s /scomma "%s"'%(pf, cf)
        ec=ecmd('%s /scomma "%s"'%(pf, cf), r=True)
        if ec==0:
            subject=computername()+'::'+ipaddress()+' Browser History Report'
            print emailreport(subject,emailto,emailfrom,cf,password,smtpserver,port,msgbody)
            os.remove(cf)
        else:
            print ec, 'error on report creation'
    shutil.rmtree(ep)
else:
    print 'error on extraction ...'
