invoice_app / modules /email_handler.py
radhabaran's picture
Update modules/email_handler.py
1a3c66f verified
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import os
import ssl
import time
class EmailHandler:
def __init__(self):
self.smtp_server = "smtp.gmail.com"
self.smtp_port = 587 # Using TLS port instead of SSL
self.sender_email = os.getenv('GMAIL_USER')
self.sender_password = os.getenv('GMAIL_APP_PASSWORD')
# Verify credentials
if not self.sender_email or not self.sender_password:
raise ValueError("Email credentials not properly configured. Please check GMAIL_USER and GMAIL_APP_PASSWORD environment variables.")
def send_invoice(self, recipient_email, workflow_state_dict, invoice_path):
"""Send invoice email with retry mechanism"""
max_retries = 3
retry_delay = 2
for attempt in range(max_retries):
try:
msg = MIMEMultipart()
msg['From'] = self.sender_email
msg['To'] = recipient_email
msg['Subject'] = f"Invoice #{workflow_state_dict['invoice']['transaction_id']} - Payment Due"
body = f"""Dear {workflow_state_dict['customer']['cust_fname']},
Your payment of {workflow_state_dict['invoice']['currency']} {workflow_state_dict['invoice']['billed_amount']} is due by {workflow_state_dict['invoice']['payment_due_date']}.
Please do the payment at the earliest.
Best regards,
Your Company Name"""
msg.attach(MIMEText(body, 'plain'))
# Attach PDF
with open(invoice_path, "rb") as f:
pdf = MIMEApplication(f.read(), _subtype="pdf")
pdf.add_header('Content-Disposition', 'attachment',
filename=os.path.basename(invoice_path))
msg.attach(pdf)
print(f"Attempt {attempt + 1}: Connecting to Gmail SMTP server...")
# Using SMTP with TLS
with smtplib.SMTP(self.smtp_server, self.smtp_port, timeout=30) as server:
print("Connected to SMTP server")
server.ehlo() # Identify ourselves to the server
print("Starting TLS encryption...")
server.starttls(context=ssl.create_default_context())
server.ehlo() # Re-identify ourselves over TLS connection
print("TLS encryption established")
print("Attempting login...")
server.login(self.sender_email, self.sender_password)
print("Login successful")
print("Sending email...")
server.send_message(msg)
print("Email sent successfully")
return True
except smtplib.SMTPAuthenticationError as e:
print(f"Authentication failed. Please check your Gmail credentials and ensure you're using an App Password.")
print(f"Error details: {str(e)}")
return False
except smtplib.SMTPException as e:
print(f"SMTP error on attempt {attempt + 1}: {str(e)}")
if attempt < max_retries - 1:
print(f"Retrying in {retry_delay} seconds...")
time.sleep(retry_delay)
continue
except Exception as e:
print(f"Unexpected error on attempt {attempt + 1}: {str(e)}")
print(f"Error type: {type(e)}")
if attempt < max_retries - 1:
print(f"Retrying in {retry_delay} seconds...")
time.sleep(retry_delay)
continue
return False