From cd91bcffdaab5a8813ca6989d57bc497e35dea05 Mon Sep 17 00:00:00 2001 From: Jack Cheang Date: Thu, 19 Jun 2025 15:34:30 +0800 Subject: [PATCH] first commit --- email-smtp-tester/.env.example | 8 +++ email-smtp-tester/.gitignore | 65 +++++++++++++++++ email-smtp-tester/requirements.txt | 2 + email-smtp-tester/send_email.py | 110 +++++++++++++++++++++++++++++ email-smtp-tester/start.sh | 9 +++ 5 files changed, 194 insertions(+) create mode 100644 email-smtp-tester/.env.example create mode 100644 email-smtp-tester/.gitignore create mode 100644 email-smtp-tester/requirements.txt create mode 100644 email-smtp-tester/send_email.py create mode 100755 email-smtp-tester/start.sh diff --git a/email-smtp-tester/.env.example b/email-smtp-tester/.env.example new file mode 100644 index 0000000..87d3605 --- /dev/null +++ b/email-smtp-tester/.env.example @@ -0,0 +1,8 @@ +# SMTP Configuration +SMTP_SERVER=smtp.example.com +SMTP_PORT=587 +SMTP_USERNAME=your_username@example.com +SMTP_PASSWORD=your_password +SMTP_FROM=your_email@example.com +SMTP_TO=recipient@example.com +SMTP_USE_TLS=True diff --git a/email-smtp-tester/.gitignore b/email-smtp-tester/.gitignore new file mode 100644 index 0000000..96a22c0 --- /dev/null +++ b/email-smtp-tester/.gitignore @@ -0,0 +1,65 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# Environment variables +.env +.env.* +!.env.example + +# Logs +logs/ +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Database +*.db +*.sqlite3 +*.sqlite + +# IDE +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# Local development +local_settings.py + +# Testing +.coverage +htmlcov/ +.pytest_cache/ + +# Virtual Environment +.venv/ +venv/ +ENV/ + +# Distribution / packaging +dist/ +build/ +*.egg-info/ +*.egg diff --git a/email-smtp-tester/requirements.txt b/email-smtp-tester/requirements.txt new file mode 100644 index 0000000..cd56a9f --- /dev/null +++ b/email-smtp-tester/requirements.txt @@ -0,0 +1,2 @@ +python-dotenv==1.0.0 +secure-smtplib==0.1.1 diff --git a/email-smtp-tester/send_email.py b/email-smtp-tester/send_email.py new file mode 100644 index 0000000..5911864 --- /dev/null +++ b/email-smtp-tester/send_email.py @@ -0,0 +1,110 @@ +import os +import smtplib +import logging +from datetime import datetime +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart +from dotenv import load_dotenv + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + handlers=[ + logging.StreamHandler(), + logging.FileHandler('email_sender.log') + ] +) +logger = logging.getLogger(__name__) + +def send_email(subject, body): + # Start logging + logger.info("="*50) + logger.info(f"Starting email sending process at {datetime.now()}") + logger.info("-"*50) + + try: + # Load environment variables + load_dotenv() + logger.info("Environment variables loaded successfully") + + # Email configuration + smtp_server = os.getenv('SMTP_SERVER') + smtp_port = int(os.getenv('SMTP_PORT', '587')) + smtp_username = os.getenv('SMTP_USERNAME') + smtp_password = os.getenv('SMTP_PASSWORD') + from_email = os.getenv('SMTP_FROM') + to_email = os.getenv('SMTP_TO') + use_tls = os.getenv('SMTP_USE_TLS', 'True').lower() == 'true' + + # Log configuration + logger.info(f"SMTP Server: {smtp_server}:{smtp_port}") + logger.info(f"From: {from_email}") + logger.info(f"To: {to_email}") + logger.info(f"Use TLS: {use_tls}") + logger.info(f"Subject: {subject}") + logger.debug(f"Email body: {body}") + + # Create message + logger.info("Creating email message...") + msg = MIMEMultipart() + msg['From'] = from_email + msg['To'] = to_email + msg['Subject'] = subject + msg.attach(MIMEText(body, 'plain')) + logger.debug("Email message created successfully") + + # Create SMTP session + logger.info(f"Connecting to SMTP server: {smtp_server}:{smtp_port}") + with smtplib.SMTP(smtp_server, smtp_port, timeout=30) as server: + logger.info("SMTP connection established") + + if use_tls: + logger.info("Starting TLS encryption...") + server.starttls() + logger.info("TLS encryption started") + + # Login to SMTP server + logger.info("Authenticating with SMTP server...") + try: + server.login(smtp_username, smtp_password) + logger.info("Successfully authenticated with SMTP server") + except Exception as auth_error: + logger.error(f"SMTP authentication failed: {str(auth_error)}") + logger.error(f"Username used: {smtp_username}") + raise + + # Send email + logger.info("Sending email...") + server.send_message(msg) + logger.info("Email sent successfully!") + logger.info(f"Email details - From: {from_email}, To: {to_email}, Subject: {subject}") + return True + + except smtplib.SMTPException as smtp_error: + logger.error(f"SMTP Error occurred: {str(smtp_error)}") + logger.error(f"SMTP Error code: {getattr(smtp_error, 'smtp_code', 'N/A')}") + logger.error(f"SMTP Error message: {getattr(smtp_error, 'smtp_error', 'N/A')}") + return False + except Exception as e: + logger.error(f"Unexpected error occurred: {str(e)}", exc_info=True) + return False + finally: + logger.info("="*50 + "\n") + +if __name__ == "__main__": + try: + # Test email + subject = "SMTP Test Email" + body = "This is a test email sent using Python's smtplib with SMTP on port 587." + + logger.info("Starting email test...") + result = send_email(subject, body) + + if result: + logger.info("Email test completed successfully!") + else: + logger.error("Email test failed!") + + except Exception as e: + logger.critical(f"Critical error in main: {str(e)}", exc_info=True) diff --git a/email-smtp-tester/start.sh b/email-smtp-tester/start.sh new file mode 100755 index 0000000..9439c45 --- /dev/null +++ b/email-smtp-tester/start.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -e +source .env +python3.13 -m venv .venv +source .venv/bin/activate + +pip install -r requirements.txt + +exec python3.13 send_email.py \ No newline at end of file