Esempio n. 1
0
def test_message_plist_only(message_filepath):
    message = emlx.read(message_filepath, plist_only=True)
    assert message.bytecount == TEST_BYTECOUNT
    assert message.url is None
    assert message.get_payload() is None
    assert message.plist == TEST_PLIST
    assert message.flags == TEST_PLIST["flags"]
Esempio n. 2
0
def test_message_buffered_as_bytesio(message_content):
    filebuffer = io.BytesIO(message_content)
    message = emlx.read(filebuffer)
    assert message.bytecount == TEST_BYTECOUNT
    assert message.id == TEST_MESSAGE_ID
    assert len(message.get_payload()) == TEST_PAYLOAD_LENGTH
    assert message.plist["flags"] == TEST_PLIST["flags"]
Esempio n. 3
0
def test_message_buffered_via_open(message_filepath):
    with open(message_filepath, "rb") as filebuffer:
        message = emlx.read(filebuffer)
    assert message.bytecount == TEST_BYTECOUNT
    assert message.id == TEST_MESSAGE_ID
    assert len(message.get_payload()) == TEST_PAYLOAD_LENGTH
    assert message.plist["flags"] == TEST_PLIST["flags"]
Esempio n. 4
0
def search_fetch_local(inbox, N=20000):
    import emlx
    import glob

    counter = 0
    counter_no_body = 0
    for filepath in glob.iglob(inbox + "/**", recursive=True):
        if counter > N:
            break
        if filepath.endswith(".emlx"):
            try:
                counter += 1
                logger.info("Email number: {}".format(counter))
                message = emlx.read(filepath)
                body_count = int(process_email(message))
                if body_count == 0:
                    logger.debug(
                        "This email seems to have faulty body: {}".format(
                            type(body)))
                    counter_no_body += 1
                # logger.debug(message.get_payload(decode=True))
                # logger.debug(message._payload)
            except Exception as e:
                logger.debug(str(e))
    logger.info("{} emails populate in db".format(counter))
    logger.info("{} emails with no body".format(counter_no_body))
Esempio n. 5
0
def test_message_plist_only_as_bytesio(message_content):
    filebuffer = io.BytesIO(message_content)
    message = emlx.read(filebuffer, plist_only=True)
    assert message.bytecount == TEST_BYTECOUNT
    assert message.url is None
    assert message.get_payload() is None
    assert message.plist == TEST_PLIST
    assert message.flags == TEST_PLIST["flags"]
Esempio n. 6
0
def test_message_plist_only_via_open(message_filepath):
    with open(message_filepath, "rb") as filebuffer:
        message = emlx.read(filebuffer, plist_only=True)
    assert message.bytecount == TEST_BYTECOUNT
    assert message.url is None
    assert message.get_payload() is None
    assert message.plist == TEST_PLIST
    assert message.flags == TEST_PLIST["flags"]
Esempio n. 7
0
def search_fetch_local(inbox, N=100000):
    import emlx
    import glob

    counter = 0
    for filepath in glob.iglob(inbox + "/**", recursive=True):
        if counter > N:
            break
        if filepath.endswith(".emlx"):
            counter += 1
            try:
                message = emlx.read(filepath)
                process_email(message)
                # print(message.get_payload(decode=True))
                # print(message._payload)
            except Exception as e:
                print(str(e))
    print("Fetched messages {}".format(counter))
Esempio n. 8
0
stdin = sys.stdin.read().strip()
if stdin:
    email_files = stdin.split('\n')
else:
    email_files = []

subject_regex = re.compile(r'^[Rr][Ee]: ')
mbox_regex = re.compile(r'[^/]+\.mbox')
now = datetime.now(timezone.utc)
alerter_cmd = os.getenv('HOME') + '/bin/alerter -appIcon /System/Applications/Mail.app/Contents/Resources/ApplicationIcon.icns -timeout 10'

latest_threads = {}

for f in email_files:
    m = emlx.read(f).headers
    date = datetime.strptime(m['Date'], '%a, %d %b %Y %H:%M:%S %z')
    if date < now - timedelta(hours=1):
        continue
    m['Date'] = date
    m['__file__'] = f
    subject = subject_regex.sub('', m['Subject']).replace('\n', '')
    m['Subject'] = subject
    if latest_threads.setdefault(subject, m)['Date'] < date:
        latest_threads[subject] = m

emails = list(latest_threads.values())
emails.sort(key=lambda m: m['Date'])
top_threads = emails[-5:]

for email in top_threads:
Esempio n. 9
0
def message(message_filepath):
    return emlx.read(message_filepath)
Esempio n. 10
0
try:
    input_string = sys.argv[1]
except IndexError as e:
    sys.exit()

output = []

messages = os.path.expanduser("~/Library/Mail/V7/")
for folder in glob.glob(messages + "/*"):
    contents = os.listdir(folder)
    if "INBOX.mbox" in contents:
        break

for emlx in glob.glob(os.path.join(folder, "*/*/Data/Messages/*")):
    emlxObj = read(emlx)
    headers = emlxObj.headers
    from_address = headers.get("From", "")
    subject = headers.get("Subject", "")
    to = headers.get("To", "")
    cc1 = headers.get("Cc", "")
    cc2 = headers.get("CC", "")
    search_pool = normalize(from_address + subject + to + cc1 + cc2)
    if input_string in search_pool:
        date = headers["Date"]
        lastColon = date.rfind(":")
        formattedDate = date[0:lastColon + 3].replace(",", "")
        formattedDate = re.sub(r"^[^\d]+", "", formattedDate)
        timestamp = datetime.datetime.strptime(
            formattedDate, "%d %b %Y %H:%M:%S").timestamp()
        msg = {