mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-23 17:01:35 -05:00
There are several reasons why we might get an `InvalidParameterValue` from the SES API. One, as correctly identified before in https://github.com/alphagov/notifications-api/pull/713/files is if we allow an email address on our side that SES rejects. However, there are other types of errors that could cause an `InvalidParameterValue`. One example is a `Header too long: 'Subject'` error that we have seen happen in production. This shouldn't raise an `InvalidEmailError` as that is not appropriate. Therefore, we introduce a new exception `EmailClientNonRetryableException`, that represents any exception back from an email client that we can use whenever we get a `InvalidParameterValue` error. Note, I chose `EmailClientNonRetryableException` rather than `SESClientNonRetryableException` as our code needs to catch this exception and it shouldn't be aware of what email client is being used, it just needs to know that it came from one of the email clients (if in time we have more than one). In time, we may wish to extend the approach of having generic `EmailClient` exceptions and `SMSClient` exceptions as this should be the most extendable pattern and a good abstraction.
33 lines
988 B
Python
33 lines
988 B
Python
from app.clients import ClientException, Client
|
|
|
|
|
|
class EmailClientException(ClientException):
|
|
'''
|
|
Base Exception for EmailClients
|
|
'''
|
|
pass
|
|
|
|
|
|
class EmailClientNonRetryableException(ClientException):
|
|
'''
|
|
Represents an error returned from the email client API with a 4xx response code
|
|
that should not be retried and should instead be marked as technical failure.
|
|
An example of this would be an email address that makes it through our
|
|
validation rules but is rejected by SES. There is no point in retrying this type as
|
|
it will always fail however many calls to SES. Whereas a throttling error would not
|
|
use this exception as it may succeed if we retry
|
|
'''
|
|
pass
|
|
|
|
|
|
class EmailClient(Client):
|
|
'''
|
|
Base Email client for sending emails.
|
|
'''
|
|
|
|
def send_email(self, *args, **kwargs):
|
|
raise NotImplementedError('TODO Need to implement.')
|
|
|
|
def get_name(self):
|
|
raise NotImplementedError('TODO Need to implement.')
|