Review feedback: error tolerance, logging, etc.

This commit is contained in:
Neil Martinsen-Burrell 2023-02-14 13:31:00 -06:00
parent a314b905d3
commit f0ecae08c5
No known key found for this signature in database
GPG key ID: 6A3C818CC10D0184
3 changed files with 43 additions and 23 deletions

View file

@ -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

View file

@ -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):

View file

@ -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