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)