Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix ingestion of emails with attachments #210

Merged
merged 4 commits into from Jul 14, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 1 addition & 5 deletions docker/app/Dockerfile
Expand Up @@ -25,11 +25,7 @@ RUN make ci clean

FROM python:${PYTHON_VERSION}-slim AS runtime

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates=20161130+nmu1+deb9u1 \
&& rm -rf /var/lib/apt/lists/* \
&& groupadd -r opwen \
RUN groupadd -r opwen \
&& useradd -r -s /bin/false -g opwen opwen

COPY --from=builder /deps /deps
Expand Down
4 changes: 2 additions & 2 deletions opwen_email_server/actions.py
Expand Up @@ -24,8 +24,8 @@
from opwen_email_server.utils.serialization import from_base64
from opwen_email_server.utils.serialization import from_jsonl_bytes
from opwen_email_server.utils.serialization import to_base64
from opwen_email_server.utils.serialization import to_json
from opwen_email_server.utils.serialization import to_jsonl_bytes
from opwen_email_server.utils.serialization import to_msgpack_bytes
from opwen_email_server.utils.string import is_lowercase

Response = Union[dict, Tuple[str, int]]
Expand Down Expand Up @@ -114,7 +114,7 @@ def _parse_mime_email(self, mime_email: str) -> dict:

@classmethod
def _to_id(cls, email: dict) -> str:
return sha256(to_json(email).encode('utf-8')).hexdigest()
return sha256(to_msgpack_bytes(email)).hexdigest()


class StoreWrittenClientEmails(_Action):
Expand Down
15 changes: 7 additions & 8 deletions opwen_email_server/services/sendgrid.py
Expand Up @@ -96,14 +96,13 @@ def _create_attachment(cls, attachment: dict) -> Attachment:
filename = attachment.get('filename', '')
content = attachment.get('content', b'')

mail_attachment = Attachment()
mail_attachment.disposition = 'attachment'
mail_attachment.filename = filename
mail_attachment.content_id = filename
mail_attachment.type = guess_type(filename)[0]
mail_attachment.content = to_base64(content)

return mail_attachment
return Attachment(
disposition='attachment',
file_name=filename,
content_id=filename,
file_type=guess_type(filename)[0],
file_content=to_base64(content),
)


class SetupSendgridMailbox(LogMixin):
Expand Down
Binary file modified tests/files/end_to_end/client-emails.tar.gz
Binary file not shown.
250 changes: 233 additions & 17 deletions tests/files/end_to_end/inbound-email.mime
@@ -1,27 +1,243 @@
Received: by mx0028p1mdw1.sendgrid.net with SMTP id Yt3NEnbnLU Mon, 13 Feb 2017 06:25:41 +0000 (UTC)
Received: from mail-yw0-f176.google.com (mail-yw0-f176.google.com [209.85.161.176]) by mx0028p1mdw1.sendgrid.net (Postfix) with ESMTPS id C726D640B63; Mon, 13 Feb 2017 06:25:41 +0000 (UTC)
Received: by mail-yw0-f176.google.com with SMTP id w75so45612320ywg.1; Sun, 12 Feb 2017 22:25:41 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=ViHLGS6kOdo9Q9CkDDSSSS3bgKuN0a+UXhwMw06ak4Q=; b=f3WGzjgLe0tPG2edhiHxiCEZatThUga/qJFnWZNyY4lEVjRM9l3qn1BZ4ITawT9tDK LS6qFx//6in7u0rV0YKoa8TfScUFOpPHGCmq1Wxdp7mrWP7GDuCOz3LzyXQsrBe/erGy YEjAVU876sWJ109mcMcmbgOL1SD3d4ak+8GVBSC8oMKPj5XWZsET7WmsonhKf5PHE9IW eJHKqdOkxiPbmDutVx7uS1Bi5u4d9UYPhgxFwAK9lWyJ/Esw6yffjlrUvmQCPibSCxRv o979yY6FyJXDJ82l4ErntcOloFNpzWZ89WkRhb1aBLUoZs3402s6D3wC0ljpmvneIAkw 3D6A==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=ViHLGS6kOdo9Q9CkDDSSSS3bgKuN0a+UXhwMw06ak4Q=; b=sWY7uU6kK3dg62wVuxcLsRYLg3eGcoLuoLjL0Ju/sl9rGqSDxVc2saIS0ThfUaHlfZ g1zvF+rBoxa7v9jk7MhEw3izW01WXDMm0w2JGc1QLTo3ZM2xW9Clss63R3ZtNKabuyhd 77NHAgbarmQGW5XuqwS1Fy0NMWHkAlLsZd2AnkNb6gCI/VHCCv/oem19bWvNWwRTPBYE cQDPJfzRiUzRPNZPLtlL5ybd2yyb4lcuG+2QoQV8uxPsKS4eDOjNmM76UWZ9s/Ul/mR+ Qbyui7suOO0vPy8GFJHPV9X2ffLqesafTAetCj3LClCdLIdfQDaK86mmVHOT6zldeCTa HH6Q==
X-Gm-Message-State: AMke39n2h/OZU6fwgOdDltzsKqISVbe3ez6t19OeVrg2sT3pDRhSSQiIcwGzKjdWOD/oX96rQlTi0O9t9yhUfA==
X-Received: by 10.129.81.4 with SMTP id f4mr15409224ywb.239.1486967141412; Sun, 12 Feb 2017 22:25:41 -0800 (PST)
Received: by mx0032p1mdw1.sendgrid.net with SMTP id j5s6OrIxAo Mon, 13 Feb 2017 06:26:01 +0000 (UTC)
Received: from mail-yw0-f176.google.com (mail-yw0-f176.google.com [209.85.161.176]) by mx0032p1mdw1.sendgrid.net (Postfix) with ESMTPS id ED0E6865CD for <clemens@victoria.lokole.ca>; Mon, 13 Feb 2017 06:26:00 +0000 (UTC)
Received: by mail-yw0-f176.google.com with SMTP id v200so45517752ywc.3 for <clemens@victoria.lokole.ca>; Sun, 12 Feb 2017 22:26:00 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=BzB59eE6aqgBqNykdZ9LSb3ZuGuXFfDT9pvFSFek5s0=; b=FMASsyJpei2ae3965M1t46+/teaQXdqdsXOPd6viine1X10sEbhuGjX3LGTq3WnMUy f+xydQsjhTTSb15LuJivlsSyLN3dPKyqON4dnfQ6t4mPY3ol0Bnl2GvQico3U4whd6QG KuQtoJqijO4O8TBTWxQqoEjVapAZhr9qK0ZfhCuDCtZ5xfEtdphYkEq+pT52ykIn/Hy/ 6zjWfHKLB9fwiyKtc7Dv2GnPUt2vW/YJs8lsA/hrCISwq2Oy9dCyEX4+IZ/xABL+KLox nEsk4/wMLmHHvv3X1sODcIshGPuX0mloj2YkugRZHnwrTm7FEAjTAhRElwNGPSedSqqW l2Cw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=BzB59eE6aqgBqNykdZ9LSb3ZuGuXFfDT9pvFSFek5s0=; b=n+2qfxqxwNZyVk1+Rd4wS19yZrA7bE2U+AoQ7Jl3d7lAl1V7VV71/jBJFkXEIy6r2Q tqsInRPhv5aQ02W70y9gWB7Bib6Cf353jTHznF4qgjZoUohY8ygNyNrwvjnj2l7T2S+g xn0sCgyYsHbjyLOLF1PoBEUbmNGKcJWf2WIUxQ3wlSZ7tV/nuVj5n/QicAL9yk5e2YsH 5CNYDCFpTFS86SULGAfgeGpTswv0fjKPVipLJFJaw7WziV+v7t4F/jBngqSV0Sy4kyPn UlNn+T7uPlp8A9XgH1tiE7DMt99l2M7qWH0FMI45pZGoVpssmHQw1cuLqJf2F2So/Dhs dhhA==
X-Gm-Message-State: AMke39nSCiOqrDKq7uOX7CaQVazGrDl5fI6cBqEyIbOhxDeR85q1Sl9Ae6//kVayvLfguqV5ErlYVxvjE8p9vw==
X-Received: by 10.129.132.77 with SMTP id u74mr15464915ywf.125.1486967160539; Sun, 12 Feb 2017 22:26:00 -0800 (PST)
MIME-Version: 1.0
Received: by 10.129.156.139 with HTTP; Sun, 12 Feb 2017 22:25:01 -0800 (PST)
Received: by 10.129.156.139 with HTTP; Sun, 12 Feb 2017 22:25:20 -0800 (PST)
From: Clemens Wolff <clemens.wolff@gmail.com>
Date: Sun, 12 Feb 2017 22:25:01 -0800
Message-ID: <CAL79TcnjhV5PinZVY8Y3QEoNNcSa9uuNU5N3EP-gqcYPFfuHLA@mail.gmail.com>
Subject: Test email sent to Lokole client
Date: Sun, 12 Feb 2017 22:25:20 -0800
Message-ID: <CAL79Tc=+euwNVm73=vJLZYwOW+vq4Rr14TwhOWEU6uonM9rCLQ@mail.gmail.com>
Subject: With attachment
To: clemens@developer1.lokole.ca, laura@developer1.lokole.ca, nzola@developer2.lokole.ca
Content-Type: multipart/alternative; boundary=001a1146392641b94705486384bf
Content-Type: multipart/mixed; boundary=001a114f099665b49a0548638593

--001a1146392641b94705486384bf
--001a114f099665b49a0548638593
Content-Type: multipart/alternative; boundary=001a114f099665b4940548638591

--001a114f099665b4940548638591
Content-Type: text/plain; charset=UTF-8

Body of the message.
And a body

--001a1146392641b94705486384bf
--001a114f099665b4940548638591
Content-Type: text/html; charset=UTF-8

<div dir="ltr">Body of the <b>message</b>.</div>
<div dir="ltr">And a body</div>

--001a114f099665b4940548638591--

--001a114f099665b49a0548638593
Content-Type: image/png; name="cute-mouse-clipart-mouse4.png"
Content-Disposition: attachment; filename="cute-mouse-clipart-mouse4.png"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_iz3ptt6p0

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
wHUAAAAASUVORK5CYII=

--001a1146392641b94705486384bf--
--001a114f099665b49a0548638593--
2 changes: 1 addition & 1 deletion tests/opwen_email_server/test_actions.py
Expand Up @@ -111,7 +111,7 @@ def test_200(self):
domain = 'test.com'
raw_email = 'dummy-mime'
parsed_email = {'to': ['foo@{}'.format(domain)]}
email_id = 'eaee7d51a5440981d5df66825134dcfe0490f145e1ad689bce8c68caeaecde53'
email_id = 'c1763288b50107e4e4df4f2d7144f1085729ed112500995ab8103dd532276c18'
stored_email = dict(parsed_email)
stored_email['_uid'] = email_id

Expand Down