"""Handles incoming sesv2 requests, invokes methods, returns responses.""" import base64 import json from typing import List from urllib.parse import unquote from moto.core.responses import BaseResponse from .models import SESV2Backend, sesv2_backends class SESV2Response(BaseResponse): """Handler for SESV2 requests and responses.""" def __init__(self) -> None: super().__init__(service_name="sesv2") @property def sesv2_backend(self) -> SESV2Backend: """Return backend instance specific for this region.""" return sesv2_backends[self.current_account][self.region] def send_email(self) -> str: """Piggy back on functionality from v1 mostly""" params = json.loads(self.body) from_email_address = params.get("FromEmailAddress") destination = params.get("Destination", {}) content = params.get("Content") if "Raw" in content: all_destinations: List[str] = [] if "ToAddresses" in destination: all_destinations = all_destinations + destination["ToAddresses"] if "CcAddresses" in destination: all_destinations = all_destinations + destination["CcAddresses"] if "BccAddresses" in destination: all_destinations = all_destinations + destination["BccAddresses"] message = self.sesv2_backend.send_raw_email( source=from_email_address, destinations=all_destinations, raw_data=base64.b64decode(content["Raw"]["Data"]).decode("utf-8"), ) elif "Simple" in content: content_body = content["Simple"]["Body"] if "Html" in content_body: body = content_body["Html"]["Data"] else: body = content_body["Text"]["Data"] message = self.sesv2_backend.send_email( # type: ignore source=from_email_address, destinations=destination, subject=content["Simple"]["Subject"]["Data"], body=body, ) elif "Template" in content: raise NotImplementedError("Template functionality not ready") return json.dumps({"MessageId": message.id}) def create_contact_list(self) -> str: params = json.loads(self.body) self.sesv2_backend.create_contact_list(params) return json.dumps({}) def get_contact_list(self) -> str: contact_list_name = self._get_param("ContactListName") contact_list = self.sesv2_backend.get_contact_list(contact_list_name) return json.dumps(contact_list.response_object) def list_contact_lists(self) -> str: contact_lists = self.sesv2_backend.list_contact_lists() return json.dumps(dict(ContactLists=[c.response_object for c in contact_lists])) def delete_contact_list(self) -> str: name = self._get_param("ContactListName") self.sesv2_backend.delete_contact_list(name) return json.dumps({}) def create_contact(self) -> str: contact_list_name = self._get_param("ContactListName") params = json.loads(self.body) self.sesv2_backend.create_contact(contact_list_name, params) return json.dumps({}) def get_contact(self) -> str: email = unquote(self._get_param("EmailAddress")) contact_list_name = self._get_param("ContactListName") contact = self.sesv2_backend.get_contact(email, contact_list_name) return json.dumps(contact.response_object) def list_contacts(self) -> str: contact_list_name = self._get_param("ContactListName") contacts = self.sesv2_backend.list_contacts(contact_list_name) return json.dumps(dict(Contacts=[c.response_object for c in contacts])) def delete_contact(self) -> str: email = self._get_param("EmailAddress") contact_list_name = self._get_param("ContactListName") self.sesv2_backend.delete_contact(unquote(email), contact_list_name) return json.dumps({}) def create_email_identity(self) -> str: email_identity_name = self._get_param("EmailIdentity") tags = self._get_param("Tags") dkim_signing_attributes = self._get_param("DkimSigningAttributes") configuration_set_name = self._get_param("ConfigurationSetName") email_identity = self.sesv2_backend.create_email_identity( email_identity=email_identity_name, tags=tags, dkim_signing_attributes=dkim_signing_attributes, configuration_set_name=configuration_set_name, ) return json.dumps( dict( IdentityType=email_identity.identity_type, VerifiedForSendingStatus=email_identity.verified_for_sending_status, DkimAttributes=email_identity.dkim_attributes, ) ) def get_email_identity(self) -> str: email_identity_name = self._get_param("EmailIdentity") email_identity = self.sesv2_backend.get_email_identity( email_identity=email_identity_name, ) return json.dumps(email_identity.get_response_object) def list_email_identities(self) -> str: next_token = self._get_param("NextToken") page_size = self._get_param("PageSize") email_identities, next_token = self.sesv2_backend.list_email_identities( next_token=next_token, page_size=page_size, ) if isinstance(email_identities, list): response = [e.list_response_object for e in email_identities] else: response = [] return json.dumps( dict( EmailIdentities=response, NextToken=next_token, ) ) def create_configuration_set(self) -> str: configuration_set_name = self._get_param("ConfigurationSetName") tracking_options = self._get_param("TrackingOptions") delivery_options = self._get_param("DeliveryOptions") reputation_options = self._get_param("ReputationOptions") sending_options = self._get_param("SendingOptions") tags = self._get_param("Tags") suppression_options = self._get_param("SuppressionOptions") vdm_options = self._get_param("VdmOptions") self.sesv2_backend.create_configuration_set( configuration_set_name=configuration_set_name, tracking_options=tracking_options, delivery_options=delivery_options, reputation_options=reputation_options, sending_options=sending_options, tags=tags, suppression_options=suppression_options, vdm_options=vdm_options, ) return json.dumps({}) def delete_configuration_set(self) -> str: configuration_set_name = self._get_param("ConfigurationSetName") self.sesv2_backend.delete_configuration_set( configuration_set_name=configuration_set_name, ) return json.dumps({}) def get_configuration_set(self) -> str: configuration_set_name = self._get_param("ConfigurationSetName") config_set = self.sesv2_backend.get_configuration_set( configuration_set_name=configuration_set_name, ) return json.dumps(config_set.to_dict_v2()) def list_configuration_sets(self) -> str: next_token = self._get_param("NextToken") page_size = self._get_param("PageSize") configuration_sets = self.sesv2_backend.list_configuration_sets( next_token=next_token, page_size=page_size ) return json.dumps( dict(ConfigurationSets=configuration_sets, NextToken=next_token) ) def create_dedicated_ip_pool(self) -> str: pool_name = self._get_param("PoolName") tags = self._get_param("Tags") scaling_mode = self._get_param("ScalingMode") self.sesv2_backend.create_dedicated_ip_pool( pool_name=pool_name, tags=tags, scaling_mode=scaling_mode, ) return json.dumps({}) def delete_dedicated_ip_pool(self) -> str: pool_name = self._get_param("PoolName") self.sesv2_backend.delete_dedicated_ip_pool( pool_name=pool_name, ) return json.dumps({}) def list_dedicated_ip_pools(self) -> str: next_token = self._get_param("NextToken") page_size = self._get_param("PageSize") dedicated_ip_pools, next_token = self.sesv2_backend.list_dedicated_ip_pools( next_token=next_token, page_size=page_size ) return json.dumps( dict(DedicatedIpPools=dedicated_ip_pools, NextToken=next_token) ) def get_dedicated_ip_pool(self) -> str: pool_name = self._get_param("PoolName") dedicated_ip_pool = self.sesv2_backend.get_dedicated_ip_pool( pool_name=pool_name, ) return json.dumps(dict(DedicatedIpPool=dedicated_ip_pool.to_dict()))
Memory