114 lines
3.5 KiB
Python
114 lines
3.5 KiB
Python
|
"""
|
||
|
title: Send Email
|
||
|
author: Josh Knapp
|
||
|
version: 0.1.0
|
||
|
description="Send email via SMTP to user specificed address"
|
||
|
"""
|
||
|
|
||
|
import subprocess, sys
|
||
|
from pydantic import BaseModel, Field
|
||
|
|
||
|
|
||
|
# Try to import boto3, install if not present
|
||
|
try:
|
||
|
import smtplib
|
||
|
from email.mime.text import MIMEText
|
||
|
from email.mime.multipart import MIMEMultipart
|
||
|
except ImportError:
|
||
|
print("Packages not found. Attempting to install...")
|
||
|
try:
|
||
|
subprocess.check_call([sys.executable, "-m", "pip", "install", "smtplib"])
|
||
|
subprocess.check_call([sys.executable, "-m", "pip", "install", "email"])
|
||
|
|
||
|
print("Packages installed successfully")
|
||
|
except subprocess.CalledProcessError as e:
|
||
|
print(f"Failed to install packages: {str(e)}")
|
||
|
|
||
|
|
||
|
class Tools:
|
||
|
class Valves(BaseModel):
|
||
|
MAIL_SERVER_ADDR: str = Field(
|
||
|
default="",
|
||
|
description="SMTP server address for sending emails",
|
||
|
)
|
||
|
MAIL_SERVER_PORT: str = Field(
|
||
|
default="465",
|
||
|
description="SMTP server port for sending emails, defaults to 465",
|
||
|
)
|
||
|
MAIL_SERVER_SSL: bool = Field(
|
||
|
default=True,
|
||
|
description="Bool to use SSL for SMTP, defaults to True, use TLS for secure email transmission"
|
||
|
)
|
||
|
EMAIL_ADDRESS: str = Field(
|
||
|
default="",
|
||
|
description="Email address for sending emails"
|
||
|
)
|
||
|
EMAIL_PASSWORD: str = Field(
|
||
|
default="",
|
||
|
description="Password for authenticating with the SMTP server"
|
||
|
)
|
||
|
CC_EMAIL: str = Field(
|
||
|
default="",
|
||
|
description="Email address to CC on all outgoing emails"
|
||
|
)
|
||
|
|
||
|
def __init__(self):
|
||
|
self.valves = self.Valves()
|
||
|
pass
|
||
|
|
||
|
def send_email(self, to_address: str, subject: str, message: str) -> dict:
|
||
|
"""
|
||
|
Send an email using configured SMTP settings
|
||
|
|
||
|
Args:
|
||
|
to_address (str): Recipient email address
|
||
|
subject (str): Email subject line
|
||
|
message (str): Email body content
|
||
|
|
||
|
Returns:
|
||
|
dict: Response containing success status and message
|
||
|
"""
|
||
|
try:
|
||
|
# Create message container
|
||
|
msg = MIMEMultipart()
|
||
|
msg['From'] = self.valves.EMAIL_ADDRESS
|
||
|
msg['To'] = to_address
|
||
|
if self.valves.CC_EMAIL:
|
||
|
msg['Cc'] = self.valves.CC_EMAIL
|
||
|
msg['Subject'] = subject
|
||
|
|
||
|
# Add body to email
|
||
|
msg.attach(MIMEText(message, 'plain'))
|
||
|
|
||
|
# Create SMTP connection
|
||
|
if self.valves.MAIL_SERVER_SSL:
|
||
|
server = smtplib.SMTP_SSL(
|
||
|
self.valves.MAIL_SERVER_ADDR,
|
||
|
int(self.valves.MAIL_SERVER_PORT)
|
||
|
)
|
||
|
else:
|
||
|
server = smtplib.SMTP(
|
||
|
self.valves.MAIL_SERVER_ADDR,
|
||
|
int(self.valves.MAIL_SERVER_PORT)
|
||
|
)
|
||
|
|
||
|
# Login to server
|
||
|
server.login(self.valves.EMAIL_ADDRESS, self.valves.EMAIL_PASSWORD)
|
||
|
|
||
|
# Send email
|
||
|
text = msg.as_string() + "\n\n This email was sent via OpenWebUI-SendEmail"
|
||
|
server.sendmail(self.valves.EMAIL_ADDRESS, to_address, text)
|
||
|
server.quit()
|
||
|
|
||
|
return {
|
||
|
"success": True,
|
||
|
"message": f"Email sent successfully to {to_address}"
|
||
|
}
|
||
|
|
||
|
except Exception as e:
|
||
|
return {
|
||
|
"success": False,
|
||
|
"message": f"Failed to send email: {str(e)}"
|
||
|
}
|
||
|
|