107 lines
3.9 KiB
Python
107 lines
3.9 KiB
Python
import os
|
|
import smtplib
|
|
import traceback
|
|
import logging
|
|
from email.mime.multipart import MIMEMultipart
|
|
from email.mime.text import MIMEText
|
|
from email.mime.base import MIMEBase
|
|
from email import encoders
|
|
from email.utils import formataddr
|
|
from dotenv import load_dotenv
|
|
|
|
# Load environment variables from .env file
|
|
load_dotenv()
|
|
|
|
# Email configuration
|
|
SMTP_SERVER = os.getenv('SMTP_SERVER')
|
|
SMTP_PORT = os.getenv('SMTP_PORT')
|
|
SMTP_USER = os.getenv('SMTP_USER')
|
|
SMTP_PASSWORD = os.getenv('SMTP_PASSWORD')
|
|
SENDER_EMAIL = os.getenv('SENDER_EMAIL')
|
|
# Split env recipient lists safely and strip whitespace; default to empty list
|
|
def _split_env_list(varname):
|
|
raw = os.getenv(varname, '')
|
|
return [s.strip() for s in raw.split(',') if s.strip()]
|
|
|
|
EMAIL_RECIPIENTS = _split_env_list('EMAIL_RECIPIENTS')
|
|
ERROR_EMAIL_RECIPIENTS = _split_env_list('ERROR_EMAIL_RECIPIENTS')
|
|
SUCCESS_EMAIL_RECIPIENTS = _split_env_list('SUCCESS_EMAIL_RECIPIENTS')
|
|
|
|
|
|
# Send email with attachment
|
|
def send_email_with_attachment(subject, body, attachment_path=None, email_recipients=None):
|
|
sender_name="Art.c.hive Support for ARKIVO"
|
|
try:
|
|
# Create a multipart message
|
|
msg = MIMEMultipart()
|
|
msg['From'] = formataddr((sender_name, SENDER_EMAIL))
|
|
# if email recipent not defined use EMAIL_RECIPIENTS
|
|
if email_recipients:
|
|
msg['To'] = ', '.join(email_recipients)
|
|
else:
|
|
msg['To'] = ', '.join(EMAIL_RECIPIENTS)
|
|
|
|
msg['Subject'] = subject
|
|
|
|
# Attach the body with the msg instance
|
|
msg.attach(MIMEText(body, 'plain'))
|
|
|
|
# Attach the file if provided
|
|
if attachment_path:
|
|
if os.path.exists(attachment_path):
|
|
with open(attachment_path, "rb") as attachment:
|
|
part = MIMEBase('application', 'octet-stream')
|
|
part.set_payload(attachment.read())
|
|
encoders.encode_base64(part)
|
|
part.add_header('Content-Disposition', f'attachment; filename= {os.path.basename(attachment_path)}')
|
|
msg.attach(part)
|
|
else:
|
|
logging.warning(f"Attachment path {attachment_path} does not exist. Skipping attachment.")
|
|
|
|
# Create SMTP session for sending the mail
|
|
recipients_list = email_recipients if email_recipients else EMAIL_RECIPIENTS
|
|
if isinstance(recipients_list, str):
|
|
recipients_list = [recipients_list]
|
|
with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
|
|
server.starttls() # Enable security
|
|
server.login(SMTP_USER, SMTP_PASSWORD) # Login with mail_id and password
|
|
text = msg.as_string()
|
|
server.sendmail(SENDER_EMAIL, recipients_list, text)
|
|
|
|
logging.info("Email sent successfully.")
|
|
except Exception as e:
|
|
logging.error(f"Failed to send email: {e}")
|
|
|
|
# Create the email message
|
|
def send_error_email(subject, body, recipients):
|
|
try:
|
|
sender_email = os.getenv('SENDER_EMAIL')
|
|
smtp_server = os.getenv('SMTP_SERVER')
|
|
smtp_port = int(os.getenv('SMTP_PORT'))
|
|
smtp_user = os.getenv('SMTP_USER')
|
|
smtp_password = os.getenv('SMTP_PASSWORD')
|
|
|
|
msg = MIMEMultipart()
|
|
msg['From'] = sender_email
|
|
msg['To'] = ", ".join(recipients)
|
|
msg['Subject'] = subject
|
|
msg.attach(MIMEText(body, 'plain'))
|
|
|
|
with smtplib.SMTP(smtp_server, smtp_port) as server:
|
|
server.starttls()
|
|
server.login(smtp_user, smtp_password)
|
|
server.sendmail(sender_email, recipients, msg.as_string())
|
|
|
|
logging.error("Error email sent successfully")
|
|
except Exception as e:
|
|
logging.error(f"Failed to send error email: {e}")
|
|
|
|
# Handle error
|
|
def handle_error(e):
|
|
error_trace = traceback.format_exc()
|
|
subject = "Error Notification"
|
|
body = f"An error occurred:\n\n{error_trace}"
|
|
recipients = os.getenv('EMAIL_RECIPIENTS', '').split(',')
|
|
send_error_email(subject, body, recipients)
|
|
raise e
|