paramecio2fm/paramecio2/libraries/sendmail.py

217 lines
6.7 KiB
Python

#!/usr/bin/env python3
import os
import smtplib
import mimetypes
from email import encoders
from email.message import Message
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import ssl as ssl_module
import sys
class SendMail:
"""Class for send email
"""
port=587
host='localhost'
username=''
password=''
#ssl=True
def __init__(self, ssl=True):
"""Class for send email
Class for send email using standard python library
Attributes:
port (int): The port used for send email, by default 587
host (str): The hostname of mail server used for send the email
username (str): The username for login in mail server
password (str): The password for login in mail server
smtp (smtplib.SMTP): The python SMTP object used for send emails
txt_error: (str): If error, is saved in this attribute
"""
self.smtp=None #smtplib.SMTP(host=self.host, port=self.port)
self.txt_error=''
self.ssl=ssl
if sys.version_info < (3, 6):
self.context = ssl_module.SSLContext(ssl_module.PROTOCOL_TLSv1_2)
else:
self.context = ssl_module.SSLContext(ssl_module.PROTOCOL_TLS)
def connect(self):
self.smtp=smtplib.SMTP(host=self.host, port=self.port)
if self.ssl==True:
try:
self.smtp.starttls(context=self.context)
except smtplib.SMTPHeloError:
self.txt_error='Error: cannot make HELO to this server'
return False
except RuntimeError:
self.txt_error='Error: SSL/TLS is not supported in your python interpreter'
return False
except smtplib.SMTPException as e:
self.txt_error=e.__str__()
return False
#login
if self.smtp!=None:
try:
self.smtp.login(self.username, self.password)
except smtplib.SMTPHeloError:
self.txt_error='Error: cannot make HELO to this server'
return False
except smtplib.SMTPAuthenticationError as eauth:
self.txt_error='Error: cannot login. Wrong username or password '+eauth.__str__()
return False
except smtplib.SMTPException as e:
# self.txt_error=e.__str__()
self.txt_error='Error: any method for login is avaliable - '+e.__str__()
return False
return True
def send(self, from_address, to_address: list, subject, message, content_type='plain', attachments=[]):
""" Method that send email
With this method you can send email to multiple address, html, and add attachments to email
Args:
from_adress (str): The adress used for send the email
to_address (list): A list of emails where the email will be sended.
subject (str): The subject of the email
message (str): The content of the message
content_type (str): The type of mail content, can be plain or html.
attatchments (list): A list with a serie of file paths for attach to the email.
"""
if self.smtp==None:
if not self.connect():
return False
COMMASPACE=', '
if len(attachments)==0:
msg=MIMEText(message, content_type)
msg['Subject']=subject
msg['From']=from_address
msg['To']=COMMASPACE.join(to_address)
self.smtp.send_message(msg)
#self.quit()
return True
else:
outer=MIMEMultipart()
outer['Subject']=subject
outer['From']=from_address
outer['To']=COMMASPACE.join(to_address)
# Attach message text
msg=MIMEText(message, content_type)
outer.attach(msg)
for path in attachments:
ctype, encoding = mimetypes.guess_type(path)
if ctype is None or encoding is not None:
# No guess could be made, or the file is encoded (compressed), so
# use a generic bag-of-bits type.
ctype = 'application/octet-stream'
maintype, subtype = ctype.split('/', 1)
if maintype == 'text':
with open(path) as fp:
# Note: we should handle calculating the charset
msg = MIMEText(fp.read(), _subtype=subtype)
elif maintype == 'image':
with open(path, 'rb') as fp:
msg = MIMEImage(fp.read(), _subtype=subtype)
elif maintype == 'audio':
with open(path, 'rb') as fp:
msg = MIMEAudio(fp.read(), _subtype=subtype)
else:
with open(path, 'rb') as fp:
msg = MIMEBase(maintype, subtype)
msg.set_payload(fp.read())
# Encode the payload using Base64
encoders.encode_base64(msg)
# Set the filename parameter
msg.add_header('Content-Disposition', 'attachment', filename=os.path.basename(path))
outer.attach(msg)
self.smtp.send_message(outer)
#self.quit()
return True
def quit(self):
"""Function used when you need quit connection for any reason"""
if self.smtp!=None:
self.smtp.quit()
self.smtp=None
def __del__(self):
"""Method for clean the connection when the object is closed"""
if self.smtp!=None:
self.smtp.quit()