185 lines
5.3 KiB
Python
185 lines
5.3 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:
|
|
|
|
port=587
|
|
|
|
host='localhost'
|
|
|
|
username=''
|
|
|
|
password=''
|
|
|
|
ssl=True
|
|
|
|
if sys.version_info < (3, 6):
|
|
|
|
context = ssl_module.SSLContext(ssl_module.PROTOCOL_TLSv1_2)
|
|
else:
|
|
context = ssl_module.SSLContext(ssl_module.PROTOCOL_TLS)
|
|
|
|
def __init__(self):
|
|
|
|
self.smtp=smtplib.SMTP(host=self.host, port=self.port)
|
|
self.txt_error=''
|
|
|
|
def send(self, from_address, to_address: list, subject, message, content_type='plain', attachments=[]):
|
|
|
|
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
|
|
|
|
"""
|
|
except smtplib.SMTPNotSupportedError:
|
|
|
|
self.txt_error='Error: SSL/TLS is not supported'
|
|
|
|
return False
|
|
"""
|
|
|
|
if self.username!='':
|
|
|
|
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:
|
|
|
|
self.txt_error='Error: cannot login. Wrong username or password'
|
|
|
|
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
|
|
|
|
"""
|
|
except smtplib.SMTPNotSupportedError:
|
|
|
|
self.txt_error='Error: AUTH is not supported'
|
|
|
|
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):
|
|
|
|
self.smtp.quit()
|
|
|
|
def __del__(self):
|
|
|
|
self.smtp.quit()
|
|
|