def dispatchInvitation(invitation: Invitation) -> bool: """ Sends an email to an invitee """ try: assert not invitation.mailed and not invitation.fulfilled except AssertionError: logger.warning(f"Invitation for {invitation.email} was not sent: " "Already fulfilled!") return False if invitation.refkey is None: invitation.refkey = referralKeygen(invitation.email) invitation.save() if invitation.customemail and invitation.customsig: et = EmailTemplate( subject=settings.DEFAULT_EMAIL_TITLE, headline="Conflict Cartographer", message=invitation.customemail, signature=invitation.customsig, ) else: try: et = EmailTemplate.objects.get(active=True, email_type="inv") except EmailTemplate.DoesNotExist: et = EmailTemplate.objects.create( active=True, subject=settings.DEFAULT_EMAIL_TITLE, email_type="inv") html = renderEmailTemplate(et, {"link": invitation.invitationLink()}) plaintext = re.sub("\[[^\)]+", invitation.invitationLink(), et.message) call = { "subject": et.subject, "message": plaintext, "html_message": html, "from_email": settings.EMAIL_FROM_ADDRESS, "recipient_list": [invitation.email] } try: mail.send_mail(**call) except ConnectionRefusedError: logger.error("Failed to send email to %s, connection refused!", invitation.email) return False else: logger.info("Sent email to %s", invitation.email) invitation.mailed = True invitation.save() return True