From f0ecae08c53ff3b089de45f537868eb34938da00 Mon Sep 17 00:00:00 2001 From: Neil Martinsen-Burrell Date: Tue, 14 Feb 2023 13:31:00 -0600 Subject: [PATCH] Review feedback: error tolerance, logging, etc. --- src/registrar/config/settings.py | 7 +++- src/registrar/models/domain_application.py | 15 +++++--- src/registrar/utility/email.py | 44 ++++++++++++++-------- 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/registrar/config/settings.py b/src/registrar/config/settings.py index 80f8b8ec9..20b976015 100644 --- a/src/registrar/config/settings.py +++ b/src/registrar/config/settings.py @@ -49,6 +49,9 @@ env_base_url = env.str("DJANGO_BASE_URL") secret_login_key = b64decode(secret("DJANGO_SECRET_LOGIN_KEY", "")) secret_key = secret("DJANGO_SECRET_KEY") +secret_aws_ses_key_id = secret("AWS_ACCESS_KEY_ID", None) +secret_aws_ses_key = secret("AWS_SECRET_ACCESS_KEY", None) + # region: Basic Django Config-----------------------------------------------### @@ -214,8 +217,8 @@ AUTH_USER_MODEL = "registrar.User" # region: Email-------------------------------------------------------------### # Configuration for accessing AWS SES -AWS_ACCESS_KEY_ID = env.str("AWS_ACCESS_KEY_ID", None) -AWS_SECRET_ACCESS_KEY = env.str("AWS_SECRET_ACCESS_KEY", None) +AWS_ACCESS_KEY_ID = secret_aws_ses_key_id +AWS_SECRET_ACCESS_KEY = secret_aws_ses_key AWS_REGION = "us-gov-west-1" # email address to use for various automated correspondence diff --git a/src/registrar/models/domain_application.py b/src/registrar/models/domain_application.py index fcdbcae80..7cfda1440 100644 --- a/src/registrar/models/domain_application.py +++ b/src/registrar/models/domain_application.py @@ -8,7 +8,7 @@ from django.db import models from django_fsm import FSMField, transition # type: ignore from .utility.time_stamped_model import TimeStampedModel -from ..utility.email import send_templated_email +from ..utility.email import send_templated_email, EmailSendingError logger = logging.getLogger(__name__) @@ -478,11 +478,14 @@ class DomainApplication(TimeStampedModel): if self.submitter is None or self.submitter.email is None: logger.warn("Cannot send confirmation email, no submitter email address.") return - send_templated_email( - "emails/submission_confirmation.txt", - self.submitter.email, - context={"id": self.id, "domain_name": self.requested_domain.name}, - ) + try: + send_templated_email( + "emails/submission_confirmation.txt", + self.submitter.email, + context={"id": self.id, "domain_name": self.requested_domain.name}, + ) + except EmailSendingError: + logger.warning("Failed to send confirmation email", exc_info=True) @transition(field="status", source=STARTED, target=SUBMITTED) def submit(self): diff --git a/src/registrar/utility/email.py b/src/registrar/utility/email.py index d5b67f606..9547bb952 100644 --- a/src/registrar/utility/email.py +++ b/src/registrar/utility/email.py @@ -6,6 +6,13 @@ from django.conf import settings from django.template.loader import get_template +class EmailSendingError(RuntimeError): + + """Local error for handling all failures when sending email.""" + + pass + + def send_templated_email(template_name: str, to_address: str, context={}): """Send an email built from a template to one email address. @@ -16,19 +23,26 @@ def send_templated_email(template_name: str, to_address: str, context={}): template = get_template(template_name) email_body = template.render(context=context) - ses_client = boto3.client( - "sesv2", - region_name=settings.AWS_REGION, - aws_access_key_id=settings.AWS_ACCESS_KEY_ID, - aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY, - ) - ses_client.send_email( - FromEmailAddress=settings.DEFAULT_FROM_EMAIL, - Destination={"ToAddresses": [to_address]}, - Content={ - "Simple": { - "Subject": {"Data": "Thank you for applying for a .gov domain"}, - "Body": {"Text": {"Data": email_body}}, + try: + ses_client = boto3.client( + "sesv2", + region_name=settings.AWS_REGION, + aws_access_key_id=settings.AWS_ACCESS_KEY_ID, + aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY, + ) + except Exception as exc: + raise EmailSendingError("Could not access the SES client.") from exc + + try: + ses_client.send_email( + FromEmailAddress=settings.DEFAULT_FROM_EMAIL, + Destination={"ToAddresses": [to_address]}, + Content={ + "Simple": { + "Subject": {"Data": "Thank you for applying for a .gov domain"}, + "Body": {"Text": {"Data": email_body}}, + }, }, - }, - ) + ) + except Exception as exc: + raise EmailSendingError("Could not send SES email.") from exc