Skip to content

Instantly share code, notes, and snippets.

@settermjd
Last active November 24, 2023 06:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save settermjd/f8c5cd8c9a1874dfcef4cef932d1e161 to your computer and use it in GitHub Desktop.
Save settermjd/f8c5cd8c9a1874dfcef4cef932d1e161 to your computer and use it in GitHub Desktop.
Received: by mx0032p1mdw1.sendgrid.net with SMTP id rOkt2xLLKV Tue, 19 Jul 2016 15:06:29 +0000 (UTC)
Received: from mail-it0-f45.google.com (mail-it0-f45.google.com [209.85.214.45]) by mx0032p1mdw1.sendgrid.net (Postfix) with ESMTPS id 26D6080397 for <parse@parse.yourdomain>; Tue, 19 Jul 2016 15:06:22 +0000 (UTC)
Received: by mail-it0-f45.google.com with SMTP id f6so93587860ith.1 for <example@example.comom>; Tue, 19 Jul 2016 08:06:22 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sendgrid.com; s=ga1; h=mime-version:from:date:message-id:subject:to; bh=UYWCIUKTVXyV9U41l+c9+qOlpoeQGcJkKpyOAatNr3Y=; b=c1I/LcqHEJklmAThWr9Z8NKlTPHUlE/8sDSpK382fJtIQcGdUtczG0pijnUHegrFVt FDr4NehtJDD9KFvXLXboLCtObsu5HTN99ckUCCZTibZseA+J8U3jjCqTdj1fmUage5C7 //Iwi0Ndioonzhm18J7KStap66yZ69ED7UxPk=
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=UYWCIUKTVXyV9U41l+c9+qOlpoeQGcJkKpyOAatNr3Y=; b=lgmLXnmmpNcQMckjshsZsa2/8OjFZzntWYSG5XZo0fi32KHLuBLSHuNDFXn0V4ICp1 1xuT2fZCyhBSgNBiWNbjqFspdemzrBjaI1Tgm/Zz8Fv6wW2XdjpoANNQzJxfdhnecPd5 HvZ5P8+KTqjr4tAa9RmLthDc3UqhV9NRnCnhbW/AZaVQLB8eoJus92tD1GeXpBQml5XF m6vPUGrWGZWNugINkRKxIpk+2uECglAjNm4NpZIi9j7N94CxA18RC4NJ59WIsSybtIer hbCgT1Q13rvGEzvnp6FfFQVbE3DOibNqd0bh/EvZCagFVbnenNc/Q+qHtU9KqFlisSOp xh0w==
X-Gm-Message-State: ALyK8tINVaZIP8YCgQbpg5ya8EnqQo76uxkXUPpDnM+kAyAQQzehFU10EgyuAe2fAmWf/muBiFDy0JDU74Eclp1/
X-Received: by 10.36.76.16 with SMTP id a16mr4479786itb.77.1468940781988; Tue, 19 Jul 2016 08:06:21 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.107.48.17 with HTTP; Tue, 19 Jul 2016 08:06:21 -0700 (PDT)
From: Sender Name <example@example.com>
Date: Tue, 19 Jul 2016 09:06:21 -0600
Message-ID: <CAN_P_JNa25--hzm5=-ES9cnxgWa+h+E49OOAS7sPpV0gsoXCOw@mail.gmail.com>
Subject: Hello
To: example@example.comom
Content-Type: multipart/mixed; boundary=001a11447dc881e40f0537fe6d5a
--001a11447dc881e40f0537fe6d5a
Content-Type: multipart/alternative; boundary=001a11447dc881e40b0537fe6d58
--001a11447dc881e40b0537fe6d58
Content-Type: text/plain; charset=UTF-8
This is a test email with 1 attachment.
--001a11447dc881e40b0537fe6d58
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">This is a test email with 1 attachment.<br clear=3D"all"><=
div><br></div>-- <br><div class=3D"gmail_signature" data-smartmail=3D"gmail=
_signature"><div dir=3D"ltr"><img src=3D"https://sendgrid.com/brand/sg-logo=
-email.png" width=3D"96" height=3D"17"><br><div><br></div></div></div>
</div>
--001a11447dc881e40b0537fe6d58--
--001a11447dc881e40f0537fe6d5a
Content-Disposition: inline;
filename="test document.pdf"
Content-Type: application/pdf;
x-mac-hide-extension=yes;
x-unix-mode=0644;
name="test document.pdf"
Content-Transfer-Encoding: base64
JVBERi0xLjMKJcTl8uXrp/Og0MTGCjMgMCBvYmoKPDwgL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xl
bmd0aCAyMDkgPj4Kc3RyZWFtCngBXY/NasNADITvfoo5JofKK3vXK0HIIU6gLQRaWOih9FBchwTi
FMfJ+1fOD6VFB2lgRvrU4xU9nFXQQIVAPJMoji3ecEBeD4xmAF9qaMx3M3QWqO5iP4rswRE7VQke
ezP+kVtskL9gNkO+rp+Wtm4+x2JZX86HkrwoK0JFlRZawItQ6TgilkzRRc3+AY3EDgbU26px5N9w
jIHEi4F3WCTwzXBtqcvylMZ/0gbvmDy2xylYMGmxG/CJr+/m3LWHE03xgfSMVTLE1dpAfwDXhkJi
CmVuZHN0cmVhbQplbmRvYmoKMSAwIG9iago8PCAvVHlwZSAvUGFnZSAvUGFyZW50IDIgMCBSIC9S
ZXNvdXJjZXMgNCAwIFIgL0NvbnRlbnRzIDMgMCBSIC9NZWRpYUJveCBbMCAwIDU5NS4yOCA4NDEu
ODldCj4+CmVuZG9iago0IDAgb2JqCjw8IC9Qcm9jU2V0IFsgL1BERiAvVGV4dCBdIC9Db2xvclNw
YWNlIDw8IC9DczEgNSAwIFIgPj4gL0ZvbnQgPDwgL1RUMSA2IDAgUgo+PiA+PgplbmRvYmoKOCAw
IG9iago8PCAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvTGVuZ3RoIDI2MTIgL0ZpbHRlciAv
RmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBnZZ3VFPZFofPvTe90BIiICX0GnoJINI7SBUEUYlJgFAC
hoQmdkQFRhQRKVZkVMABR4ciY0UUC4OCYtcJ8hBQxsFRREXl3YxrCe+tNfPemv3HWd/Z57fX2Wfv
fde6AFD8ggTCdFgBgDShWBTu68FcEhPLxPcCGBABDlgBwOFmZgRH+EQC1Py9PZmZqEjGs/buLoBk
u9ssv1Amc9b/f5EiN0MkBgAKRdU2PH4mF+UClFOzxRky/wTK9JUpMoYxMhahCaKsIuPEr2z2p+Yr
u8mYlybkoRpZzhm8NJ6Mu1DemiXho4wEoVyYJeBno3wHZb1USZoA5fco09P4nEwAMBSZX8znJqFs
iTJFFBnuifICAAiUxDm8cg6L+TlongB4pmfkigSJSWKmEdeYaeXoyGb68bNT+WIxK5TDTeGIeEzP
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
8qLyt7tX7L5WYVtxYA9pj2SPtDKosr1Kr2pH1afqpOqBGo+a5r3qe7ftndrH29e/321/0wGNA8UH
Ph4UHLx/yPdQa61BbcVh3OGsw8/rouq6v2d/X39E7Ujxkc9HhUelx8KPddU71Nc3qDeUNsKNksax
43HHb/3g9UN7E6vpUDOjufgEOCE58eLH+B/vngw82XmKfarpJ/2f9rbQWopaodbc1om2pDZpe0x7
3+mA050dzh0tP5v/fPSM9pmas8pnS8+RzhWcmzmfd37yQsaF8YuJF4c6V3Q+urTk0p2usK7ey4GX
r17xuXKp2737/FWXq2euOV07fZ19ve2G/Y3WHruell/sfmnpte9tvelws/2W462OvgV95/pd+y/e
9rp95Y7/nRsDiwb67i6+e/9e3D3pfd790QepD14/zHo4/Wj9Y+zjoicKTyqeqj+t/dX412apvfTs
oNdgz7OIZ4+GuEMv/5X5r0/DBc+pzytGtEbqR61Hz4z5jN16sfTF8MuMl9Pjhb8p/rb3ldGrn353
+71nYsnE8GvR65k/St6ovjn61vZt52To5NN3ae+mp4req74/9oH9oftj9MeR6exP+E+Vn40/d3wJ
/PJ4Jm1m5t/3hPP7CmVuZHN0cmVhbQplbmRvYmoKNSAwIG9iagpbIC9JQ0NCYXNlZCA4IDAgUiBd
CmVuZG9iagoxMCAwIG9iago8PCAvVHlwZSAvU3RydWN0VHJlZVJvb3QgL0sgOSAwIFIgPj4KZW5k
b2JqCjkgMCBvYmoKPDwgL1R5cGUgL1N0cnVjdEVsZW0gL1MgL0RvY3VtZW50IC9QIDEwIDAgUiAv
SyBbIDExIDAgUiBdICA+PgplbmRvYmoKMTEgMCBvYmoKPDwgL1R5cGUgL1N0cnVjdEVsZW0gL1Mg
L1AgL1AgOSAwIFIgL1BnIDEgMCBSIC9LIDEgID4+CmVuZG9iagoyIDAgb2JqCjw8IC9UeXBlIC9Q
YWdlcyAvTWVkaWFCb3ggWzAgMCA1OTUuMjggODQxLjg5XSAvQ291bnQgMSAvS2lkcyBbIDEgMCBS
IF0gPj4KZW5kb2JqCjEyIDAgb2JqCjw8IC9UeXBlIC9DYXRhbG9nIC9QYWdlcyAyIDAgUiAvTWFy
a0luZm8gPDwgL01hcmtlZCB0cnVlID4+IC9TdHJ1Y3RUcmVlUm9vdAoxMCAwIFIgPj4KZW5kb2Jq
CjcgMCBvYmoKWyAxIDAgUiAgL1hZWiAwIDg0MS44OSAwIF0KZW5kb2JqCjYgMCBvYmoKPDwgL1R5
cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNlRm9udCAvQUFBQUFCK0hlbHZldGljYU5l
dWUgL0ZvbnREZXNjcmlwdG9yCjEzIDAgUiAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmcgL0Zp
cnN0Q2hhciAzMiAvTGFzdENoYXIgMTE3IC9XaWR0aHMgWyAyNzgKMCAwIDAgMCAwIDAgMCAwIDAg
MCAwIDAgMCAyNzggMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAow
IDAgMCA3MjIgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
NTM3IDAgNTM3IDU5MyA1MzcKMCAwIDAgMjIyIDAgMCAwIDg1MyA1NTYgNTc0IDAgMCAzMzMgNTAw
IDMxNSA1NTYgXSA+PgplbmRvYmoKMTMgMCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9G
b250TmFtZSAvQUFBQUFCK0hlbHZldGljYU5ldWUgL0ZsYWdzIDMyIC9Gb250QkJveApbLTk1MSAt
NDgxIDE5ODcgMTA3N10gL0l0YWxpY0FuZ2xlIDAgL0FzY2VudCA5NTIgL0Rlc2NlbnQgLTIxMyAv
Q2FwSGVpZ2h0CjcxNCAvU3RlbVYgOTUgL0xlYWRpbmcgMjggL1hIZWlnaHQgNTE3IC9TdGVtSCA4
MCAvQXZnV2lkdGggNDQ3IC9NYXhXaWR0aCAyMjI1Ci9Gb250RmlsZTIgMTQgMCBSID4+CmVuZG9i
agoxNCAwIG9iago8PCAvTGVuZ3RoMSA1MTE2IC9MZW5ndGggMjkyNCAvRmlsdGVyIC9GbGF0ZURl
Y29kZSA+PgpzdHJlYW0KeAGtWFtsG8cVvbN8inrw/ZBIibtcvkmRImlSb4qyRVmyYteOzYS0IyuS
rFgu4tpIVNdB0cBAG6PRR5OfBHBSpEULpCn6APPj0MxHjKZI2jQFjKIPIBCCfrRFUfijKJJ8JLHc
M7sUIydpYBRZ++zcmZ2dPXPunTsjbjzy9TXqokukodLq2eXzpFz6KIpfr17YENU6ewml56Hzp8+2
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
2QB+6flPR9P82puYW3v4wtrGmdXlQ2v41Y/+C0639PUKZW5kc3RyZWFtCmVuZG9iagoxNSAwIG9i
ago8PCAvVGl0bGUgKHRlc3QgZG9jdW1lbnQpIC9Qcm9kdWNlciAobWFjT1MgVmVyc2lvbiAxMy42
IFwoQnVpbGQgMjJHMTIwXCkgUXVhcnR6IFBERkNvbnRleHQpCi9DcmVhdG9yIChQYWdlcykgL0Ny
ZWF0aW9uRGF0ZSAoRDoyMDIzMTExNTA2MzczMlowMCcwMCcpIC9Nb2REYXRlIChEOjIwMjMxMTE1
MDYzNzMyWjAwJzAwJykKPj4KZW5kb2JqCnhyZWYKMCAxNgowMDAwMDAwMDAwIDY1NTM1IGYgCjAw
MDAwMDAzMDMgMDAwMDAgbiAKMDAwMDAwMzQ1OCAwMDAwMCBuIAowMDAwMDAwMDIyIDAwMDAwIG4g
CjAwMDAwMDA0MTMgMDAwMDAgbiAKMDAwMDAwMzIyMiAwMDAwMCBuIAowMDAwMDAzNjkxIDAwMDAw
IG4gCjAwMDAwMDM2NDkgMDAwMDAgbiAKMDAwMDAwMDUxMCAwMDAwMCBuIAowMDAwMDAzMzEwIDAw
MDAwIG4gCjAwMDAwMDMyNTcgMDAwMDAgbiAKMDAwMDAwMzM4NyAwMDAwMCBuIAowMDAwMDAzNTQ3
IDAwMDAwIG4gCjAwMDAwMDQwNjggMDAwMDAgbiAKMDAwMDAwNDMzNCAwMDAwMCBuIAowMDAwMDA3
MzQ2IDAwMDAwIG4gCnRyYWlsZXIKPDwgL1NpemUgMTYgL1Jvb3QgMTIgMCBSIC9JbmZvIDE1IDAg
UiAvSUQgWyA8NjVjMDk0MTMwOWM0NmQ0Yzc3N2U5MDVjMTlmNTA1YzA+Cjw2NWMwOTQxMzA5YzQ2
ZDRjNzc3ZTkwNWMxOWY1MDVjMD4gXSA+PgpzdGFydHhyZWYKNzU0OQolJUVPRgo=
--001a11447dc881e40f0537fe6d5a--
<?php
declare(strict_types=1);
namespace App\Iterator;
use Laminas\Mime\Part;
class PartsFilterIterator extends \RecursiveFilterIterator
{
public function accept(): bool
{
/** @var Part $part */
$part = parent::current();
return $this->hasChildren() ||
(str_starts_with($part->getType(), "text/plain")
|| str_starts_with($part->getType(), "text/html"))
;
}
public function hasChildren(): bool
{
return $this->getInnerIterator()->hasChildren();
}
public function getChildren(): PartsFilterIterator
{
return new self($this->getInnerIterator()->getChildren());
}
}
<?php
declare(strict_types=1);
namespace AppTest\Iterator;
use App\Iterator\PartsFilterIterator;
use App\Iterator\PartsIterator;
use Laminas\Mail\Message;
use Laminas\Mime\Part;
use PHPUnit\Framework\TestCase;
use RecursiveArrayIterator;
class PartsFilterIteratorTest extends TestCase
{
public function testIteratesSuccessfullyOverPartsData()
{
$email = file_get_contents(
__DIR__ . '/../../_files/mail_with_pdf_attachment.eml'
);
$message = Message::fromString($email);
/** @var Part[] $iterator */
$iterator = new \RecursiveIteratorIterator(
new PartsFilterIterator(
new PartsIterator(
$message->getBody()->getParts()
),
),
\RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $key => $value) {
echo $value->getType();
}
$this->assertCount(2, $iterator);
}
}
<?php
declare(strict_types=1);
namespace App\Iterator;
use Laminas\Mime\Part;
class PartsIterator extends \RecursiveArrayIterator
{
public function hasChildren(): bool
{
/** @var Part $part */
$part = $this->current();
return ! empty($part->getParts());
}
public function getChildren(): \RecursiveArrayIterator
{
/** @var Part $current */
$current = $this->current();
return new PartsIterator($current->getParts());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment