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"]
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"]
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"]
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))
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"]
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"]
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))
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:
def message(message_filepath): return emlx.read(message_filepath)
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 = {