-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
47edb66
commit 3dfd3b6
Showing
23 changed files
with
369 additions
and
153 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
2.7.18 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,25 +1,36 @@ | ||
# read version from installed package | ||
from importlib.metadata import version | ||
from . import session | ||
from .session import noop | ||
from .action import ActionNone | ||
from .email_filter import EmailFilterNone | ||
from .email_filter import ListFilter | ||
|
||
|
||
__version__ = version("nomail") | ||
|
||
__all__ = [ | ||
'filter', | ||
'noop', | ||
] | ||
|
||
def filter(): | ||
def filter(rate_limit: int = 1): | ||
blacklist = get_blacklist() | ||
emails = session.run(ActionNone(), ListFilter(blacklist), rate_limit) | ||
print_summary(emails) | ||
|
||
|
||
def get_blacklist(): | ||
try: | ||
with open('blacklist.csv') as f: | ||
blacklist = f.read().splitlines() | ||
except FileNotFoundError: | ||
print("blacklist.csv not found") | ||
blacklist = [] | ||
emails_processed = session.run(ActionNone(), EmailFilterNone()) | ||
print(f'{emails_processed} emails processed') | ||
return blacklist | ||
|
||
|
||
def print_summary(emails): | ||
print(f"{len(emails)} email{plural(emails)} processed") | ||
|
||
|
||
def print_summary_verbose(emails): | ||
print(f'{emails=} ') | ||
print_summary(emails) | ||
|
||
|
||
def noop(): | ||
session.connect() | ||
def plural(emails): | ||
return 's' if len(emails) != 1 else '' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,33 +1,13 @@ | ||
from abc import ABC, abstractmethod | ||
from typing import List | ||
|
||
from .email import Email | ||
|
||
class EmailFilter(ABC): | ||
"""Filter emails""" | ||
|
||
@abstractmethod | ||
def test(self, email): | ||
pass | ||
|
||
|
||
class EmailFilterNone(EmailFilter): | ||
"""no filtering""" | ||
|
||
def test(self, email): | ||
return True | ||
|
||
|
||
class EmailFilterAll(EmailFilter): | ||
"""filter all emails""" | ||
|
||
def test(self, email): | ||
return False | ||
|
||
|
||
class EmailFilterList(EmailFilter): | ||
"""filter senders not in list""" | ||
|
||
def __init__(self, address_list): | ||
class ListFilter(): | ||
def __init__(self, address_list: List[str] = None): | ||
if address_list is None: | ||
address_list = [] | ||
self._address_list = address_list | ||
|
||
def test(self, email): | ||
def apply(self, email: Email) -> bool: | ||
return email.sender in self._address_list |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,6 @@ | ||
import email | ||
import imaplib | ||
from typing import List, Optional | ||
|
||
from .env import CREDENTIALS, PROVIDER | ||
from .util import split_bytes | ||
|
@@ -11,33 +12,40 @@ def __init__(self): | |
try: | ||
self._imap = imaplib.IMAP4_SSL(PROVIDER) | ||
except ConnectionRefusedError as e: | ||
raise e | ||
print("couldn't connect to imap email server") | ||
print("this is most likely due to incorrect credentials, check your env file") | ||
return | ||
except BaseException as e: | ||
print(f'{e=}') | ||
print(f'PROVIDER={PROVIDER}') | ||
raise e | ||
self._imap.login(*CREDENTIALS) | ||
self._imap.select() | ||
|
||
def get_msgs(self): | ||
return [self.get_msg_data(uid) for uid in self.get_uids()] | ||
def get_msg_data(self, uid): | ||
def get_msgs(self) -> List[str]: | ||
return [self.get_msg_data(uid) for uid in self.get_uids()] | ||
|
||
def get_msg_data(self, uid: int) -> str: | ||
return email.message_from_bytes(self.fetch_msg_from_server(uid)) | ||
|
||
def fetch_msg_from_server(self, uid): | ||
def fetch_msg_from_server(self, uid: int) -> bytes: | ||
return self._imap.fetch(uid, "(RFC822)")[1][0][1] | ||
|
||
def get_uids(self): | ||
def get_uids(self) -> List[int]: | ||
return split_bytes(self.fetch_uids_from_server()) | ||
|
||
def fetch_uids_from_server(self): | ||
return self._imap.search(None, "ALL")[1][0] | ||
|
||
def fetch_noop_from_server(self) -> None: | ||
def fetch_uids_from_server(self) -> bytes: | ||
sender = "[email protected]" | ||
email = f'FROM {sender}' | ||
ids = self._imap.search(None, email)[1][0] | ||
return ids | ||
# return self._imap.search(None, "ALL")[1][0] | ||
|
||
def noop(self) -> None: | ||
print(self._imap.noop()) | ||
def delete_msg(self, uid): | ||
|
||
def delete_msg(self, uid: int) -> None: | ||
self._imap.store(uid, '+X-GM-LABELS', '\\Trash') | ||
|
||
def copy_msg(self, uid): | ||
def copy_msg(self, uid: int) -> None: | ||
self._imap.copy(uid, "Trabajos") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.