auto-unsub 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Nithish1201
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,181 @@
1
+ Metadata-Version: 2.4
2
+ Name: auto-unsub
3
+ Version: 1.0.0
4
+ Summary: Scan Gmail for unsubscribe options and bulk unsubscribe from senders.
5
+ Author: Nithish1201
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/Nithish1201-code/AutoUnsub
8
+ Project-URL: Repository, https://github.com/Nithish1201-code/AutoUnsub
9
+ Project-URL: Issues, https://github.com/Nithish1201-code/AutoUnsub/issues
10
+ Keywords: gmail,unsubscribe,email,cli,productivity
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: End Users/Desktop
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Communications :: Email
21
+ Classifier: Topic :: Utilities
22
+ Requires-Python: >=3.10
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Requires-Dist: colorama>=0.4.6
26
+ Requires-Dist: keyring>=25.0
27
+ Dynamic: license-file
28
+
29
+ # AutoUnsub
30
+
31
+ A python tool that scans your Gmail inbox for senders with unsubscribe options and lets you unsubscribe from them without opening a bunch of emails yourself.
32
+
33
+ ## Overview
34
+
35
+ I made AutoUnsub because my inbox was getting kinda stupid with newsletters, random notifications, and stuff I signed up for once and completely forgot about.
36
+
37
+ Unsubscribing isn't really hard, but doing it over and over again is annoying, so I wanted to automate that part.
38
+
39
+ It uses Gmail IMAP to scan message headers and a small parser to figure out what unsubscribe option an email has. SQLite keeps track of the senders and messages so the same stuff doesn't keep getting counted.
40
+
41
+ I also didn't want to put everything into one massive Python file, so `main.py` is the only thing you actually run and everything else is split into smaller files.
42
+
43
+ <img width="1253" height="925" alt="image" src="https://github.com/user-attachments/assets/aa750961-83e9-48cc-bd40-a28c8f3c5c42" />
44
+
45
+ ## Features
46
+
47
+ | Feature | |
48
+ | ----------------------------------------------------- | - |
49
+ | Scan Gmail from however many days back you want | |
50
+ | Set a max number of messages to scan | |
51
+ | Detect one-click unsubscribe options | |
52
+ | Detect normal HTTP and HTTPS unsubscribe links | |
53
+ | Detect `mailto:` unsubscribe links | |
54
+ | Store senders and message data in SQLite | |
55
+ | Don't count the same message twice | |
56
+ | Show message counts for each sender | |
57
+ | Show unsubscribe methods | |
58
+ | Unsubscribe from one sender | |
59
+ | Unsubscribe from multiple senders | |
60
+ | Track successful and failed attempts | |
61
+ | Store the Gmail app password using the system keyring | |
62
+ | Colored terminal interface | |
63
+
64
+ <img width="1441" height="851" alt="image" src="https://github.com/user-attachments/assets/40babdb4-8bb8-497a-b073-03e4296dbc99" />
65
+
66
+ ## How It Works
67
+
68
+ `Gmail -> IMAP -> parser -> SQLite -> terminal -> unsubscribe`
69
+
70
+ The scanner only gets the headers it actually needs instead of downloading the whole email.
71
+
72
+ Then it pulls out the sender, date, and unsubscribe info and sends that into the parser.
73
+
74
+ The results get stored in SQLite so AutoUnsub remembers what it has already seen.
75
+
76
+ When you unsubscribe, it uses whatever method was found in the email.
77
+
78
+ One-click options use a POST request, normal links use an HTTP request, and `mailto:` options get turned into an email and sent through Gmail SMTP.
79
+
80
+ ## Project Structure
81
+
82
+ | Path | Contents |
83
+ | ------------------------ | ----------------------------------------- |
84
+ | `main.py` | the thing you actually run |
85
+ | `sweeper/config.py` | handles Gmail credentials |
86
+ | `sweeper/db.py` | DB |
87
+ | `sweeper/imap_scan.py` | scans Gmail |
88
+ | `sweeper/sweep.py` | connects the scanner, parser and database |
89
+ | `sweeper/unsub_parse.py` | figures out unsubscribe methods |
90
+ | `sweeper/unsubscribe.py` | actually sends the unsubscribe request |
91
+ | `tests/` | tests for everything |
92
+ | `requirements.txt` | Python dependencies |
93
+ | `README.md` | this file |
94
+
95
+ ## Install
96
+
97
+ ### From PyPI
98
+
99
+ Once released, the normal user install will be:
100
+
101
+ ```bash
102
+ python -m pip install auto-unsub
103
+ auto-unsub
104
+ ```
105
+
106
+ This installs AutoUnsub as a real command-line application, so users do not need to clone the repository.
107
+
108
+ ### From source
109
+
110
+ For development:
111
+
112
+ ```bash
113
+ python -m pip install -e .
114
+ auto-unsub
115
+ ```
116
+
117
+ ### Development setup
118
+
119
+ It is recommended to use a virtual environment so the dependencies don't pollute your global Python installation:
120
+
121
+ ```bash
122
+ python -m venv .venv
123
+ source .venv/bin/activate
124
+ ```
125
+
126
+ On Windows:
127
+
128
+ ```powershell
129
+ python -m venv .venv
130
+ .venv\Scripts\activate
131
+ ```
132
+
133
+ Then install the project:
134
+
135
+ ```bash
136
+ python -m pip install -e .
137
+ ```
138
+
139
+ ## Using AutoUnsub
140
+
141
+ On the first run it asks for your Gmail address and app password.
142
+
143
+ The app password gets stored using the system keyring so you don't have to enter it every time.
144
+
145
+ You do have to create the app password yourself from your Google account first.
146
+
147
+ <img width="636" height="349" alt="image" src="https://github.com/user-attachments/assets/ead0f025-be57-4020-8a56-6d1465b6fa4b" />
148
+
149
+ After that you choose how many days back you want to scan and how many messages you want to check.
150
+
151
+ Then it shows you what it found.
152
+
153
+ <img width="569" height="298" alt="image" src="https://github.com/user-attachments/assets/51aeb6e0-1397-44e1-b909-264d8b6d9218" />
154
+
155
+ ## What I Learned
156
+
157
+ Honestly this taught me way more than I expected.
158
+
159
+ I learned how Gmail IMAP works, how email headers are structured, and how unsubscribe headers can have a bunch of different formats.
160
+
161
+ I also got way more comfortable with SQLite and keeping state between runs.
162
+
163
+ The networking part was kinda interesting too because fetching messages one by one was ridiculously slow, so I changed it to fetch them in batches (default 25, but I can change this).
164
+
165
+ Real email data was also way messier than the fake tests I started with because some emails have no unsubscribe options at all and some have huge weird unsubscribe URLs.
166
+
167
+ ## Why I Built It
168
+
169
+ Mostly because I wanted it for myself.
170
+
171
+ <img width="1631" height="722" alt="image" src="https://github.com/user-attachments/assets/7caeb23b-b4fb-4604-ad5d-55b24db723ad" />
172
+
173
+ My inbox has a bunch of random stuff that I don't really care about anymore, and manually cleaning it up is just boring and repetitive.
174
+
175
+ ## Current Status
176
+
177
+ The main thing works now.
178
+
179
+ AutoUnsub can connect to Gmail, scan real messages, figure out which ones have unsubscribe options, save everything to SQLite, and actually send unsubscribe requests.
180
+
181
+ The interface is still pretty basic and there's still a lot I want to improve, mainly making the scanning less slow, handling weird unsubscribe services better, and making the whole thing feel like an actual finished app.
@@ -0,0 +1,153 @@
1
+ # AutoUnsub
2
+
3
+ A python tool that scans your Gmail inbox for senders with unsubscribe options and lets you unsubscribe from them without opening a bunch of emails yourself.
4
+
5
+ ## Overview
6
+
7
+ I made AutoUnsub because my inbox was getting kinda stupid with newsletters, random notifications, and stuff I signed up for once and completely forgot about.
8
+
9
+ Unsubscribing isn't really hard, but doing it over and over again is annoying, so I wanted to automate that part.
10
+
11
+ It uses Gmail IMAP to scan message headers and a small parser to figure out what unsubscribe option an email has. SQLite keeps track of the senders and messages so the same stuff doesn't keep getting counted.
12
+
13
+ I also didn't want to put everything into one massive Python file, so `main.py` is the only thing you actually run and everything else is split into smaller files.
14
+
15
+ <img width="1253" height="925" alt="image" src="https://github.com/user-attachments/assets/aa750961-83e9-48cc-bd40-a28c8f3c5c42" />
16
+
17
+ ## Features
18
+
19
+ | Feature | |
20
+ | ----------------------------------------------------- | - |
21
+ | Scan Gmail from however many days back you want | |
22
+ | Set a max number of messages to scan | |
23
+ | Detect one-click unsubscribe options | |
24
+ | Detect normal HTTP and HTTPS unsubscribe links | |
25
+ | Detect `mailto:` unsubscribe links | |
26
+ | Store senders and message data in SQLite | |
27
+ | Don't count the same message twice | |
28
+ | Show message counts for each sender | |
29
+ | Show unsubscribe methods | |
30
+ | Unsubscribe from one sender | |
31
+ | Unsubscribe from multiple senders | |
32
+ | Track successful and failed attempts | |
33
+ | Store the Gmail app password using the system keyring | |
34
+ | Colored terminal interface | |
35
+
36
+ <img width="1441" height="851" alt="image" src="https://github.com/user-attachments/assets/40babdb4-8bb8-497a-b073-03e4296dbc99" />
37
+
38
+ ## How It Works
39
+
40
+ `Gmail -> IMAP -> parser -> SQLite -> terminal -> unsubscribe`
41
+
42
+ The scanner only gets the headers it actually needs instead of downloading the whole email.
43
+
44
+ Then it pulls out the sender, date, and unsubscribe info and sends that into the parser.
45
+
46
+ The results get stored in SQLite so AutoUnsub remembers what it has already seen.
47
+
48
+ When you unsubscribe, it uses whatever method was found in the email.
49
+
50
+ One-click options use a POST request, normal links use an HTTP request, and `mailto:` options get turned into an email and sent through Gmail SMTP.
51
+
52
+ ## Project Structure
53
+
54
+ | Path | Contents |
55
+ | ------------------------ | ----------------------------------------- |
56
+ | `main.py` | the thing you actually run |
57
+ | `sweeper/config.py` | handles Gmail credentials |
58
+ | `sweeper/db.py` | DB |
59
+ | `sweeper/imap_scan.py` | scans Gmail |
60
+ | `sweeper/sweep.py` | connects the scanner, parser and database |
61
+ | `sweeper/unsub_parse.py` | figures out unsubscribe methods |
62
+ | `sweeper/unsubscribe.py` | actually sends the unsubscribe request |
63
+ | `tests/` | tests for everything |
64
+ | `requirements.txt` | Python dependencies |
65
+ | `README.md` | this file |
66
+
67
+ ## Install
68
+
69
+ ### From PyPI
70
+
71
+ Once released, the normal user install will be:
72
+
73
+ ```bash
74
+ python -m pip install auto-unsub
75
+ auto-unsub
76
+ ```
77
+
78
+ This installs AutoUnsub as a real command-line application, so users do not need to clone the repository.
79
+
80
+ ### From source
81
+
82
+ For development:
83
+
84
+ ```bash
85
+ python -m pip install -e .
86
+ auto-unsub
87
+ ```
88
+
89
+ ### Development setup
90
+
91
+ It is recommended to use a virtual environment so the dependencies don't pollute your global Python installation:
92
+
93
+ ```bash
94
+ python -m venv .venv
95
+ source .venv/bin/activate
96
+ ```
97
+
98
+ On Windows:
99
+
100
+ ```powershell
101
+ python -m venv .venv
102
+ .venv\Scripts\activate
103
+ ```
104
+
105
+ Then install the project:
106
+
107
+ ```bash
108
+ python -m pip install -e .
109
+ ```
110
+
111
+ ## Using AutoUnsub
112
+
113
+ On the first run it asks for your Gmail address and app password.
114
+
115
+ The app password gets stored using the system keyring so you don't have to enter it every time.
116
+
117
+ You do have to create the app password yourself from your Google account first.
118
+
119
+ <img width="636" height="349" alt="image" src="https://github.com/user-attachments/assets/ead0f025-be57-4020-8a56-6d1465b6fa4b" />
120
+
121
+ After that you choose how many days back you want to scan and how many messages you want to check.
122
+
123
+ Then it shows you what it found.
124
+
125
+ <img width="569" height="298" alt="image" src="https://github.com/user-attachments/assets/51aeb6e0-1397-44e1-b909-264d8b6d9218" />
126
+
127
+ ## What I Learned
128
+
129
+ Honestly this taught me way more than I expected.
130
+
131
+ I learned how Gmail IMAP works, how email headers are structured, and how unsubscribe headers can have a bunch of different formats.
132
+
133
+ I also got way more comfortable with SQLite and keeping state between runs.
134
+
135
+ The networking part was kinda interesting too because fetching messages one by one was ridiculously slow, so I changed it to fetch them in batches (default 25, but I can change this).
136
+
137
+ Real email data was also way messier than the fake tests I started with because some emails have no unsubscribe options at all and some have huge weird unsubscribe URLs.
138
+
139
+ ## Why I Built It
140
+
141
+ Mostly because I wanted it for myself.
142
+
143
+ <img width="1631" height="722" alt="image" src="https://github.com/user-attachments/assets/7caeb23b-b4fb-4604-ad5d-55b24db723ad" />
144
+
145
+ My inbox has a bunch of random stuff that I don't really care about anymore, and manually cleaning it up is just boring and repetitive.
146
+
147
+ ## Current Status
148
+
149
+ The main thing works now.
150
+
151
+ AutoUnsub can connect to Gmail, scan real messages, figure out which ones have unsubscribe options, save everything to SQLite, and actually send unsubscribe requests.
152
+
153
+ The interface is still pretty basic and there's still a lot I want to improve, mainly making the scanning less slow, handling weird unsubscribe services better, and making the whole thing feel like an actual finished app.
@@ -0,0 +1,181 @@
1
+ Metadata-Version: 2.4
2
+ Name: auto-unsub
3
+ Version: 1.0.0
4
+ Summary: Scan Gmail for unsubscribe options and bulk unsubscribe from senders.
5
+ Author: Nithish1201
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/Nithish1201-code/AutoUnsub
8
+ Project-URL: Repository, https://github.com/Nithish1201-code/AutoUnsub
9
+ Project-URL: Issues, https://github.com/Nithish1201-code/AutoUnsub/issues
10
+ Keywords: gmail,unsubscribe,email,cli,productivity
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: End Users/Desktop
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Communications :: Email
21
+ Classifier: Topic :: Utilities
22
+ Requires-Python: >=3.10
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Requires-Dist: colorama>=0.4.6
26
+ Requires-Dist: keyring>=25.0
27
+ Dynamic: license-file
28
+
29
+ # AutoUnsub
30
+
31
+ A python tool that scans your Gmail inbox for senders with unsubscribe options and lets you unsubscribe from them without opening a bunch of emails yourself.
32
+
33
+ ## Overview
34
+
35
+ I made AutoUnsub because my inbox was getting kinda stupid with newsletters, random notifications, and stuff I signed up for once and completely forgot about.
36
+
37
+ Unsubscribing isn't really hard, but doing it over and over again is annoying, so I wanted to automate that part.
38
+
39
+ It uses Gmail IMAP to scan message headers and a small parser to figure out what unsubscribe option an email has. SQLite keeps track of the senders and messages so the same stuff doesn't keep getting counted.
40
+
41
+ I also didn't want to put everything into one massive Python file, so `main.py` is the only thing you actually run and everything else is split into smaller files.
42
+
43
+ <img width="1253" height="925" alt="image" src="https://github.com/user-attachments/assets/aa750961-83e9-48cc-bd40-a28c8f3c5c42" />
44
+
45
+ ## Features
46
+
47
+ | Feature | |
48
+ | ----------------------------------------------------- | - |
49
+ | Scan Gmail from however many days back you want | |
50
+ | Set a max number of messages to scan | |
51
+ | Detect one-click unsubscribe options | |
52
+ | Detect normal HTTP and HTTPS unsubscribe links | |
53
+ | Detect `mailto:` unsubscribe links | |
54
+ | Store senders and message data in SQLite | |
55
+ | Don't count the same message twice | |
56
+ | Show message counts for each sender | |
57
+ | Show unsubscribe methods | |
58
+ | Unsubscribe from one sender | |
59
+ | Unsubscribe from multiple senders | |
60
+ | Track successful and failed attempts | |
61
+ | Store the Gmail app password using the system keyring | |
62
+ | Colored terminal interface | |
63
+
64
+ <img width="1441" height="851" alt="image" src="https://github.com/user-attachments/assets/40babdb4-8bb8-497a-b073-03e4296dbc99" />
65
+
66
+ ## How It Works
67
+
68
+ `Gmail -> IMAP -> parser -> SQLite -> terminal -> unsubscribe`
69
+
70
+ The scanner only gets the headers it actually needs instead of downloading the whole email.
71
+
72
+ Then it pulls out the sender, date, and unsubscribe info and sends that into the parser.
73
+
74
+ The results get stored in SQLite so AutoUnsub remembers what it has already seen.
75
+
76
+ When you unsubscribe, it uses whatever method was found in the email.
77
+
78
+ One-click options use a POST request, normal links use an HTTP request, and `mailto:` options get turned into an email and sent through Gmail SMTP.
79
+
80
+ ## Project Structure
81
+
82
+ | Path | Contents |
83
+ | ------------------------ | ----------------------------------------- |
84
+ | `main.py` | the thing you actually run |
85
+ | `sweeper/config.py` | handles Gmail credentials |
86
+ | `sweeper/db.py` | DB |
87
+ | `sweeper/imap_scan.py` | scans Gmail |
88
+ | `sweeper/sweep.py` | connects the scanner, parser and database |
89
+ | `sweeper/unsub_parse.py` | figures out unsubscribe methods |
90
+ | `sweeper/unsubscribe.py` | actually sends the unsubscribe request |
91
+ | `tests/` | tests for everything |
92
+ | `requirements.txt` | Python dependencies |
93
+ | `README.md` | this file |
94
+
95
+ ## Install
96
+
97
+ ### From PyPI
98
+
99
+ Once released, the normal user install will be:
100
+
101
+ ```bash
102
+ python -m pip install auto-unsub
103
+ auto-unsub
104
+ ```
105
+
106
+ This installs AutoUnsub as a real command-line application, so users do not need to clone the repository.
107
+
108
+ ### From source
109
+
110
+ For development:
111
+
112
+ ```bash
113
+ python -m pip install -e .
114
+ auto-unsub
115
+ ```
116
+
117
+ ### Development setup
118
+
119
+ It is recommended to use a virtual environment so the dependencies don't pollute your global Python installation:
120
+
121
+ ```bash
122
+ python -m venv .venv
123
+ source .venv/bin/activate
124
+ ```
125
+
126
+ On Windows:
127
+
128
+ ```powershell
129
+ python -m venv .venv
130
+ .venv\Scripts\activate
131
+ ```
132
+
133
+ Then install the project:
134
+
135
+ ```bash
136
+ python -m pip install -e .
137
+ ```
138
+
139
+ ## Using AutoUnsub
140
+
141
+ On the first run it asks for your Gmail address and app password.
142
+
143
+ The app password gets stored using the system keyring so you don't have to enter it every time.
144
+
145
+ You do have to create the app password yourself from your Google account first.
146
+
147
+ <img width="636" height="349" alt="image" src="https://github.com/user-attachments/assets/ead0f025-be57-4020-8a56-6d1465b6fa4b" />
148
+
149
+ After that you choose how many days back you want to scan and how many messages you want to check.
150
+
151
+ Then it shows you what it found.
152
+
153
+ <img width="569" height="298" alt="image" src="https://github.com/user-attachments/assets/51aeb6e0-1397-44e1-b909-264d8b6d9218" />
154
+
155
+ ## What I Learned
156
+
157
+ Honestly this taught me way more than I expected.
158
+
159
+ I learned how Gmail IMAP works, how email headers are structured, and how unsubscribe headers can have a bunch of different formats.
160
+
161
+ I also got way more comfortable with SQLite and keeping state between runs.
162
+
163
+ The networking part was kinda interesting too because fetching messages one by one was ridiculously slow, so I changed it to fetch them in batches (default 25, but I can change this).
164
+
165
+ Real email data was also way messier than the fake tests I started with because some emails have no unsubscribe options at all and some have huge weird unsubscribe URLs.
166
+
167
+ ## Why I Built It
168
+
169
+ Mostly because I wanted it for myself.
170
+
171
+ <img width="1631" height="722" alt="image" src="https://github.com/user-attachments/assets/7caeb23b-b4fb-4604-ad5d-55b24db723ad" />
172
+
173
+ My inbox has a bunch of random stuff that I don't really care about anymore, and manually cleaning it up is just boring and repetitive.
174
+
175
+ ## Current Status
176
+
177
+ The main thing works now.
178
+
179
+ AutoUnsub can connect to Gmail, scan real messages, figure out which ones have unsubscribe options, save everything to SQLite, and actually send unsubscribe requests.
180
+
181
+ The interface is still pretty basic and there's still a lot I want to improve, mainly making the scanning less slow, handling weird unsubscribe services better, and making the whole thing feel like an actual finished app.
@@ -0,0 +1,22 @@
1
+ LICENSE
2
+ README.md
3
+ main.py
4
+ pyproject.toml
5
+ auto_unsub.egg-info/PKG-INFO
6
+ auto_unsub.egg-info/SOURCES.txt
7
+ auto_unsub.egg-info/dependency_links.txt
8
+ auto_unsub.egg-info/entry_points.txt
9
+ auto_unsub.egg-info/requires.txt
10
+ auto_unsub.egg-info/top_level.txt
11
+ sweeper/__init__.py
12
+ sweeper/config.py
13
+ sweeper/db.py
14
+ sweeper/imap_scan.py
15
+ sweeper/sweep.py
16
+ sweeper/unsub_parse.py
17
+ sweeper/unsubscribe.py
18
+ tests/test_db.py
19
+ tests/test_imap_scan.py
20
+ tests/test_queries.py
21
+ tests/test_unsub_parse.py
22
+ tests/test_unsubscribe.py
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ auto-unsub = main:main
@@ -0,0 +1,2 @@
1
+ colorama>=0.4.6
2
+ keyring>=25.0
@@ -0,0 +1,2 @@
1
+ main
2
+ sweeper