Mini Shell
"""Functions for sending emails"""
import smtplib
import platform
import pwd
import os
from typing import Union, Literal, overload
from email.utils import formatdate
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
@overload
def send_email(
to_addr: Union[str, list[str]],
subject: str,
body: str,
html: Union[str, None] = None,
sender: Union[str, None] = None,
ssl: bool = False,
server: tuple[str, int] = ('localhost', 0),
login: Union[tuple[str, str], None] = None,
errs: Literal[False] = False,
) -> bool:
...
@overload
def send_email(
to_addr: Union[str, list[str]],
subject: str,
body: str,
html: Union[str, None] = None,
sender: Union[str, None] = None,
ssl: bool = False,
server: tuple[str, int] = ('localhost', 0),
login: Union[tuple[str, str], None] = None,
errs: Literal[True] = True,
) -> None:
...
def send_email(
to_addr: Union[str, list[str]],
subject: str,
body: str,
html: Union[str, None] = None,
sender: Union[str, None] = None,
ssl: bool = False,
server: tuple[str, int] = ('localhost', 0),
login: Union[tuple[str, str], None] = None,
errs: bool = False,
):
"""Sends an email
Args:
to_addr: destination email address(es)
subject: subject line of email to send
body: plaintext body of email
html: HTML version of the email
sender: sender's email address. user@fqdn if unprovided
ssl: whether to use SMTPS
server: (host, port) to connect to
login: (user, pass) to connect as
errs: if True, raise OSError if sending fails. If False, return
a bool for success/fail. Defaults to False.
"""
if sender is None:
sender = f'{pwd.getpwuid(os.getuid()).pw_name}@{platform.node()}'
if isinstance(to_addr, str):
to_addr = [to_addr]
msg = MIMEMultipart('alternative')
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = ", ".join(to_addr)
msg['Date'] = formatdate()
if isinstance(body, str):
msg.attach(MIMEText(body, 'plain', 'UTF-8'))
else:
msg.attach(MIMEText(body, 'plain'))
if html:
if isinstance(html, str):
msg.attach(MIMEText(html, 'html', 'UTF-8'))
else:
msg.attach(MIMEText(html, 'html'))
smtp_class = smtplib.SMTP_SSL if ssl else smtplib.SMTP
try:
smtp_obj = smtp_class(server[0], server[1])
if login:
smtp_obj.login(login[0], login[1])
smtp_obj.sendmail(sender, to_addr, msg.as_string())
except OSError:
if errs:
raise
return False
if errs:
return None
return True
send_email.__module__ = 'rads'
Zerion Mini Shell 1.0