Exemple #1
0
 def construct_reset(self, reset):
     self.subject = config["password_resets"]["subject"]
     log.debug(f"{self.address}: Using subject {self.subject}")
     log.debug(f"{self.address}: Constructing email content")
     try:
         expiry = date_parser.parse(reset["ExpirationDate"])
     except:
         log.error(f"{self.address}: Couldn't parse expiry time")
         return False
     current_time = datetime.datetime.utcnow().replace(tzinfo=pytz.utc)
     if expiry >= current_time:
         log.debug(f"{self.address}: Invite valid")
         pretty = self.pretty_time(expiry, tzaware=True)
         email_message = config["email"]["message"]
         for key in ["text", "html"]:
             fpath = Path(config["password_resets"]["email_" + key])
             with open(fpath, 'r') as f:
                 template = Template(f.read())
             c = template.render(
                 username=reset["UserName"],
                 expiry_date=pretty["date"],
                 expiry_time=pretty["time"],
                 expires_in=pretty["expires_in"],
                 pin=reset["Pin"],
                 message=email_message,
             )
             self.content[key] = c
             log.info(f"{self.address}: {key} constructed")
         return True
     else:
         err = (f"{self.address}: " +
                "Reset has reportedly already expired. " +
                "Ensure timezones are correctly configured.")
         log.error(err)
         return False
Exemple #2
0
 def construct_expiry(self, invite):
     self.subject = "Notice: Invite expired"
     log.debug(f'Constructing expiry notification for {invite["code"]}')
     expiry = format_datetime(invite["expiry"])
     for key in ["text", "html"]:
         fpath = Path(config["notifications"]["expiry_" + key])
         with open(fpath, 'r') as f:
             template = Template(f.read())
         c = template.render(code=invite["code"], expiry=expiry)
         self.content[key] = c
         log.info(f"{self.address}: {key} constructed")
     return True
Exemple #3
0
 def construct_created(self, invite):
     self.subject = "Notice: User created"
     log.debug(
         f'Constructing user creation notification for {invite["code"]}')
     created = format_datetime(invite["created"])
     if config.getboolean("email", "no_username"):
         email = "n/a"
     else:
         email = invite["address"]
     for key in ["text", "html"]:
         fpath = Path(config["notifications"]["created_" + key])
         with open(fpath, 'r') as f:
             template = Template(f.read())
         c = template.render(
             code=invite["code"],
             username=invite["username"],
             address=email,
             time=created,
         )
         self.content[key] = c
         log.info(f"{self.address}: {key} constructed")
     return True
Exemple #4
0
 def send(self):
     message = MIMEMultipart("alternative")
     message["Subject"] = self.subject
     message["From"] = self.from_address
     message["To"] = self.address
     text = MIMEText(self.content["text"], "plain")
     html = MIMEText(self.content["html"], "html")
     message.attach(text)
     message.attach(html)
     try:
         if config["smtp"]["encryption"] == "ssl_tls":
             self.context = ssl.create_default_context()
             with smtplib.SMTP_SSL(self.server,
                                   self.port,
                                   context=self.context) as server:
                 server.ehlo()
                 server.login(self.from_address, self.password)
                 server.sendmail(self.from_address, self.address,
                                 message.as_string())
             log.info(f"{self.address}: Sent via smtp (ssl/tls)")
             return True
         elif config["smtp"]["encryption"] == "starttls":
             with smtplib.SMTP(self.server, self.port) as server:
                 server.ehlo()
                 server.starttls()
                 server.login(self.from_address, self.password)
                 server.sendmail(self.from_address, self.address,
                                 message.as_string())
                 log.info(f"{self.address}: Sent via smtp (starttls)")
                 return True
     except Exception as e:
         log.error(
             f"{self.address}: Failed to send via smtp ({type(e).__name__}: {e.args})"
         )
         try:
             log.error(e.smtp_error)
         except:
             pass
         return False
Exemple #5
0
 def construct_invite(self, invite):
     self.subject = config["invite_emails"]["subject"]
     log.debug(f"{self.address}: Using subject {self.subject}")
     log.debug(f"{self.address}: Constructing email content")
     expiry = invite["expiry"]
     expiry.replace(tzinfo=None)
     pretty = self.pretty_time(expiry)
     email_message = config["email"]["message"]
     invite_link = config["invite_emails"]["url_base"]
     invite_link += "/" + invite["code"]
     for key in ["text", "html"]:
         fpath = Path(config["invite_emails"]["email_" + key])
         with open(fpath, 'r') as f:
             template = Template(f.read())
         c = template.render(
             expiry_date=pretty["date"],
             expiry_time=pretty["time"],
             expires_in=pretty["expires_in"],
             invite_link=invite_link,
             message=email_message,
         )
         self.content[key] = c
         log.info(f"{self.address}: {key} constructed")
Exemple #6
0
 def send(self):
     response = requests.post(
         self.api_url,
         auth=("api", self.api_key),
         data={
             "from": self.from_mg,
             "to": [self.address],
             "subject": self.subject,
             "text": self.content["text"],
             "html": self.content["html"],
         },
     )
     if response.ok:
         log.info(f"{self.address}: Sent via mailgun.")
         return True
     elif response.status_code in Mailgun.errors:
         log.error(
             f"{self.address}: {Mailgun.errors[response.status_code]}")
     else:
         log.error(
             f"{self.address}: Mailgun failed with error {response.status_code}"
         )
     return response