{"action":"opened","issue":{"url":"https://api.github.com/repos/cyrusimap/cyrus-imapd/issues/2402","repository_url":"https://api.github.com/repos/cyrusimap/cyrus-imapd","labels_url":"https://api.github.com/repos/cyrusimap/cyrus-imapd/issues/2402/labels{/name}","comments_url":"https://api.github.com/repos/cyrusimap/cyrus-imapd/issues/2402/comments","events_url":"https://api.github.com/repos/cyrusimap/cyrus-imapd/issues/2402/events","html_url":"https://github.com/cyrusimap/cyrus-imapd/issues/2402","id":334657011,"node_id":"MDU6SXNzdWUzMzQ2NTcwMTE=","number":2402,"title":"Email/import with complex message - non text/* parts have no partId?","user":{"login":"wolfsage","id":643871,"node_id":"MDQ6VXNlcjY0Mzg3MQ==","avatar_url":"https://avatars0.githubusercontent.com/u/643871?v=4","gravatar_id":"","url":"https://api.github.com/users/wolfsage","html_url":"https://github.com/wolfsage","followers_url":"https://api.github.com/users/wolfsage/followers","following_url":"https://api.github.com/users/wolfsage/following{/other_user}","gists_url":"https://api.github.com/users/wolfsage/gists{/gist_id}","starred_url":"https://api.github.com/users/wolfsage/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wolfsage/subscriptions","organizations_url":"https://api.github.com/users/wolfsage/orgs","repos_url":"https://api.github.com/users/wolfsage/repos","events_url":"https://api.github.com/users/wolfsage/events{/privacy}","received_events_url":"https://api.github.com/users/wolfsage/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2018-06-21T21:04:16Z","updated_at":"2018-06-21T21:04:16Z","closed_at":null,"author_association":"NONE","body":"_TLDR: Any non text/* part does not have a partId but the spec seems to indicate it should._\r\n\r\nAt the top of this branch is a new test:\r\n\r\n  https://github.com/wolfsage/JMAP-TestSuite/tree/broken-partid-for-images\r\n\r\nWith the following email being imported (meant to mirror the example given in the block just above here: https://github.com/jmapio/jmap/blob/master/spec/mail/message.mdown#emailget )\r\n\r\n(Note that this is *hand written* so perhaps there's bugs in it??)\r\n\r\n````\r\nDate: Thu, 21 Jun 2018 11:00:06 -0400\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\nContent-Type: multipart/mixed; boundary=\"TOP\"\r\n\r\n--TOP\r\nDate: Thu, 21 Jun 2018 11:00:06 -0400\r\nMIME-Version: 1.0\r\nContent-Type: text/plain\r\nContent-Transfer-Encoding: 7bit\r\n\r\nThis is text part A\r\n\r\n--TOP\r\nDate: Thu, 21 Jun 2018 11:00:06 -0400\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"MIXED1\"\r\nContent-Transfer-Encoding: 7bit\r\n\r\n--MIXED1\r\nDate: Thu, 21 Jun 2018 11:00:06 -0400\r\nMIME-Version: 1.0\r\nContent-Type: multipart/alternative; boundary=\"ALTERNATIVE1\";\r\nContent-Transfer-Encoding: 7bit\r\n\r\n--ALTERNATIVE1\r\nDate: Thu, 21 Jun 2018 11:00:06 -0400\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"MIXED2\";\r\nContent-Transfer-Encoding: 7bit\r\n\r\n--MIXED2\r\nDate: Thu, 21 Jun 2018 11:00:06 -0400\r\nMIME-Version: 1.0\r\nContent-Type: text/plain\r\nContent-Disposition: inline\r\nContent-Transfer-Encoding: 7bit\r\n\r\nThis is text part B\r\n\r\n--MIXED2\r\nDate: Thu, 21 Jun 2018 12:00:19 -0400\r\nMIME-Version: 1.0\r\nContent-Type: image/jpeg; name=\"c.jpg\"\r\nContent-Disposition: inline\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\n=FF=D8=FF=E0=00=10JFIF=00=01=01=01=00H=00H=00=00=FF=FE=00=13Created with GI=\r\nMP=FF=DB=00C=00=03=02=02=03=02=02=03=03=03=03=04=03=03=04=05=08=05=05=04=04=\r\n=05\r\n=07=07=06=08=0C\r\n=0C=0C=0B\r\n=0B=0B=0D=0E=12=10=0D=0E=11=0E=0B=0B=10=16=10=11=13=14=15=15=15=0C=0F=17=18=\r\n=16=14=18=12=14=15=14=FF=DB=00C=01=03=04=04=05=04=05\t=05=05\t=14=0D=0B=0D=14=\r\n=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=\r\n=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=FF=\r\n=C2=00=11=08=00\r\n=00\r\n=03=01=11=00=02=11=01=03=11=01=FF=C4=00=15=00=01=01=00=00=00=00=00=00=00=00=\r\n=00=00=00=00=00=00=02=07=FF=C4=00=14=01=01=00=00=00=00=00=00=00=00=00=00=00=\r\n=00=00=00=00=00=FF=DA=00=0C=03=01=00=02=10=03=10=00=00=01=AF=94=A0=0C=FF=C4=\r\n=00=18=10=01=01=00=03=00=00=00=00=00=00=00=00=00=00=00=00=02=05=00=03=10=FF=\r\n=DA=00=08=01=01=00=01=05=02=A3U=EB=B5=88=17=CF=FF=C4=00=14=11=01=00=00=00=\r\n=00=00=00=00=00=00=00=00=00=00=00=00 =FF=DA=00=08=01=03=01=01?=01=1F=FF=C4=\r\n=00=14=11=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00 =FF=DA=00=08=01=\r\n=02=01=01?=01=1F=FF=C4=00=1F=10=00=02=01=04=02=03=00=00=00=00=00=00=00=00=\r\n=00=00=01=03=02=05=10=11!=121#q=A1=FF=DA=00=08=01=01=00=06?=02z=1FXM=1Dj=8C=\r\n$=98=B0C=CD=9E=C9=E5=DE=F5=81=8F=B6=D8=07=DD=BF=FF=C4=00=18=10=01=01=01=01=\r\n=01=00=00=00=00=00=00=00=00=00=00=00=01=11!=00=10=FF=DA=00=08=01=01=00=01?!=\r\n=98=C0=8C!=A3`=0D(=95q:=06n=91g=9F=FF=DA=00=0C=03=01=00=02=00=03=00=00=00=\r\n=10=12O=FF=C4=00=14=11=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00 =FF=\r\n=DA=00=08=01=03=01=01?=10=1F=FF=C4=00=14=11=01=00=00=00=00=00=00=00=00=00=\r\n=00=00=00=00=00=00 =FF=DA=00=08=01=02=01=01?=10=1F=FF=C4=00=19=10=00=03=01=\r\n=01=01=00=00=00=00=00=00=00=00=00=00=00=01=11!=101Q=FF=DA=00=08=01=01=00=01=\r\n?=10=0F=90{=9E=EA=02=A2%=18=E8w=05=9E=87=9F=FF=D9=\r\n\r\n--MIXED2\r\nDate: Thu, 21 Jun 2018 11:00:06 -0400\r\nMIME-Version: 1.0\r\nContent-Type: text/plain\r\nContent-Disposition: inline\r\nContent-Transfer-Encoding: 7bit\r\n\r\nThis is text part D\r\n\r\n--MIXED2--\r\n\r\n--ALTERNATIVE1\r\nDate: Thu, 21 Jun 2018 11:00:06 -0400\r\nMIME-Version: 1.0\r\nContent-Type: multipart/related; boundary=\"RELATED1\";\r\nContent-Transfer-Encoding: 7bit\r\n\r\n--RELATED1\r\nDate: Thu, 21 Jun 2018 11:00:06 -0400\r\nMIME-Version: 1.0\r\nContent-Type: text/html\r\nContent-Transfer-Encoding: 7bit\r\n\r\n<html><body> This is html part E </body></html>\r\n\r\n--RELATED1\r\nDate: Thu, 21 Jun 2018 12:00:19 -0400\r\nMIME-Version: 1.0\r\nContent-Type: image/jpeg; name=\"f.jpg\"\r\nContent-Transfer-Encoding: quoted-printable\r\nContent-Disposition: inline\r\n\r\n=FF=D8=FF=E0=00=10JFIF=00=01=01=01=00H=00H=00=00=FF=FE=00=13Created with GI=\r\nMP=FF=DB=00C=00=03=02=02=03=02=02=03=03=03=03=04=03=03=04=05=08=05=05=04=04=\r\n=05\r\n=07=07=06=08=0C\r\n=0C=0C=0B\r\n=0B=0B=0D=0E=12=10=0D=0E=11=0E=0B=0B=10=16=10=11=13=14=15=15=15=0C=0F=17=18=\r\n=16=14=18=12=14=15=14=FF=DB=00C=01=03=04=04=05=04=05\t=05=05\t=14=0D=0B=0D=14=\r\n=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=\r\n=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=FF=\r\n=C2=00=11=08=00\r\n=00\r\n=03=01=11=00=02=11=01=03=11=01=FF=C4=00=16=00=01=01=01=00=00=00=00=00=00=00=\r\n=00=00=00=00=00=00=00=06=07=FF=C4=00=14=01=01=00=00=00=00=00=00=00=00=00=00=\r\n=00=00=00=00=00=00=FF=DA=00=0C=03=01=00=02=10=03=10=00=00=01=DCK=80=0F=FF=\r\n=C4=00=18=10=00=02=03=00=00=00=00=00=00=00=00=00=00=00=00=00=01=03=04=06=10=\r\n=FF=DA=00=08=01=01=00=01=05=02-=9A=EBv=FF=00=FF=C4=00=14=11=01=00=00=00=00=\r\n=00=00=00=00=00=00=00=00=00=00=00 =FF=DA=00=08=01=03=01=01?=01=1F=FF=C4=00=\r\n=14=11=01=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00 =FF=DA=00=08=01=02=\r\n=01=01?=01=1F=FF=C4=00=1C=10=00=02=02=02=03=00=00=00=00=00=00=00=00=00=00=\r\n=00=01=02=03=11=04 1QR=FF=DA=00=08=01=01=00=06?=020=89=99pa=C7I=0C`=A8=B6%=\r\n=C7=9B<v+O=FF=C4=00=18=10=01=01=00=03=00=00=00=00=00=00=00=00=00=00=00=00=\r\n=011=11 !=FF=DA=00=08=01=01=00=01?!=BA=E4=A6P(y=92\\=E9=FF=DA=00=0C=03=01=00=\r\n=02=00=03=00=00=00=10=12O=FF=C4=00=14=11=01=00=00=00=00=00=00=00=00=00=00=\r\n=00=00=00=00=00 =FF=DA=00=08=01=03=01=01?=10=1F=FF=C4=00=14=11=01=00=00=00=\r\n=00=00=00=00=00=00=00=00=00=00=00=00 =FF=DA=00=08=01=02=01=01?=10=1F=FF=C4=\r\n=00=17=10=01=01=01=01=00=00=00=00=00=00=00=00=00=00=00=00=01=11=10Q=FF=DA=\r\n=00=08=01=01=00=01?=10\r\n=A2=ADJy=B2=B4)i=BF=FF=D9=\r\n\r\n--RELATED1--\r\n\r\n--ALTERNATIVE1--\r\n\r\n--MIXED1\r\nDate: Thu, 21 Jun 2018 12:00:19 -0400\r\nMIME-Version: 1.0\r\nContent-Type: image/jpeg; name=\"g.jpg\"\r\nContent-Disposition: attachment; filename=\"g.jpg\"\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\n=FF=D8=FF=E0=00=10JFIF=00=01=01=01=00H=00H=00=00=FF=FE=00=13Created with GI=\r\nMP=FF=DB=00C=00=03=02=02=03=02=02=03=03=03=03=04=03=03=04=05=08=05=05=04=04=\r\n=05\r\n=07=07=06=08=0C\r\n=0C=0C=0B\r\n=0B=0B=0D=0E=12=10=0D=0E=11=0E=0B=0B=10=16=10=11=13=14=15=15=15=0C=0F=17=18=\r\n=16=14=18=12=14=15=14=FF=DB=00C=01=03=04=04=05=04=05\t=05=05\t=14=0D=0B=0D=14=\r\n=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=\r\n=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=14=FF=\r\n=C2=00=11=08=00\r\n=00\r\n=03=01=11=00=02=11=01=03=11=01=FF=C4=00=15=00=01=01=00=00=00=00=00=00=00=00=\r\n=00=00=00=00=00=00=00=07=FF=C4=00=14=01=01=00=00=00=00=00=00=00=00=00=00=00=\r\n=00=00=00=00=00=FF=DA=00=0C=03=01=00=02=10=03=10=00=00=01=A3=160=0F=FF=C4=\r\n=00=17=10=01=00=03=00=00=00=00=00=00=00=00=00=00=00=00=00=04=05=10=15=FF=DA=\r\n=00=08=01=01=00=01=05=02T=EA=B5o=FF=C4=00=14=11=01=00=00=00=00=00=00=00=00=\r\n=00=00=00=00=00=00=00 =FF=DA=00=08=01=03=01=01?=01=1F=FF=C4=00=14=11=01=00=\r\n=00=00=00=00=00=00=00=00=00=00=00=00=00=00 =FF=DA=00=08=01=02=01=01?=01=1F=\r\n=FF=C4=00=1D=10=00=02=01=04=03=00=00=00=00=00=00=00=00=00=00=00=01=03=02=04=\r\n=13!\"=14 Q=FF=DA=00=08=01=01=00=06?=02b=F9nC=85U=95=D1=A9p=96=98=DE@=ECA=F6=\r\n'=1D?=FF=C4=00=18=10=01=01=00=03=00=00=00=00=00=00=00=00=00=00=00=00=01=11=\r\n=10!q=FF=DA=00=08=01=01=00=01?!CMK=FB=C1=E5=D5A=1CW?=FF=DA=00=0C=03=01=00=\r\n=02=00=03=00=00=00=10=92O=FF=C4=00=14=11=01=00=00=00=00=00=00=00=00=00=00=\r\n=00=00=00=00=00 =FF=DA=00=08=01=03=01=01?=10=1F=FF=C4=00=14=11=01=00=00=00=\r\n=00=00=00=00=00=00=00=00=00=00=00=00 =FF=DA=00=08=01=02=01=01?=10=1F=FF=C4=\r\n=00=17=10=01=01=01=01=00=00=00=00=00=00=00=00=00=00=00=00=01=11 A=FF=DA=00=\r\n=08=01=01=00=01?=10=9D\t=B7C\"0\"=9D=C4=7F=FF=D9=\r\n\r\n--MIXED1\r\nDate: Thu, 21 Jun 2018 11:00:06 -0400\r\nMIME-Version: 1.0\r\nContent-Type: application/x-excel\r\nContent-Transfer-Encoding: 7bit\r\n\r\nXXX Excelt H\r\n\r\n--MIXED1\r\nDate: Thu, 21 Jun 2018 11:00:06 -0400\r\nMIME-Version: 1.0\r\nContent-Type: message/rfc822\r\nContent-Transfer-Encoding: 7bit\r\n\r\nDate: Thu, 21 Jun 2018 11:00:06 -0400\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\nContent-Type: text/plain\r\n\r\nRFC822 message\r\n\r\n--MIXED1--\r\n\r\n--TOP\r\nDate: Thu, 21 Jun 2018 11:00:06 -0400\r\nMIME-Version: 1.0\r\nContent-Type: text/plain\r\nContent-Disposition: inline\r\nContent-Transfer-Encoding: 7bit\r\n\r\nThis is text part K\r\n\r\n--TOP--\r\n````\r\n\r\nThe import seems to go fine. Then when I request it back:\r\n\r\n````\r\n  my $res = $tester->request({\r\n    using => [ \"ietf:jmapmail\" ],\r\n    methodCalls => [[\r\n      \"Email/get\" => {\r\n        ids        => [ $message->id ],\r\n        properties => [ 'textBody', 'bodyValues', 'bodyStructure' ],\r\n        fetchAllBodyValues => jtrue(),\r\n      },\r\n    ]],\r\n  });\r\n\r\n  diag explain $res->as_stripped_triples;\r\n````\r\n\r\nI get this response:\r\n\r\n````\r\n        # [\r\n        #   [\r\n        #     'Email/get',\r\n        #     {\r\n        #       'accountId' => 'jt-588ba5d6-7595-11e8-9c0f-a005ea1562dd',\r\n        #       'list' => [\r\n        #         {\r\n        #           'bodyStructure' => {\r\n        #             'blobId' => undef,\r\n        #             'charset' => undef,\r\n        #             'cid' => undef,\r\n        #             'disposition' => undef,\r\n        #             'language' => [],\r\n        #             'location' => undef,\r\n        #             'name' => undef,\r\n        #             'partId' => undef,\r\n        #             'size' => 0,\r\n        #             'subParts' => [\r\n        #               {\r\n        #                 'blobId' => 'Gca635541ee9a6f9498dd7623cb78bd668f3dd417',\r\n        #                 'charset' => 'us-ascii',\r\n        #                 'cid' => undef,\r\n        #                 'disposition' => undef,\r\n        #                 'language' => [],\r\n        #                 'location' => undef,\r\n        #                 'name' => undef,\r\n        #                 'partId' => '1',\r\n        #                 'size' => 21,\r\n        #                 'type' => 'text/plain'\r\n        #               },\r\n        #               {\r\n        #                 'blobId' => undef,\r\n        #                 'charset' => undef,\r\n        #                 'cid' => undef,\r\n        #                 'disposition' => undef,\r\n        #                 'language' => [],\r\n        #                 'location' => undef,\r\n        #                 'name' => undef,\r\n        #                 'partId' => undef,\r\n        #                 'size' => 0,\r\n        #                 'subParts' => [\r\n        #                   {\r\n        #                     'blobId' => undef,\r\n        #                     'charset' => undef,\r\n        #                     'cid' => undef,\r\n        #                     'disposition' => undef,\r\n        #                     'language' => [],\r\n        #                     'location' => undef,\r\n        #                     'name' => undef,\r\n        #                     'partId' => undef,\r\n        #                     'size' => 0,\r\n        #                     'subParts' => [\r\n        #                       {\r\n        #                         'blobId' => undef,\r\n        #                         'charset' => undef,\r\n        #                         'cid' => undef,\r\n        #                         'disposition' => undef,\r\n        #                         'language' => [],\r\n        #                         'location' => undef,\r\n        #                         'name' => undef,\r\n        #                         'partId' => undef,\r\n        #                         'size' => 0,\r\n        #                         'subParts' => [\r\n        #                           {\r\n        #                             'blobId' => 'Gaf0399b679105a7b96f9a897b2c974b884d27afb',\r\n        #                             'charset' => 'us-ascii',\r\n        #                             'cid' => undef,\r\n        #                             'disposition' => 'inline',\r\n        #                             'language' => [],\r\n        #                             'location' => undef,\r\n        #                             'name' => undef,\r\n        #                             'partId' => '2.1.1.1',\r\n        #                             'size' => 21,\r\n        #                             'type' => 'text/plain'\r\n        #                           },\r\n        #                           {\r\n        #                             'blobId' => 'G1e36887f7fc9f4f030d1a574ba3c26f35bd134b1',\r\n        #                             'charset' => undef,\r\n        #                             'cid' => undef,\r\n        #                             'disposition' => 'inline',\r\n        #                             'language' => [],\r\n        #                             'location' => undef,\r\n        #                             'name' => 'c.jpg',\r\n        #                             'partId' => undef,\r\n        #                             'size' => 630,\r\n        #                             'type' => 'image/jpeg'\r\n        #                           },\r\n        #                           {\r\n        #                             'blobId' => 'Gdf3a02968c945bf674d180d76cbd39bc2a4a2b30',\r\n        #                             'charset' => 'us-ascii',\r\n        #                             'cid' => undef,\r\n        #                             'disposition' => 'inline',\r\n        #                             'language' => [],\r\n        #                             'location' => undef,\r\n        #                             'name' => undef,\r\n        #                             'partId' => '2.1.1.3',\r\n        #                             'size' => 21,\r\n        #                             'type' => 'text/plain'\r\n        #                           }\r\n        #                         ],\r\n        #                         'type' => 'multipart/mixed'\r\n        #                       },\r\n        #                       {\r\n        #                         'blobId' => undef,\r\n        #                         'charset' => undef,\r\n        #                         'cid' => undef,\r\n        #                         'disposition' => undef,\r\n        #                         'language' => [],\r\n        #                         'location' => undef,\r\n        #                         'name' => undef,\r\n        #                         'partId' => undef,\r\n        #                         'size' => 0,\r\n        #                         'subParts' => [\r\n        #                           {\r\n        #                             'blobId' => 'G45a24429dda6219724bde535c084d7009bd41506',\r\n        #                             'charset' => 'us-ascii',\r\n        #                             'cid' => undef,\r\n        #                             'disposition' => undef,\r\n        #                             'language' => [],\r\n        #                             'location' => undef,\r\n        #                             'name' => undef,\r\n        #                             'partId' => '2.1.2.1',\r\n        #                             'size' => 49,\r\n        #                             'type' => 'text/html'\r\n        #                           },\r\n        #                           {\r\n        #                             'blobId' => 'Gcbd0599bce687ef5c5d8945140bcba2e377b1ada',\r\n        #                             'charset' => undef,\r\n        #                             'cid' => undef,\r\n        #                             'disposition' => 'inline',\r\n        #                             'language' => [],\r\n        #                             'location' => undef,\r\n        #                             'name' => 'f.jpg',\r\n        #                             'partId' => undef,\r\n        #                             'size' => 608,\r\n        #                             'type' => 'image/jpeg'\r\n        #                           }\r\n        #                         ],\r\n        #                         'type' => 'multipart/related'\r\n        #                       }\r\n        #                     ],\r\n        #                     'type' => 'multipart/alternative'\r\n        #                   },\r\n        #                   {\r\n        #                     'blobId' => 'G3540041de8931997a2562291f681bf122cf56425',\r\n        #                     'charset' => undef,\r\n        #                     'cid' => undef,\r\n        #                     'disposition' => 'attachment',\r\n        #                     'language' => [],\r\n        #                     'location' => undef,\r\n        #                     'name' => 'g.jpg',\r\n        #                     'partId' => undef,\r\n        #                     'size' => 608,\r\n        #                     'type' => 'image/jpeg'\r\n        #                   },\r\n        #                   {\r\n        #                     'blobId' => 'G246b0ade30ee6247517b5ea27c79609e49a6bba1',\r\n        #                     'charset' => undef,\r\n        #                     'cid' => undef,\r\n        #                     'disposition' => undef,\r\n        #                     'language' => [],\r\n        #                     'location' => undef,\r\n        #                     'name' => undef,\r\n        #                     'partId' => undef,\r\n        #                     'size' => 14,\r\n        #                     'type' => 'application/x-excel'\r\n        #                   },\r\n        #                   {\r\n        #                     'blobId' => 'Gbc10021debd0c0eb0ecc502c21f091819269d09f',\r\n        #                     'charset' => undef,\r\n        #                     'cid' => undef,\r\n        #                     'disposition' => undef,\r\n        #                     'language' => [],\r\n        #                     'location' => undef,\r\n        #                     'name' => undef,\r\n        #                     'partId' => undef,\r\n        #                     'size' => 135,\r\n        #                     'type' => 'message/rfc822'\r\n        #                   }\r\n        #                 ],\r\n        #                 'type' => 'multipart/mixed'\r\n        #               },\r\n        #               {\r\n        #                 'blobId' => 'Ga309fbbeef3984ef0b668ccbee5ba2457929e3d5',\r\n        #                 'charset' => 'us-ascii',\r\n        #                 'cid' => undef,\r\n        #                 'disposition' => 'inline',\r\n        #                 'language' => [],\r\n        #                 'location' => undef,\r\n        #                 'name' => undef,\r\n        #                 'partId' => '3',\r\n        #                 'size' => 21,\r\n        #                 'type' => 'text/plain'\r\n        #               }\r\n        #             ],\r\n        #             'type' => 'multipart/mixed'\r\n        #           },\r\n        #           'bodyValues' => {\r\n        #             '1' => {\r\n        #               'isEncodingProblem' => bless( do{\\(my $o = 0)}, 'JSON::PP::Boolean' ),\r\n        #               'isTruncated' => $VAR1->[0][1]{'list'}[0]{'bodyValues'}{'1'}{'isEncodingProblem'},\r\n        #               'value' => 'This is text part A\r\n        # '\r\n        #             },\r\n        #             '2.1.1.1' => {\r\n        #               'isEncodingProblem' => $VAR1->[0][1]{'list'}[0]{'bodyValues'}{'1'}{'isEncodingProblem'},\r\n        #               'isTruncated' => $VAR1->[0][1]{'list'}[0]{'bodyValues'}{'1'}{'isEncodingProblem'},\r\n        #               'value' => 'This is text part B\r\n        # '\r\n        #             },\r\n        #             '2.1.1.3' => {\r\n        #               'isEncodingProblem' => $VAR1->[0][1]{'list'}[0]{'bodyValues'}{'1'}{'isEncodingProblem'},\r\n        #               'isTruncated' => $VAR1->[0][1]{'list'}[0]{'bodyValues'}{'1'}{'isEncodingProblem'},\r\n        #               'value' => 'This is text part D\r\n        # '\r\n        #             },\r\n        #             '2.1.2.1' => {\r\n        #               'isEncodingProblem' => $VAR1->[0][1]{'list'}[0]{'bodyValues'}{'1'}{'isEncodingProblem'},\r\n        #               'isTruncated' => $VAR1->[0][1]{'list'}[0]{'bodyValues'}{'1'}{'isEncodingProblem'},\r\n        #               'value' => '<html><body> This is html part E </body></html>\r\n        # '\r\n        #             },\r\n        #             '3' => {\r\n        #               'isEncodingProblem' => $VAR1->[0][1]{'list'}[0]{'bodyValues'}{'1'}{'isEncodingProblem'},\r\n        #               'isTruncated' => $VAR1->[0][1]{'list'}[0]{'bodyValues'}{'1'}{'isEncodingProblem'},\r\n        #               'value' => 'This is text part K\r\n        # '\r\n        #             }\r\n        #           },\r\n        #           'id' => 'Mec1d3c4ed1ad4f508ef76582',\r\n        #           'textBody' => [\r\n        #             {\r\n        #               'blobId' => 'Gca635541ee9a6f9498dd7623cb78bd668f3dd417',\r\n        #               'charset' => 'us-ascii',\r\n        #               'cid' => undef,\r\n        #               'disposition' => undef,\r\n        #               'language' => [],\r\n        #               'location' => undef,\r\n        #               'name' => undef,\r\n        #               'partId' => '1',\r\n        #               'size' => 21,\r\n        #               'type' => 'text/plain'\r\n        #             },\r\n        #             {\r\n        #               'blobId' => 'Gaf0399b679105a7b96f9a897b2c974b884d27afb',\r\n        #               'charset' => 'us-ascii',\r\n        #               'cid' => undef,\r\n        #               'disposition' => 'inline',\r\n        #               'language' => [],\r\n        #               'location' => undef,\r\n        #               'name' => undef,\r\n        #               'partId' => '2.1.1.1',\r\n        #               'size' => 21,\r\n        #               'type' => 'text/plain'\r\n        #             },\r\n        #             {\r\n        #               'blobId' => 'G1e36887f7fc9f4f030d1a574ba3c26f35bd134b1',\r\n        #               'charset' => undef,\r\n        #               'cid' => undef,\r\n        #               'disposition' => 'inline',\r\n        #               'language' => [],\r\n        #               'location' => undef,\r\n        #               'name' => 'c.jpg',\r\n        #               'partId' => undef,\r\n        #               'size' => 630,\r\n        #               'type' => 'image/jpeg'\r\n        #             },\r\n        #             {\r\n        #               'blobId' => 'Gdf3a02968c945bf674d180d76cbd39bc2a4a2b30',\r\n        #               'charset' => 'us-ascii',\r\n        #               'cid' => undef,\r\n        #               'disposition' => 'inline',\r\n        #               'language' => [],\r\n        #               'location' => undef,\r\n        #               'name' => undef,\r\n        #               'partId' => '2.1.1.3',\r\n        #               'size' => 21,\r\n        #               'type' => 'text/plain'\r\n        #             },\r\n        #             {\r\n        #               'blobId' => 'Ga309fbbeef3984ef0b668ccbee5ba2457929e3d5',\r\n        #               'charset' => 'us-ascii',\r\n        #               'cid' => undef,\r\n        #               'disposition' => 'inline',\r\n        #               'language' => [],\r\n        #               'location' => undef,\r\n        #               'name' => undef,\r\n        #               'partId' => '3',\r\n        #               'size' => 21,\r\n        #               'type' => 'text/plain'\r\n        #             }\r\n        #           ]\r\n        #         }\r\n        #       ],\r\n        #       'notFound' => [],\r\n        #       'state' => '24'\r\n        #     },\r\n        #     'e'\r\n        #   ]\r\n        # ]\r\n````\r\n\r\nThe structure itself looks correct and the textBody only gives us the expected elements (from the example).\r\n\r\nHOWEVER.\r\n\r\nThe image/*, message/* and application/* parts have no partId. From reading the spec, I think they *should* (but maybe it's not useful at all?):\r\n\r\n````\r\npartId: String|null Identifies this part uniquely within the Email. This is scoped to the emailId and has no meaning outside of the JMAP Email object representation. This is null if, and only if, the part is of type multipart/*.\r\n````"}}
{"actor":{"display_login":"wolfsage"}}