diff --git a/.gitignore b/.gitignore index 6ae33d2..97a32a8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ **/*.pyc -./tmp/**/* +tmp/**/* diff --git a/scripts/populate_imap.py b/scripts/populate_imap.py new file mode 100644 index 0000000..e6e9254 --- /dev/null +++ b/scripts/populate_imap.py @@ -0,0 +1,287 @@ +#!/usr/bin/env python3 +""" +Script to automatically populate the Dovecot IMAP server with test emails for both users. +This script will create various emails in different folders for testing purposes. +""" + +import os +import sys +import email +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart +from email.utils import formatdate, make_msgid +import imaplib +import time + +# Add the project root to Python path +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)) + '/..') + +from app import create_app, db +from app.models import User + +def create_test_emails(): + """Create various test emails for different folders""" + + # Define email templates with different content types and folders + emails = [ + # INBOX emails + { + "subject": "Welcome to Our Service", + "from": "noreply@company.com", + "to": "user1@example.com", + "folder": "INBOX", + "body": "Thank you for signing up! Here's your welcome package.", + "priority": "normal" + }, + { + "subject": "Meeting Reminder - Project Alpha", + "from": "manager@company.com", + "to": "user1@example.com", + "folder": "INBOX", + "body": "Don't forget about our meeting tomorrow at 10am.", + "priority": "high" + }, + { + "subject": "Weekly Newsletter", + "from": "newsletter@company.com", + "to": "user2@example.com", + "folder": "INBOX", + "body": "Your weekly digest of industry news and updates.", + "priority": "normal" + }, + { + "subject": "Password Reset Request", + "from": "security@company.com", + "to": "user2@example.com", + "folder": "INBOX", + "body": "You requested a password reset. Click the link below to reset your password.", + "priority": "high" + }, + + # Work emails + { + "subject": "Q3 Budget Review", + "from": "finance@company.com", + "to": "user1@example.com", + "folder": "Work", + "body": "Please review the Q3 budget proposal attached.", + "priority": "high" + }, + { + "subject": "Project Status Update", + "from": "teamlead@company.com", + "to": "user1@example.com", + "folder": "Work", + "body": "Here's the latest status on our current sprint.", + "priority": "normal" + }, + + # Personal emails + { + "subject": "Dinner Party This Weekend", + "from": "friend@friends.com", + "to": "user1@example.com", + "folder": "Personal", + "body": "Are you free for dinner this Saturday? Let me know!", + "priority": "normal" + }, + { + "subject": "Vacation Plans Discussion", + "from": "family@family.com", + "to": "user2@example.com", + "folder": "Personal", + "body": "Let's discuss our vacation plans for next month.", + "priority": "normal" + }, + + # Receipts + { + "subject": "Amazon Order Confirmation", + "from": "orders@amazon.com", + "to": "user1@example.com", + "folder": "Receipts", + "body": "Your order has been shipped and will arrive by Friday.", + "priority": "normal" + }, + { + "subject": "Gas Station Receipt", + "from": "receipts@shell.com", + "to": "user2@example.com", + "folder": "Receipts", + "body": "Thank you for your purchase at Shell station.", + "priority": "normal" + }, + + # Marketing emails + { + "subject": "Special Offer - 20% Off Today Only!", + "from": "deals@retailer.com", + "to": "user1@example.com", + "folder": "Marketing", + "body": "Limited time offer! Get 20% off your next purchase.", + "priority": "normal" + }, + { + "subject": "New Product Launch", + "from": "news@techcompany.com", + "to": "user2@example.com", + "folder": "Marketing", + "body": "We're excited to announce our latest product launch!", + "priority": "normal" + }, + + # Pending folder (for testing) + { + "subject": "Pending Review - Contract Document", + "from": "legal@company.com", + "to": "user1@example.com", + "folder": "Pending", + "body": "Please review this contract document and provide feedback.", + "priority": "high" + }, + { + "subject": "New Feature Request", + "from": "support@product.com", + "to": "user2@example.com", + "folder": "Pending", + "body": "We've received a new feature request from a customer.", + "priority": "normal" + }, + + # Archived folder + { + "subject": "Old Meeting Notes - Q2", + "from": "archive@company.com", + "to": "user1@example.com", + "folder": "Archived", + "body": "Archived meeting notes from the previous quarter.", + "priority": "normal" + }, + { + "subject": "Previous Newsletter", + "from": "old-newsletter@company.com", + "to": "user2@example.com", + "folder": "Archived", + "body": "Previous edition of our newsletter.", + "priority": "normal" + } + ] + + return emails + +def create_email_message(subject, sender, recipient, body, msg_id=None): + """Create an email message with proper headers""" + msg = MIMEMultipart() + msg['From'] = sender + msg['To'] = recipient + msg['Date'] = formatdate(localtime=True) + msg['Message-ID'] = msg_id or make_msgid() + msg['Subject'] = subject + + # Add body to email + msg.attach(MIMEText(body, 'plain')) + + return msg + +def connect_to_imap(): + """Connect to the local IMAP server""" + try: + # Connect to the local IMAP server (running on port 5143) + mail = imaplib.IMAP4('localhost', 5143) + return mail + except Exception as e: + print(f"Failed to connect to IMAP server: {e}") + return None + +def login_to_imap(mail, username, password): + """Login to the IMAP server""" + try: + mail.login(username, password) + return True + except Exception as e: + print(f"Failed to login to IMAP server for {username}: {e}") + return False + +def create_mailbox_if_not_exists(mail, folder_name): + """Create a mailbox if it doesn't exist""" + try: + # Check if mailbox exists + status, messages = mail.list("", f'"{folder_name}"') + if status != 'OK': + # Create the mailbox + mail.create(f'"{folder_name}"') + print(f"Created mailbox: {folder_name}") + return True + except Exception as e: + print(f"Error creating mailbox {folder_name}: {e}") + return False + +def store_email_in_folder(mail, folder_name, email_message): + """Store an email in a specific folder""" + try: + # Select the folder + mail.select(f'"{folder_name}"') + + # Store the email using APPEND + raw_email = email_message.as_bytes() + mail.append(f'"{folder_name}"', '', imaplib.Time2Internaldate(time.time()), raw_email) + + return True + except Exception as e: + print(f"Error storing email in {folder_name}: {e}") + return False + +def populate_imap(): + """Main function to populate IMAP server with test emails""" + print("Populating IMAP server with test emails...") + + # Create the test emails + test_emails = create_test_emails() + + # Connect to IMAP server + mail = connect_to_imap() + if not mail: + print("Could not connect to IMAP server") + return False + + # Login with both users + users = [ + {"email": "user1@example.com", "password": "password1"}, + {"email": "user2@example.com", "password": "password2"} + ] + + for user in users: + print(f"Processing emails for {user['email']}") + + # Login to the IMAP server + if not login_to_imap(mail, user['email'], user['password']): + continue + + # Create mailboxes if they don't exist + folders = ["INBOX", "Pending", "Work", "Personal", "Receipts", "Marketing", "Archived"] + for folder in folders: + create_mailbox_if_not_exists(mail, folder) + + # Store emails for this user + user_emails = [e for e in test_emails if e["to"] == user["email"]] + for email_data in user_emails: + print(f" Storing email: {email_data['subject']} in {email_data['folder']}") + + # Create the email message + msg = create_email_message( + subject=email_data["subject"], + sender=email_data["from"], + recipient=email_data["to"], + body=email_data["body"] + ) + + # Store in the appropriate folder + store_email_in_folder(mail, email_data["folder"], msg) + + # Logout + mail.logout() + print("IMAP server populated with test emails successfully!") + return True + +if __name__ == "__main__": + populate_imap() diff --git a/tmp/imap-data/example.com/user1/dovecot-uidlist b/tmp/imap-data/example.com/user1/dovecot-uidlist deleted file mode 100644 index c1adf5b..0000000 --- a/tmp/imap-data/example.com/user1/dovecot-uidlist +++ /dev/null @@ -1 +0,0 @@ -3 V1754397400 N1 Gdd33f323d8fa916813000000739f6a6d diff --git a/tmp/imap-data/example.com/user1/dovecot-uidvalidity b/tmp/imap-data/example.com/user1/dovecot-uidvalidity deleted file mode 100644 index db78e65..0000000 --- a/tmp/imap-data/example.com/user1/dovecot-uidvalidity +++ /dev/null @@ -1 +0,0 @@ -6891fad8 \ No newline at end of file diff --git a/tmp/imap-data/example.com/user1/dovecot-uidvalidity.6891fad8 b/tmp/imap-data/example.com/user1/dovecot-uidvalidity.6891fad8 deleted file mode 100644 index e69de29..0000000 diff --git a/tmp/imap-data/example.com/user1/dovecot.list.index.log b/tmp/imap-data/example.com/user1/dovecot.list.index.log deleted file mode 100644 index 6b3eaec..0000000 Binary files a/tmp/imap-data/example.com/user1/dovecot.list.index.log and /dev/null differ diff --git a/tmp/imap-data/example.com/user1/dovecot.mailbox.log b/tmp/imap-data/example.com/user1/dovecot.mailbox.log deleted file mode 100644 index 96bbc7c..0000000 Binary files a/tmp/imap-data/example.com/user1/dovecot.mailbox.log and /dev/null differ diff --git a/tmp/imap-data/example.com/user1/maildirfolder b/tmp/imap-data/example.com/user1/maildirfolder deleted file mode 100644 index e69de29..0000000 diff --git a/tmp/imap-data/example.com/user1/subscriptions b/tmp/imap-data/example.com/user1/subscriptions deleted file mode 100644 index 6e1e1ce..0000000 --- a/tmp/imap-data/example.com/user1/subscriptions +++ /dev/null @@ -1,3 +0,0 @@ -V 2 - -INBOX