about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/sendgrid/helpers/inbound/parse.py
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/sendgrid/helpers/inbound/parse.py')
-rw-r--r--.venv/lib/python3.12/site-packages/sendgrid/helpers/inbound/parse.py100
1 files changed, 100 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/sendgrid/helpers/inbound/parse.py b/.venv/lib/python3.12/site-packages/sendgrid/helpers/inbound/parse.py
new file mode 100644
index 00000000..49627a12
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/sendgrid/helpers/inbound/parse.py
@@ -0,0 +1,100 @@
+"""Parse data received from the SendGrid Inbound Parse webhook"""
+import base64
+import email
+import mimetypes
+from six import iteritems
+from werkzeug.utils import secure_filename
+
+
+class Parse(object):
+
+    def __init__(self, config, request):
+        self._keys = config.keys
+        self._request = request
+        request.get_data(as_text=True)
+        self._payload = request.form
+        self._raw_payload = request.data
+
+    def key_values(self):
+        """
+        Return a dictionary of key/values in the payload received from
+        the webhook
+        """
+        key_values = {}
+        for key in self.keys:
+            if key in self.payload:
+                key_values[key] = self.payload[key]
+        return key_values
+
+    def get_raw_email(self):
+        """
+        This only applies to raw payloads:
+        https://sendgrid.com/docs/Classroom/Basics/Inbound_Parse_Webhook/setting_up_the_inbound_parse_webhook.html#-Raw-Parameters
+        """
+        if 'email' in self.payload:
+            raw_email = email.message_from_string(self.payload['email'])
+            return raw_email
+        else:
+            return None
+
+    def attachments(self):
+        """Returns an object with:
+        type = file content type
+        file_name = the name of the file
+        contents = base64 encoded file contents"""
+        attachments = None
+        if 'attachment-info' in self.payload:
+            attachments = self._get_attachments(self.request)
+        # Check if we have a raw message
+        raw_email = self.get_raw_email()
+        if raw_email is not None:
+            attachments = self._get_attachments_raw(raw_email)
+        return attachments
+
+    def _get_attachments(self, request):
+        attachments = []
+        for _, filestorage in iteritems(request.files):
+            attachment = {}
+            if filestorage.filename not in (None, 'fdopen', '<fdopen>'):
+                filename = secure_filename(filestorage.filename)
+                attachment['type'] = filestorage.content_type
+                attachment['file_name'] = filename
+                attachment['contents'] = base64.b64encode(filestorage.read())
+                attachments.append(attachment)
+        return attachments
+
+    def _get_attachments_raw(self, raw_email):
+        attachments = []
+        counter = 1
+        for part in raw_email.walk():
+            attachment = {}
+            if part.get_content_maintype() == 'multipart':
+                continue
+            filename = part.get_filename()
+            if not filename:
+                ext = mimetypes.guess_extension(part.get_content_type())
+                if not ext:
+                    ext = '.bin'
+                filename = 'part-%03d%s' % (counter, ext)
+            counter += 1
+            attachment['type'] = part.get_content_type()
+            attachment['file_name'] = filename
+            attachment['contents'] = part.get_payload(decode=False)
+            attachments.append(attachment)
+        return attachments
+
+    @property
+    def keys(self):
+        return self._keys
+
+    @property
+    def request(self):
+        return self._request
+
+    @property
+    def payload(self):
+        return self._payload
+
+    @property
+    def raw_payload(self):
+        return self._raw_payload