summaryrefslogtreecommitdiff
path: root/website/send_mails.py
diff options
context:
space:
mode:
Diffstat (limited to 'website/send_mails.py')
-rw-r--r--website/send_mails.py435
1 files changed, 435 insertions, 0 deletions
diff --git a/website/send_mails.py b/website/send_mails.py
new file mode 100644
index 0000000..3f83c78
--- /dev/null
+++ b/website/send_mails.py
@@ -0,0 +1,435 @@
+__author__ = "Akshen Doke"
+
+import hashlib
+import logging
+import logging.config
+import yaml
+import re
+from django.core.mail import send_mail
+from textwrap import dedent
+from random import randint
+from smtplib import SMTP
+from django.utils.crypto import get_random_string
+from string import punctuation, digits
+try:
+ from string import letters
+except ImportError:
+ from string import ascii_letters as letters
+from nccps2018.config import (
+ EMAIL_HOST,
+ EMAIL_PORT,
+ EMAIL_HOST_USER,
+ EMAIL_HOST_PASSWORD,
+ EMAIL_USE_TLS,
+ PRODUCTION_URL,
+ SENDER_EMAIL,
+ ADMIN_EMAIL
+)
+from django.core.mail import EmailMultiAlternatives
+from django.conf import settings
+from os import listdir, path
+from email.mime.multipart import MIMEMultipart
+from email.mime.text import MIMEText
+from email.mime.base import MIMEBase
+from email import encoders
+from time import sleep
+from nccps2018.settings import LOG_FOLDER
+
+
+def validateEmail(email):
+ if len(email) > 7:
+ if re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$",
+ email) != None:
+ return 1
+ return 0
+
+
+def generate_activation_key(username):
+ """Generates hashed secret key for email activation"""
+ chars = letters + digits + punctuation
+ secret_key = get_random_string(randint(10, 40), chars)
+ return hashlib.sha256((secret_key + username).encode('utf-8')).hexdigest()
+
+
+def send_smtp_email(request=None, subject=None, message=None,
+ user_position=None, workshop_date=None,
+ workshop_title=None, user_name=None,
+ other_email=None, phone_number=None,
+ institute=None, attachment=None):
+ '''
+ Send email using SMTPLIB
+ '''
+
+ msg = MIMEMultipart()
+ msg['From'] = EMAIL_HOST_USER
+ msg['To'] = other_email
+ msg['Subject'] = subject
+ body = message
+ msg.attach(MIMEText(body, 'plain'))
+
+ if attachment:
+ from django.conf import settings
+ from os import listdir, path
+ files = listdir(settings.MEDIA_ROOT)
+ for f in files:
+ attachment = open(path.join(settings.MEDIA_ROOT, f), 'rb')
+ part = MIMEBase('application', 'octet-stream')
+ part.set_payload((attachment).read())
+ encoders.encode_base64(part)
+ part.add_header('Content-Disposition',
+ "attachment; filename= %s " % f)
+ msg.attach(part)
+
+ server = SMTP(EMAIL_HOST, EMAIL_PORT)
+ server.ehlo()
+ server.starttls()
+ server.ehlo()
+ server.esmtp_features['auth'] = 'LOGIN DIGEST-MD5 PLAIN'
+ server.login(EMAIL_HOST_USER, EMAIL_HOST_PASSWORD)
+ text = msg.as_string()
+ server.sendmail(EMAIL_HOST_USER, other_email, text)
+ server.close()
+
+
+def send_email(request, call_on,
+ user_position=None, workshop_date=None,
+ new_workshop_date=None,
+ workshop_title=None, user_name=None,
+ other_email=None, phone_number=None,
+ institute=None, key=None
+ ):
+ '''
+ Email sending function while registration and
+ booking confirmation.
+ '''
+ try:
+ with open(path.join(LOG_FOLDER, 'emailconfig.yaml'), 'r') as configfile:
+ config_dict = yaml.load(configfile)
+ logging.config.dictConfig(config_dict)
+ except:
+ print('File Not Found and Configuration Error')
+ print(LOG_FOLDER)
+ if call_on == "Registration":
+ message = dedent("""\
+ Thank you for registering with us.
+
+ Please click on the below link to
+ activate your account
+ {0}/activate_user/{1}
+
+ After activation you can proceed to book your ticket for
+ the conference/ propose a paper.
+
+ In case of queries regarding ticket booking and proposing a paper,
+ revert to this email.""".format(PRODUCTION_URL, key))
+
+ logging.info("New Registration from: %s", request.user.email)
+ try:
+ send_mail(
+ "NCCPS-2018 Registration at FOSSEE, IIT Bombay", message, SENDER_EMAIL,
+ [request.user.email], fail_silently=True
+ )
+
+ except Exception:
+ send_smtp_email(request=request,
+ subject="NCCPS-2018 Registration - FOSSEE, IIT Bombay",
+ message=message, other_email=request.user.email,
+ )
+
+ elif call_on == "Booking":
+ if user_position == "instructor":
+ message = dedent("""\
+ Coordinator name:{0}
+ Coordinator email: {1}
+ Contact number:{2}
+ Institute:{3}
+ Workshop date:{4}
+ Workshop title:{5}
+
+ You may accept or reject this booking
+ {6}/my_workshops/ .""".format(
+ user_name, request.user.email,
+ request.user.profile.phone_number,
+ request.user.profile.institute,
+ workshop_date, workshop_title,
+ PRODUCTION_URL
+ ))
+
+ logging.info("Booking Done by{0} for {1} ".format(request.user.email,
+ other_email))
+ try:
+ send_mail(
+ "New FOSSEE Workshop booking on {0}".format(workshop_date),
+ message, SENDER_EMAIL, [other_email],
+ fail_silently=True
+ )
+ except Exception:
+ send_smtp_email(request=request,
+ subject="New FOSSEE Workshop booking on {0}"
+ .format(workshop_date),
+ message=message, other_email=other_email,
+ )
+ else:
+ message = dedent("""\
+ Thank You for New FOSSEE Workshop booking.
+
+ Workshop date:{0}
+ Workshop title:{1}
+
+ Your request has been received and is awaiting instructor
+ approval/disapproval. You will be notified about the status
+ via email and on {2}/my_workshops/
+
+ Please Note: Unless you get a confirmation email for this workshop with
+ the list of instructions, your workshop shall be in the waiting list.
+
+ In case of queries regarding workshop booking(s), revert
+ to this email.""".format(
+ workshop_date, workshop_title, PRODUCTION_URL
+ ))
+
+ try:
+ send_mail(
+ "Pending Request for New FOSSEE Workshop booking on {0}"
+ .format(workshop_date), message, SENDER_EMAIL,
+ [request.user.email], fail_silently=True
+ )
+ except Exception:
+ send_smtp_email(request=request,
+ subject="Pending Request for New FOSSEE Workshop booking \
+ on {0}".format(workshop_date),
+ message=message, other_email=request.user.email,
+ )
+
+ elif call_on == "Booking Confirmed":
+ if user_position == "instructor":
+ message = dedent("""\
+ Coordinator name:{0}
+ Coordinator email: {1}
+ Contact number:{2}
+ Institute:{3}
+ Workshop date:{4}
+ Workshop title:{5}
+
+ You have accepted this booking. Detailed instructions have
+ been sent to the coordinator.
+
+ This is a auto-generated mail.
+ """.format(user_name, other_email,
+ phone_number, institute, workshop_date, workshop_title))
+
+ logging.info("Booking Confirmed by {0} for {1} ".format(request.user.email,
+ other_email))
+
+ subject = "FOSSEE Workshop booking confirmation on {0}".\
+ format(workshop_date)
+ msg = EmailMultiAlternatives(
+ subject, message, SENDER_EMAIL, [request.user.email])
+ attachment_paths = path.join(
+ settings.MEDIA_ROOT, workshop_title.replace(" ", "_"))
+ files = listdir(attachment_paths)
+ for f in files:
+ attachment = open(path.join(attachment_paths, f), 'rb')
+ part = MIMEBase('application', 'octet-stream')
+ part.set_payload((attachment).read())
+ encoders.encode_base64(part)
+ part.add_header('Content-Disposition',
+ "attachment; filename= %s " % f)
+ msg.attach(part)
+ sleep(1)
+ msg.send()
+
+ else:
+ message = dedent("""\
+ Instructor name:{0}
+ Instructor email: {1}
+ Contact number:{2}
+ Workshop date:{3}
+ Workshop title:{4}
+
+ Your workshop booking has been accepted. Detailed
+ instructions are attached below.
+
+ In case of queries regarding the workshop
+ instructions/schedule revert to this email.""".format(
+ request.user.username, request.user.email,
+ phone_number, workshop_date, workshop_title
+ ))
+
+ subject = "FOSSEE Workshop booking confirmation on {0}".\
+ format(workshop_date)
+ msg = EmailMultiAlternatives(
+ subject, message, SENDER_EMAIL, [other_email])
+ attachment_paths = path.join(
+ settings.MEDIA_ROOT, workshop_title.replace(" ", "_"))
+ files = listdir(attachment_paths)
+ for f in files:
+ attachment = open(path.join(attachment_paths, f), 'rb')
+ part = MIMEBase('application', 'octet-stream')
+ part.set_payload((attachment).read())
+ encoders.encode_base64(part)
+ part.add_header('Content-Disposition',
+ "attachment; filename= %s " % f)
+ msg.attach(part)
+ msg.send()
+
+ elif call_on == "Booking Request Rejected":
+ if user_position == "instructor":
+ message = dedent("""\
+ Coordinator name: {0}
+ Coordinator email: {1}
+ Contact number: {2}
+ Institute: {3}
+ Workshop date: {4}
+ Workshop title: {5}
+
+ You have rejected this booking. The coordinator has
+ been notified.
+
+ This is a auto-generated mail.
+ """.format(user_name, other_email,
+ phone_number, institute,
+ workshop_date, workshop_title))
+
+ logging.info("Booking Rejected by {0} for {1} ".format(request.user.email,
+ other_email))
+
+ try:
+ send_mail("FOSSEE Workshop booking rejected for {0}"
+ .format(workshop_date), message, SENDER_EMAIL,
+ [request.user.email], fail_silently=True)
+ except Exception:
+ send_smtp_email(request=request,
+ subject="FOSSEE Workshop booking rejected for {0}".
+ format(workshop_date), message=message,
+ other_email=request.user.email
+ )
+ else:
+ message = dedent("""\
+ Workshop date:{0}
+ Workshop title:{1}
+
+ We regret to inform you that your workshop booking
+ has been rejected due to unavailability of the
+ instructor. You may try booking other available
+ slots {2}/book/ or you can also Propose a workshop
+ based on your available date.
+
+ This is a auto-generated mail.
+ """
+ .format(workshop_date, workshop_title, PRODUCTION_URL))
+
+ try:
+ send_mail("FOSSEE Workshop booking rejected for {0}".
+ format(workshop_date), message, SENDER_EMAIL,
+ [other_email], fail_silently=True)
+ except Exception:
+ send_smtp_email(request=request,
+ subject="FOSSEE Workshop booking rejected for {0}".
+ format(workshop_date), message=message,
+ other_email=other_email
+ )
+
+ elif call_on == 'Workshop Deleted':
+ message = dedent("""\
+ You have deleted a Workshop.
+
+ Workshop date:{0}
+ Workshop title:{1}
+
+ This is a auto-generated mail.
+ """
+ .format(workshop_date, workshop_title))
+
+ logging.info("Workshop Deleted by {0} for {1} ".format(request.user.email,
+ workshop_date))
+ try:
+ send_mail("FOSSEE workshop deleted for {0}".format(workshop_date),
+ message, SENDER_EMAIL, [request.user.email],
+ fail_silently=True)
+ except Exception:
+ send_smtp_email(request=request,
+ subject="FOSSEE Workshop deleted for {0}".
+ format(workshop_date), message=message,
+ other_email=request.user.email
+ )
+
+ elif call_on == 'Proposed Workshop':
+ if user_position == "instructor":
+ message = dedent("""\
+ A coordinator has proposed a workshop. The details are
+ given below:
+
+ Coordinator name: {0}
+ Coordinator email: {1}
+ Contact number: {2}
+ Institute: {3}
+ Workshop date: {4}
+ Workshop title: {5}
+
+ Please Accept only if you are willing to take the workshop.
+ {6}/my_workshops/
+
+ This is a auto-generated mail.
+ """
+ .format(user_name, request.user.email,
+ phone_number, institute,
+ workshop_date, workshop_title,
+ PRODUCTION_URL))
+
+ logging.info("Workshop Proposed by {0} for {1} ".format(request.user.email,
+ workshop_date))
+
+ send_mail("Proposed Workshop on {0}".
+ format(workshop_date), message, SENDER_EMAIL,
+ [other_email], fail_silently=False)
+
+ elif call_on == 'Change Date':
+ if user_position == "instructor":
+ message = dedent("""\
+ Dear Instructor,
+
+ Your workshop date has been changed from {0} to {1}.
+
+ This is a auto-generated mail.
+ """
+ .format(
+ workshop_date, new_workshop_date))
+
+ logging.info("Workshop Date Changed Done by {0} from {1} to {2}"
+ .format(request.user.email,
+ new_workshop_date, workshop_date))
+ try:
+ send_mail(
+ "FOSSEE Python Workshop Date Changed",
+ message, SENDER_EMAIL, [request.user.email],
+ fail_silently=True
+ )
+ except Exception:
+ send_smtp_email(request=request,
+ subject="FOSSEE Python Workshop Date Changed",
+ message=message, other_email=other_email,
+ )
+ else:
+ message = dedent("""\
+ Dear Coordinator,
+
+ Your workshop has been rescheduled from {0} to {1}.
+
+ This is a auto-generated mail.
+ """
+ .format(
+ workshop_date, new_workshop_date
+ ))
+
+ try:
+ send_mail(
+ "FOSSEE Python Workshop Date Changed",
+ message, SENDER_EMAIL,
+ [other_email], fail_silently=True
+ )
+ except Exception:
+ send_smtp_email(request=request,
+ subject="FOSSEE Python Workshop Date Changed",
+ message=message, other_email=request.user.email,
+ )