Most people spend 2-3 hours per day on email. Python can cut that to 30 minutes.
Here are 5 email automation scripts that work in production — not toy examples.
1. Smart Email Sorter (Zero Inbox in Seconds)
import imaplib
import email
def smart_sort_inbox(rules):
"""
Automatically sort emails based on custom rules.
rules = [
{'from_contains': 'newsletter', 'action': 'archive', 'label': 'Newsletters'},
{'subject_contains': 'invoice', 'action': 'label', 'label': 'Finance'},
]
"""
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('your@email.com', 'app_password')
mail.select('INBOX')
_, message_numbers = mail.search(None, 'UNSEEN')
sorted_count = {}
for num in message_numbers[0].split():
_, msg_data = mail.fetch(num, '(RFC822)')
msg = email.message_from_bytes(msg_data[0][1])
sender = str(msg.get('From', '')).lower()
subject = str(msg.get('Subject', '')).lower()
for rule in rules:
matched = False
if 'from_contains' in rule and rule['from_contains'] in sender:
matched = True
if 'subject_contains' in rule and rule['subject_contains'] in subject:
matched = True
if matched:
label = rule['label']
sorted_count[label] = sorted_count.get(label, 0) + 1
mail.copy(num, label)
if rule['action'] == 'archive':
mail.store(num, '+FLAGS', '\\Deleted')
break
mail.expunge()
mail.close()
return sorted_count
Time saved: 45 minutes/week.
2. Auto-Reply to Common Questions
Every business gets the same 10 questions repeatedly. Automate the responses:
import re
from typing import Optional
FAQ_RESPONSES = {
r'(pricing|cost|how much|price|rates)': """
Hi {name},
Thanks for reaching out! Our pricing starts at $99/month.
I'll follow up with more details. What's your use case?
Best, {signature}
""",
r'(refund|money back|cancel)': """
Hi {name},
We have a 30-day money-back guarantee, no questions asked.
Reply with your order number to process a refund.
Best, {signature}
"""
}
def get_auto_reply(subject: str, body: str, sender_name: str) -> Optional[str]:
combined = f"{subject} {body}".lower()
for pattern, response in FAQ_RESPONSES.items():
if re.search(pattern, combined):
return response.format(name=sender_name, signature="Your Name")
return None
Result: 80% fewer manual replies needed.
3. Follow-Up Sequence Automation
Never forget to follow up again:
import sqlite3
from datetime import datetime, timedelta
class FollowUpManager:
def __init__(self, db_path='followups.db'):
self.db = sqlite3.connect(db_path)
self._init_db()
def _init_db(self):
self.db.execute('''
CREATE TABLE IF NOT EXISTS followups (
id INTEGER PRIMARY KEY,
email TEXT, name TEXT, context TEXT,
sequence_step INTEGER DEFAULT 0,
next_followup TIMESTAMP,
status TEXT DEFAULT 'active'
)
''')
self.db.commit()
def add_followup(self, email, name, context):
"""Start a 3-touch follow-up sequence: Day 3, Day 7, Day 14"""
self.db.execute(
'INSERT INTO followups (email, name, context, next_followup) VALUES (?, ?, ?, ?)',
(email, name, context, (datetime.now() + timedelta(days=3)).isoformat())
)
self.db.commit()
def get_due_followups(self):
cursor = self.db.execute(
'SELECT * FROM followups WHERE next_followup <= ? AND status = ? AND sequence_step < 3',
(datetime.now().isoformat(), 'active')
)
return cursor.fetchall()
Time saved: 30 minutes/week. Conversion rate improvement: significant.
4. Email Analytics Without Paying for Tools
import imaplib
import email
from collections import defaultdict
from datetime import datetime, timedelta
def get_email_analytics(days_back=30):
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('your@email.com', 'app_password')
mail.select('INBOX')
stats = {
'total_received': 0,
'by_sender_domain': defaultdict(int),
'by_hour': defaultdict(int),
'top_senders': defaultdict(int),
}
since_date = (datetime.now() - timedelta(days=days_back)).strftime('%d-%b-%Y')
_, nums = mail.search(None, f'SINCE {since_date}')
for num in nums[0].split():
_, data = mail.fetch(num, '(RFC822.HEADER)')
msg = email.message_from_bytes(data[0][1])
sender = str(msg.get('From', ''))
domain = sender.split('@')[-1].replace('>', '').strip() if '@' in sender else 'unknown'
stats['total_received'] += 1
stats['by_sender_domain'][domain] += 1
stats['top_senders'][sender] += 1
stats['top_senders'] = sorted(stats['top_senders'].items(), key=lambda x: x[1], reverse=True)[:10]
return stats
5. Unsubscribe Bot
import re
from collections import defaultdict
def find_unsubscribe_links(mail_client, max_emails=100):
"""Find all unsubscribe links in your inbox."""
_, nums = mail_client.search(None, 'ALL')
nums = nums[0].split()[-max_emails:]
unsubscribe_map = defaultdict(list)
for num in nums:
_, data = mail_client.fetch(num, '(RFC822)')
msg = email.message_from_bytes(data[0][1])
sender = str(msg.get('From', ''))
body = ''
if msg.is_multipart():
for part in msg.walk():
if part.get_content_type() == 'text/html':
body = str(part.get_payload(decode=True))
break
links = re.findall(r'href=[\'"]([^\'"]*unsubscribe[^\'"]*)[\'"]',
body, re.IGNORECASE)
if links:
unsubscribe_map[sender].extend(links)
return unsubscribe_map
The Result
Set these 5 scripts up once. Then your inbox practically runs itself. Five scripts, one weekend of setup, years of saved time.
Want 42 more scripts for invoicing, client reporting, social media scheduling, inventory tracking, and business metrics? It's all in the Python Business Automation Toolkit: https://lukassbrad.gumroad.com/l/ugeka
Top comments (0)