From 7993f6e491881258b8219be8e96fb1e9c4c0c7bd Mon Sep 17 00:00:00 2001 From: AntoineLemaire Date: Thu, 12 Oct 2017 15:41:46 +0200 Subject: [PATCH] Add SesApiService --- ApiService/SesApiService.php | 70 +++++++++++++++++++++++++++++++++ Resources/config/apiService.yml | 6 +++ 2 files changed, 76 insertions(+) create mode 100644 ApiService/SesApiService.php diff --git a/ApiService/SesApiService.php b/ApiService/SesApiService.php new file mode 100644 index 0000000..7feaca8 --- /dev/null +++ b/ApiService/SesApiService.php @@ -0,0 +1,70 @@ + SwmMailHookEvent::MAILHOOK_HARDBOUNCE, + 'transient_bounce' => SwmMailHookEvent::MAILHOOK_SOFTBOUNCE, + 'undetermined_bounce' => SwmMailHookEvent::MAILHOOK_SOFTBOUNCE, + 'spam_complaint' => SwmMailHookEvent::MAILHOOK_SPAM, + 'delivery' => SwmMailHookEvent::MAILHOOK_SEND, + ]; + + const SNS_BOUNCE = 'Bounce'; + const SNS_COMPLAINT = 'Complaint'; + const SNS_DELIVERY = 'Delivery'; + + /** + * @throws \Exception + * + * @return array + */ + public function bind() + { + $metaData = json_decode($this->request->getContent(), true); + + if (isset($metaData['Type']) && $metaData['Type'] == 'SubscriptionConfirmation') { + throw new \Exception('AWS SNS Require a subscription confirmation: '.$metaData['SubscribeURL']); + } + + if (!isset($metaData['Message'])) { + throw new \Exception('Could not find data'); + } + + $sesMessage = json_decode($metaData['Message'], true); + + $hooks = []; + + switch ($sesMessage['notificationType']) { + case self::SNS_BOUNCE: + $event = strtolower($sesMessage['bounce']['bounceType']).'_bounce'; + foreach ($sesMessage['bounce']['bouncedRecipients'] as $recipient) { + $hooks[] = new DefaultHook($event, $recipient['emailAddress'], 'ses', $sesMessage, $this->eventAssoc[$event]); + } + + break; + case self::SNS_COMPLAINT: + $event = 'spam_complaint'; + foreach ($sesMessage['complaint']['complainedRecipients'] as $recipient) { + $hooks[] = new DefaultHook($event, $recipient['emailAddress'], 'ses', $sesMessage, $this->eventAssoc[$event]); + } + + break; + case self::SNS_DELIVERY: + $event = 'delivery'; + foreach ($sesMessage['delivery']['recipients'] as $recipient) { + $hooks[] = new DefaultHook($event, $recipient, 'ses', $sesMessage, $this->eventAssoc[$event]); + } + + break; + default: + } + + return $hooks; + } +} diff --git a/Resources/config/apiService.yml b/Resources/config/apiService.yml index 7746e52..7ae3de4 100644 --- a/Resources/config/apiService.yml +++ b/Resources/config/apiService.yml @@ -5,6 +5,7 @@ parameters: swm.mail_hook.api_service.mandrill.class: Swm\Bundle\MailHookBundle\ApiService\MandrillApiService swm.mail_hook.api_service.sendgrid.class: Swm\Bundle\MailHookBundle\ApiService\SendgridApiService swm.mail_hook.api_service.sparkpost.class: Swm\Bundle\MailHookBundle\ApiService\SparkpostApiService + swm.mail_hook.api_service.ses.class: Swm\Bundle\MailHookBundle\ApiService\SesApiService services: swm.mail_hook.api_service.campainmonitor: @@ -36,3 +37,8 @@ services: class: "%swm.mail_hook.api_service.sparkpost.class%" tags: - { name: swm.mailhook, alias: sparkpost } + + swm.mail_hook.api_service.ses: + class: "%swm.mail_hook.api_service.ses.class%" + tags: + - { name: swm.mailhook, alias: ses } \ No newline at end of file