from email.feedparser import BytesFeedParser from email.generator import BytesGenerator from email.policy import SMTP from io import BytesIO # pypi: dkimpy from dkim import DKIM def test_header_folding(): # the email addresses contained here are real but unimportant and already known to spammers raw_email_with_valid_dkim = b'DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1532918961; bh=AwLeVe/FpXHJ9+VNy8QKwz2N5wuNF5ZkyXE3tLVBrFY=; h=Date:From:Reply-To:To:Subject:References:From:Subject; b=rSWZ7vyWIZqflUJS9ysVQvDxeoMxepEqPr/EoVkqpilCP1ryvci6/jCsFe75M2Jr5NJjzg6yJ6Xew8rpq8SMnZeNhTMmCK8jy\r\n WwSamcZ14t0LUZEt30+9Ump0KbPq+WRQK2rM9NnBVhE6pyvANfgsKMqgXlYzAmHk7P8cZ7ztJMSrtOeOr3u5RRNwvYJ+OYHZSFHiQZrPopNDKovVBcAc+6yVBI3YsI1qsgDmoQ/F5NszOLsBit2IkcvWr7ztp+smzZcy4Wxnw3tGK8mw1nEN5VX9KHFzMJ6TztQjdQ6SM4ghUD1efNPGA3UH1zBtIAQFIxnGAVgqz4LbVoTrUhmJQ==\r\nX-YMail-OSG: iccSLAoVM1kFWbJZRfEd_g2QJh1aSOMoZlPQC87SZw6.2KxCLA0ELmotYKur4pr\r\n FNY_Xgo3iXgNOlEk5sxmBFo1cWPmnmKiQ927zDQ8ub1CbWjKVfS8pxfrhSQT6NKVJjVjyVmDHul9\r\n dG3nEBd5TF2q.sf8Cra1cFk4E.d33xlEGp9eG.7_AF.vAXN8vMM0ntXywn9waOLXIXU_Wx_m26pv\r\n itKFfyOOuVpU4yBfOVpqsNxhKhkcUtY78jjxR85igq6BqtudzJSpBT4.2KW0EctKrsclBX7NMwsZ\r\n MdPNGCLFxe1yE9Hr83qgajkKW3k0FQxOTuoRg5JT38fr6YUxqRzszUGAzfXEn8lODtSMI4thjuhp\r\n m2TNCPY3JdLYcPY.dW5YLXxwdJaKxBehY8d3wm3wLL_z9NNOf4OoPTfg2FyxPTFW307u5Rssz1iU\r\n UuzF3QaoiTdcrBeMW.X64_lwIJRT1.DumJo8yIQyFktJnGWb8iwrGP1IZIT5Rmyo8YZa7ysJHclQ\r\n k.D8GEqZKGmKbGHT5rUiNj2GgKrxFc8VmU6vXfj3yVxL_y8wq8KBvsTqX0yW_AguG7V3OhnOS_l8\r\n 0EIh5hawtkVjtB_TF9BqRY2mdzB0mxSgNHt1uHuVWcRCQTlhW707P3YUVDKg95FdYIpOECXwmUPi\r\n m_SN0tqe2qEkf2W_rKoT2XN_VXOkp7_JD40syZi0THj0IegtuhHhB4CwR.KmjAygq0q8QKpMvD9g\r\n aYnlnCq5bsNbUvatuAxrGNCdeCg.EIemBt529_PPJfxm62w.9YTjhuWYHdfEdAIWaOzrrCpAonaF\r\n Xj7caYPmTvlVs8AQbvEx7vUXIRqm2TcyGB52EBzYah317j5KNnTMLAd2cAYVawkkqAblm6qY8biR\r\n k09Jy2kX6XG_._wOOBWc8jB6dwSh2F1CSFoy9OUC2XI9z5r3trvwTU97tl88q9QBZe6WIouiAtQe\r\n pZYGIMBcrOoJ84hJ4oSmThi4oGPu1\r\nReceived: from sonic.gate.mail.ne1.yahoo.com by sonic304.consmr.mail.ne1.yahoo.com with HTTP; Mon, 30 Jul 2018 02:49:21 +0000\r\nDate: Mon, 30 Jul 2018 02:49:16 +0000 (UTC)\r\nFrom: Bryce Drennan \r\nReply-To: Bryce Drennan \r\nTo: "whatever@cmd.bz" \r\nMessage-ID: <144462903.587576.1532918956365@mail.yahoo.com>\r\nSubject: test 5\r\nMIME-Version: 1.0\r\nContent-Type: multipart/alternative; \r\n\tboundary="----=_Part_587575_115310598.1532918956364"\r\nReferences: <144462903.587576.1532918956365.ref@mail.yahoo.com>\r\nX-Mailer: WebService/1.1.12144 YahooMailNeo Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36\r\nContent-Length: 537\r\n\r\n------=_Part_587575_115310598.1532918956364\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding: 7bit\r\n\r\ntest 5\r\n------=_Part_587575_115310598.1532918956364\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Transfer-Encoding: 7bit\r\n\r\n
test 5
\r\n------=_Part_587575_115310598.1532918956364--' d = DKIM(raw_email_with_valid_dkim) assert d.verify() # parse the email fp = BytesFeedParser(policy=SMTP) fp.feed(raw_email_with_valid_dkim) msg = fp.close() # flatter the email outfp = BytesIO() BytesGenerator(outfp, policy=SMTP).flatten(msg, False) raw_msg = outfp.getvalue() print(raw_msg) # dkim-signature no longer valid in python 3.6.4+ d = DKIM(raw_msg) assert d.verify()