111 lines
3.9 KiB
Python
111 lines
3.9 KiB
Python
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)
|