О! Учитывая это, я вернулся и провёл повторное расследование… и оказалось, что проблема всё-таки на нашей стороне.
Из необработанного письма, которое вы опубликовали выше, я только что обнаружил, что IncomingEmail.raw на самом деле не хранит исходное письмо… мы сначала обрабатываем его через Email::Cleaner.
(извините, всё это время я думал, что можно ему доверять, раньше мы могли)
Похоже, что это вина Ruby mail gem… он переставляет части сообщения при повторной записи:
[1] pry(main)> m = File.open('test.eml').read;
[2] pry(main)> Mail.new(m).parts
=> [
#<Mail::Part:39680, Multipart: true, Headers: <Content-Type: multipart/signed; boundary="Sig_/gizYC_1dGsAzUHvksdaMIe2"; protocol="application/pgp-signature"; micalg=pgp-sha256>>,
#<Mail::Part:39700, Multipart: false, Headers: <MIME-Version: 1.0>, <Content-Type: text/plain; charset="us-ascii">, <Content-Transfer-Encoding: 7bit>, <Content-Disposition: inline>>
]
[3] pry(main)> Mail.new(Mail.new(m).to_s).parts
=> [
#<Mail::Part:39720, Multipart: false, Headers: <MIME-Version: 1.0>, <Content-Type: text/plain; charset=us-ascii>, <Content-Transfer-Encoding: 7bit>, <Content-Disposition: inline>, <Content-ID: <6966b4914df79_31d5b1d38126@mars.mail>>>,
#<Mail::Part:39740, Multipart: true, Headers: <Content-Type: multipart/signed; boundary="Sig_/gizYC_1dGsAzUHvksdaMIe2"; micalg=pgp-sha256; protocol="application/pgp-signature">, <Content-Transfer-Encoding: 7bit>>
]
что и вызывает проблему:
[38] pry(main)> puts Email::Receiver.new(m).select_body[0];
> Мы получили судебный приказ сохранить данные на системе и нам
> было запрещено сообщать владельцу системы, что было неловко, так как
> они уже сообщили владельцу системы...
Какие данные они запросили?
> С тех пор я всегда запускал свой выходной узел на отдельной системе на собственном
> IP-адресе, так что если бы был юридический запрос на передачу «системы», это
> касалось бы только этой системы. Я не юрист, но не думаю, что docker
> обеспечивает достаточную изоляцию для этого.
Могут ли они запретить вам отключить ретранслятор?
Если да, то вы можете запустить новую «систему» на другом IP.
[39] pry(main)> puts Email::Receiver.new(Mail.new(m).to_s).select_body[0];
«нет вывода»
Детали различий
test.eml: исходное сообщение, как было предоставлено
test-rubyparsed.eml: сообщение, распаршенное Ruby и снова преобразованное в строку
test-pythonparsed.eml: сообщение, распаршенное Python и снова преобразованное в строку
--- test.eml 2026-01-13 15:58:18.769489410 -0500
+++ test-rubyparsed.eml 2026-01-13 16:11:17.767312268 -0500
@@ -1,25 +1,46 @@
+Date: Tue, 13 Jan 2026 16:07:21 -0500
+From: Marco Moock via tor-relays <tor-relays@lists.torproject.org>
+Reply-To: Marco Moock <mm@dorfdsl.de>
+Message-ID: <6966b40914be8_31d5b1d38719@mars.mail>
Subject: [tor-relays] Re: Questions about running an exit relay
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="===============8958541500975114832=="
+Content-Transfer-Encoding: 7bit
List-Id: "support and questions about running Tor relays (exit, non-exit,
bridge)" <tor-relays.lists.torproject.org>
-Archived-At:
- <https://lists.torproject.org/mailman3/hyperkitty/list/tor-relays@lists.torproject.org/message/OAX7EO72GLXS4KPKUG7QSG7EOAR2WYVA/>
-List-Archive:
- <https://lists.torproject.org/mailman3/hyperkitty/list/tor-relays@lists.torproject.org/>
+Archived-At: <https://lists.torproject.org/mailman3/hyperkitty/list/tor-relays@lists.torproject.org/message/OAX7EO72GLXS4KPKUG7QSG7EOAR2WYVA/>
+List-Archive: <https://lists.torproject.org/mailman3/hyperkitty/list/tor-relays@lists.torproject.org/>
List-Help: <mailto:tor-relays-request@lists.torproject.org?subject=help>
List-Owner: <mailto:tor-relays-owner@lists.torproject.org>
List-Post: <mailto:tor-relays@lists.torproject.org>
List-Subscribe: <mailto:tor-relays-join@lists.torproject.org>
List-Unsubscribe: <mailto:tor-relays-leave@lists.torproject.org>
-From: Marco Moock via tor-relays <tor-relays@lists.torproject.org>
-Reply-To: Marco Moock <mm@dorfdsl.de>
-Content-Type: multipart/mixed; boundary="===============8958541500975114832=="
+
+
+--===============8958541500975114832==
+MIME-Version: 1.0
+Content-Type: text/plain;
+ charset=us-ascii
+Content-Transfer-Encoding: 7bit
+Content-Disposition: inline
+Content-ID: <6966b40914ae9_31d5b1d38641@mars.mail>
+
+_______________________________________________
+tor-relays mailing list -- tor-relays@lists.torproject.org
+To unsubscribe send an email to tor-relays-leave@lists.torproject.org
--===============8958541500975114832==
-Content-Type: multipart/signed; boundary="Sig_/gizYC_1dGsAzUHvksdaMIe2";
- protocol="application/pgp-signature"; micalg=pgp-sha256
+Content-Type: multipart/signed;
+ boundary="Sig_/gizYC_1dGsAzUHvksdaMIe2";
+ micalg=pgp-sha256;
+ protocol="application/pgp-signature"
+Content-Transfer-Encoding: 7bit
+
--Sig_/gizYC_1dGsAzUHvksdaMIe2
-Content-Type: text/plain; charset=US-ASCII
+Content-Type: text/plain;
+ charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
On 02.01.2026 18:46 Jon via tor-relays
@@ -39,7 +60,8 @@
Can they deny you to turn the relay off?
If so, you could then operate a new "system" on another IP.
---=20
+-- =
+
kind regards
Marco
@@ -47,6 +69,7 @@
--Sig_/gizYC_1dGsAzUHvksdaMIe2
Content-Type: application/pgp-signature
+Content-Transfer-Encoding: 7bit
Content-Description: Digitale Signatur von OpenPGP
-----BEGIN PGP SIGNATURE-----
@@ -69,14 +92,5 @@
--Sig_/gizYC_1dGsAzUHvksdaMIe2--
---===============8958541500975114832==
-Content-Type: text/plain; charset="us-ascii"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-Content-Disposition: inline
-
-_______________________________________________
-tor-relays mailing list -- tor-relays@lists.torproject.org
-To unsubscribe send an email to tor-relays-leave@lists.torproject.org
-
--===============8958541500975114832==--
+
--- test.eml 2026-01-13 15:58:18.769489410 -0500
+++ test-pythonparsed.eml 2026-01-13 16:19:30.385608544 -0500
@@ -1,10 +1,8 @@
Subject: [tor-relays] Re: Questions about running an exit relay
List-Id: "support and questions about running Tor relays (exit, non-exit,
bridge)" <tor-relays.lists.torproject.org>
-Archived-At:
- <https://lists.torproject.org/mailman3/hyperkitty/list/tor-relays@lists.torproject.org/message/OAX7EO72GLXS4KPKUG7QSG7EOAR2WYVA/>
-List-Archive:
- <https://lists.torproject.org/mailman3/hyperkitty/list/tor-relays@lists.torproject.org/>
+Archived-At: <https://lists.torproject.org/mailman3/hyperkitty/list/tor-relays@lists.torproject.org/message/OAX7EO72GLXS4KPKUG7QSG7EOAR2WYVA/>
+List-Archive: <https://lists.torproject.org/mailman3/hyperkitty/list/tor-relays@lists.torproject.org/>
List-Help: <mailto:tor-relays-request@lists.torproject.org?subject=help>
List-Owner: <mailto:tor-relays-owner@lists.torproject.org>
List-Post: <mailto:tor-relays@lists.torproject.org>
Я открыл: