A lightweight Python automation tool that monitors Microsoft-related RSS feeds and community blogs, filters articles by topics relevant to a Windows IT environment, and delivers a categorized weekly email digest.
Designed to run as a scheduled task on PythonAnywhere with zero infrastructure overhead.
Every Monday, the script:
- Fetches articles from six RSS sources covering security patches, product roadmap changes, IT pro guidance, and community analysis
- Scans each article's title and summary against keyword lists organized into six topic categories
- Deduplicates matches across feeds (the same article won't appear twice)
- Emails a plain-text categorized summary — or stays silent if nothing matched
| Source | What It Covers |
|---|---|
| MSRC (Microsoft Security Response Center) | Official CVE and patch announcements |
| M365 Roadmap | Upcoming feature changes and rollouts |
| Windows IT Pro Blog | Operational guidance and update behavior |
| M365 Tech Community Blog | Microsoft 365 product announcements |
| AskWoody | Update regressions, known issues, patch-readiness analysis |
| Chris Titus Tech | Real-world impact of OS changes, driver issues, tooling |
Articles are matched against these categories. An article can appear under more than one.
| Category | What Triggers It |
|---|---|
| 32-Bit / Legacy App Impact | WOW64 changes, x86 compatibility, legacy application support |
| MS Access | Microsoft Access runtime, .accdb format, version-specific mentions |
| Printer Impact (Okidata / Epson) | Print spooler changes, driver updates, Windows printing subsystem |
| Email Security | Exchange, SMTP behavior, SPF/DKIM/DMARC, mail flow rule changes |
| Network Shares / SMB | SMB protocol changes, mapped drives, UNC paths, LanMan auth |
| Deprecations / EOL / Breaking Changes | End-of-life notices, behavior changes, regressions, workaround advisories |
- Python 3.8+
- feedparser (
pip install feedparser) - A Gmail account with a generated App Password
All other dependencies (smtplib, ssl, email) are part of the Python standard library.
git clone https://github.com/yourusername/microsoft-update-scanner.gitpip install feedparserCreate a config.py file in the same directory as ms_update_scanner.py:
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465
SENDER_EMAIL = "you@gmail.com"
SENDER_PASSWORD = "your-app-password" # See below — must be a Gmail App Password
RECEIVER_EMAIL = "you@gmail.com"This file is excluded from version control via .gitignore — never commit it.
Regular Gmail passwords will not work. You need an App Password:
- Go to myaccount.google.com
- Navigate to Security → 2-Step Verification (must be enabled)
- Scroll down to App Passwords
- Create a new one named something like
PythonAnywhere Scanner - Copy the 16-character password into
SENDER_PASSWORD(no spaces)
Security note: Never commit your App Password to a public repository. Consider loading it from an environment variable in production:
import os SENDER_PASSWORD = os.environ.get("GMAIL_APP_PASSWORD")
python ms_update_scanner.pyYou should see each feed fetched in the terminal, followed by Email sent successfully.
PythonAnywhere offers free scheduled task hosting — no server management required.
- Log in to pythonanywhere.com
- Upload
ms_update_scanner.pyvia the Files tab - Install feedparser in a Bash console:
pip install --user feedparser - Go to the Tasks tab → Scheduled Tasks
- Set the command:
python3 /home/yourusername/ms_update_scanner.py - Set the schedule: Weekly, Monday, at your preferred time
Find the relevant category in the CATEGORIES dict and append to its list:
"Network Shares / SMB": [
"smb", "network share", ...
"kerberos authentication", # <-- added
],Add a new key/value pair to CATEGORIES:
"Remote Desktop / RDS": [
"remote desktop", "rdp", "rds", "terminal services",
],Add a new entry to the FEEDS dict:
"Bleeping Computer Windows": "https://www.bleepingcomputer.com/feed/",python3 -m unittest test_ms_update_scanner -v30 tests across 4 classes, no network calls or real credentials needed:
| Class | Coverage |
|---|---|
TestMergeResults |
Empty input, single feed, cross-feed deduplication, insertion-order preservation |
TestBuildEmailBody |
Date header, uppercase category labels, placeholder for empty sections, any_hits flag |
TestFetchAndCategorize |
Title/summary matching, case-insensitivity, multi-category hits, malformed feed handling, parse exceptions |
TestSendSummary |
SMTP server/port, login credentials, correct From/To/Subject/body on the outgoing message |
update_scanner/
├── ms_update_scanner.py # Main script — all logic and configuration
├── config.py # Credentials (gitignored — create locally, see Setup)
├── requirements.txt # feedparser
├── test_ms_update_scanner.py # Unit tests
└── README.md
MIT — free to use, modify, and redistribute.