Auf discuss python org diskutieren wir die E-Mail-Seite von Discourse. Die größte Beschwerde ist das Fehlen von Threading. Ich habe die Header etwas untersucht und es scheint, dass:
Der Message-ID-Header zumindest eindeutig ist
Die Header Reply-To und Referencesnicht auf die Message-IDs anderer Nachrichten verweisen, geschweige denn auf die Message-ID der Nachricht, auf die sie eine Antwort sind
Sie stattdessen auf eine fiktive Message-ID verweisen, die auf der Topic-Nummer basiert
Das bedeutet, dass E-Mail-Benutzer (a) völlig flache, nicht-verschachtelte Diskussionen sehen und (b) die Stamm-Nachricht anscheinend fehlt, da die Header In-Reply-To und References auf eine Message-ID verweisen, die in keiner Nachricht tatsächlich vorkommt.
Das ist schlecht und verstößt gegen RFC 5322. Und es macht die E-Mail-Erfahrung weitaus schlechter, als sie leicht sein könnte.
Als Beispiel gibt es dort einen Thread, dessen erste Nachricht diese Header hat:
Wieder eine ok Message-ID, aber völlig unsinnige In-Reply-To- und References-Header.
Das sollte einfach zu beheben sein. Die erste Nachricht sollte weder In-Reply-To- noch References-Header haben. Die zweite Nachricht sollte die Message-ID der ersten Nachricht in den Headern In-Reply-To und References haben.
Bitte beachten Sie RFC5322 Abschnitt 3.6.4 für Details:
So wie die Dinge sind, sehen E-Mail-Benutzer flache, unstrukturierte Diskussionen. Mit diesen Korrekturen können sie eine sinnvolle, leicht verständliche verschachtelte Anzeige erhalten.
Ich schaue mir gerade den Unterschied zwischen HEAD und diesem Fix an.
Mir scheint, dass References immer noch gesetzt wird, auch wenn es keinen Vorgänger gibt – topic_canonical_reference_id wird als Fallback verwendet. Ich halte das immer noch für falsch, da es keine E-Mail-Nachricht mit dieser ID gibt.
In-Reply-To ist etwas korrekter, da es nur gesetzt wird, wenn post.post_number!=1, aber es greift immer noch auf topic_canonical_reference_id zurück:
Das scheint zwei Probleme zu haben, wie ich es sehe:
Der Fallback sollte die Message-ID von Beitrag #1 sein, wenn keine referenced_post_message_ids vorhanden sind, und nichttopic_canonical_reference_id.
Etwas im receipt-of-reply-emails-Code muss den In-Reply-To-Header der Antwortnachrichten fallen lassen, da diese das referenced_post_message_ids-Array korrekt hätten füllen sollen (“Liste”? Ich bin neu in Ruby).
Cameron, danke, dass du dieses Thema zur Diskussion gestellt und viele Details in deinen Beiträgen geliefert hast. Ich bin für diesen Büchsen der Pandora verantwortlich, von diesen beiden Commits:
Wir sind uns seit einiger Zeit einiger Probleme mit dem Threading in E-Mail-Clients wie Thunderbird bewusst, aber es gab nicht viele Nutzer von E-Mail-Threading aus Discourse, daher wurde es aufgeschoben. Aber jetzt, da dies ans Licht kommt, müssen wir einige Zeit darauf verwenden, das Problem erneut zu untersuchen und an einer Lösung zu arbeiten.
Interessanterweise haben wir diesen References-Header bei der ersten gesendeten E-Mail und bei jeder nachfolgenden E-Mail hinzugefügt, da er das korrekte Threading in Gmail ermöglicht. Aber ich stimme zu, dass es nicht ideal ist und wahrscheinlich die Threading-Probleme verursacht, zusammen mit der Nichtverwendung der ursprünglichen Message-ID in den In-Reply-To- und References-Headern der nachfolgenden E-Mails.
Bitte habt Geduld mit mir, während ich alte Diskussionen und den Code durchsehe und dies ausarbeite. In der Zwischenzeit, sind dir andere E-Mail-Clients bekannt, die verwendet werden und Probleme haben? Ich weiß zum Beispiel, dass dies ein Problem in Thunderbird ist, aber was ist mit anderen? Danke.
Ich habe eine lange Antwort geschrieben, aber Folgendes erhalten:
Es tut uns leid, aber Ihre E-Mail-Nachricht an
["incoming+8349bd9eb1f2b582df4f32dbe85c3363@meta.discoursemail.com"]
(Betreff: Re: [Discourse Meta] [bug] Discourse-E-Mail-Nachrichten werden
falsch geordnet) hat nicht funktioniert.
Grund:
Entschuldigung, neue Benutzer können nur 2 Links in einen Beitrag einfügen.
Wenn Sie das Problem beheben können, versuchen Sie es bitte erneut.
Ich werde sie jetzt ins Forum stellen, wo ich sie noch bearbeiten kann…
Cameron, danke, dass du dieses Thema zur Diskussion gestellt und viele Details in deine Beiträge aufgenommen hast. Ich bin für diesen Dosenöffner verantwortlich, aus diesen beiden Commits:
3b13f1146b2a406238c50d6b45bc9aa721094f46
Das sieht gut aus. Wird diese ID mit dem DB-Eintrag gespeichert, damit eingehende Antworten mit der vorherigen Forennachricht verknüpft werden können?
Möchtest du auch, dass ich überprüfe, ob der Suffix syntaktisch für RFC5322 zulässig ist, in Bezug auf erlaubte Zeichen?
82cb67e67b83c444f068fd6b3006d8396803454f
Dieser zweite Commit scheint ein weiteres Problem zu lösen, das wir gesehen haben: Wenn ein Beitrag aus einer E-Mail stammt, ist die ausgehende Message-ID, die an E-Mail-Benutzer gesendet wird, nicht die Message-ID der Quellnachricht des Autors. Dies führt dazu, dass zwei verschiedene Nachrichten aus Sicht eines Mail-Clients entstehen, und wahrscheinlich werden Antworten an das Original im Gegensatz zur Forum-gesendeten Kopie unterbrochen. Zum Beispiel:
An: das Forum
CC: einer der Teilnehmer
Der Teilnehmer erhält (nun ja, möglicherweise) eine Kopie vom Forum und eine direkte Kopie vom Autor, und dies werden unterschiedliche Nachrichten auf ihrer Seite sein, da sie unterschiedliche Message-IDs haben werden.
Ich wollte nach der Klärung des Problems mit den Headern “in-reply-to” und “references”, das weitaus wichtiger ist, einen zweiten Fehlerbericht zu diesem Thema erstellen.
Wir sind uns seit einiger Zeit einiger Probleme mit dem Threading in E-Mail-Clients wie Thunderbird bewusst, aber es hat keine große Anzahl von Nutzern von E-Mail-Threading aus Discourse dargestellt, daher wurde es aufgeschoben, aber jetzt, da dies ans Licht kommt, müssen wir einige Zeit damit verbringen, das Problem erneut zu untersuchen und an einer Lösung zu arbeiten.
Ich und mehrere andere verwenden mutt. Ich bin gerne bereit, alles zu tun, was zur Unterstützung beim Debugging und zur Überprüfung von Code erforderlich ist. Ich war auch in früheren Leben lange Zeit Mail-Sysadmin.
[quote=“Cameron Simpson, post:1, topic:233499,
username:cameron-simpson”]
Es ist die erste Nachricht. Sie sollte keinen References-Header haben, da es nirgendwo eine Nachricht mit dieser ID gibt.
[/quote]
Interessanterweise haben wir diesen References-Header zu der Zeit zur ersten gesendeten E-Mail und zu jeder nachfolgenden hinzugefügt, da dies das Threading in Gmail korrekt funktioniert.
Ich denke, ein korrekter References-Header (abwesend in der ersten Nachricht, wie in-reply-to in Antworten) sollte auch funktionieren. Aber GMail hat manchmal eine eher lockere Beziehung zu Mail-Standards. Ich habe eine Gmail-Vereinbarung; ich kann dort auch einige Debugging-Arbeiten durchführen. Und im Prinzip können wir diese sehr Diskussion als Testfeld nutzen, vielleicht.
aber ich stimme zu, dass es nicht ideal ist und wahrscheinlich die Threading-Probleme verursacht
zusammen mit der Nichtverwendung der ursprünglichen Message-ID in den nachfolgenden E-Mail- In-Reply-To- und References-Headern.
Bitte haben Sie Geduld mit mir, während ich alte Diskussionen und den Code durchsehe und mich damit beschäftige.
Kein Problem.
In der Zwischenzeit, sind Sie sich anderer E-Mail-Clients bewusst, die verwendet werden und Probleme haben? Zum Beispiel weiß ich, dass dies ein Problem in Thunderbird ist, aber was ist mit anderen? Danke.
Definitiv mutt. Zumindest mit mutt ist es sehr einfach, die Header zu sehen und auch die Antwort-Baumkette zu sehen, die in anderen Clients oft verdeckt ist.
Mail-Threading wird vollständig durch die Header Message-ID und In-Reply-To definiert. Der References-Header begann mit USENET für Follow-ups und unterstützte (dort) mehrere Message-IDs; der In-Reply-To unterstützt nur einen. Es sieht so aus, als ob References jetzt auch in RFC5322 vorhanden ist, und ich werde seine Semantik prüfen.
Okay, das ist ziemlich viel, bitte haben Sie etwas Geduld. Zuerst einmal vielen Dank für eine weitere detaillierte Antwort und das Angebot zum Debugging/Review, es ist wirklich hilfreich Ich habe mir das heute Morgen tatsächlich angesehen und überraschenderweise funktioniert das Threading in einer einheitlichen Ansicht in Thunderbird in den meisten Fällen, und ich denke, der References-Header, der konsistent auf den OP verweist, hilft dabei (zum Beispiel ist der Thema-Reference in dieser Kette, der immer vorhanden ist, \u003ctopic/53@discoursehosted.martin-brennan.com\u003e).
Der Fall, in dem das Threading nicht wie beabsichtigt funktioniert, ist:
Ein Beitrag wird innerhalb von Discourse erstellt und eine E-Mail wird an diejenigen gesendet, die das Thema beobachten dann
Jemand anderes antwortet auf diesen Beitrag und eine E-Mail wird an diejenigen gesendet, die das Thema beobachten
Im Fall der zweiten E-Mail erhält sie einen falschen In-Reply-To- und References-Header, da sie einen in dieser Zeile generiert: discourse/lib/email/sender.rb at 98bacbd2c6b9fe57167cd32af5eb4839b4a5d1f6 · discourse/discourse · GitHub, anstatt einen vorhandenen zu verwenden. Sie sollte die Message-ID für die zuerst gesendete E-Mail verwenden. Im Screenshot ist dies, wo die Nachrichten, die diesem Muster folgen, platziert werden sollten:
Die Antwort ist – es kommt darauf an. Wenn ein Beitrag aus einer eingehenden E-Mail in Discourse erstellt wird, wie z. B. dieser von Ihnen, verwenden wir die ursprüngliche eingehende Message-ID dieses Beitrags, wenn jemand darauf antwortet, für die Header In-Reply-To und References, wie hier beschrieben:
Andernfalls verwenden wir einfach die Referenz des Thema-OP und generieren eine neue Referenz, was offensichtlich die Ursache für alle Probleme ist. In allen Fällen generieren wir jedes Mal eine neue Message-ID, wenn eine ausgehende E-Mail gesendet wird, was korrekt und auf Augenhöhe mit anderen E-Mail-Clients zu sein scheint.
Ich glaube, ich verstehe, was Sie meinen. Geht es so:
Cameron sendet eine E-Mail an Discourse von Mutt, die Message-ID: 74398756983476983@mail.com erhält
Discourse erstellt einen Beitrag und speichert die Message-ID gegen den Beitrag mit einem IncomingEmail-Eintrag
Johndoe beobachtet das Thema, also erhält er eine E-Mail von Discourse mit einer Message-ID: topic/222/44@discourse.com und ohne Bezug auf die ursprüngliche Message-ID: 74398756983476983@mail.com
Klingt das richtig, dass wir diese Message-ID einfach an diejenigen weitergeben sollten, die das Thema beobachten, anstatt unsere eigene zu generieren, da sie bereits eindeutig ist? Was passiert dann im E-Mail-Client von Johndoe, wenn
Cameron ihn auch auf diese ursprüngliche ausgehende Nachricht CC’d hat? Dies scheint ein separates Problem zu sein, daher wäre es gut, ein weiteres Bug-Thema dafür zu eröffnen.
Ich werde lokal einen Mutt-Client einrichten, um zu sehen, was Sie auch sehen. Ich habe diese Funktionalität noch nie in einem textbasierten Client getestet (nur Gmail und Thunderbird), daher bin ich gespannt, wie es aussieht.
Meine Überlegung, um diese Probleme heute Morgen anzugehen, war, die zufällig generierten Suffixe zu verwerfen, die wir beim Senden von Message-ID-Headern in E-Mails generieren, und stattdessen ein Schema zu verwenden, bei dem wir die user_id des sendenden und empfangenden Benutzers verwenden. Der Vorteil davon ist, dass die Message-ID nirgendwo gespeichert werden muss (außer wenn eine eingehende E-Mail einen Beitrag erstellt) und somit die Header References und In-Reply-To immer konsistent sind. Lassen Sie mich ein Beispiel geben. Nehmen wir an, wir haben diese Benutzer:
Martin – user_id 25
Cameron – user_id 44
Sam – user_id 78
Bob – user_id 999
Und dann haben wir dieses Thema, topic_id 233499, mit Beiträgen ab post_id 100 als OP. Das Format wäre topic/#{topic_id}/#{post_id}.s#{sender_user_id}r#{receiver_user_id}. Die Reihenfolge der Operationen würde wie folgt aussehen:
Bob erstellt Beitrag 103 im Thema, nicht als Antwort auf jemanden (beachten Sie, dass References hier die Message-ID enthält, die an beide Benutzer für die OP-E-Mail gesendet wurde)
Bob – Antwort im Thema, nicht auf einen bestimmten Beitrag
GESENDET → an: Discourse, RE: Bobs Beitrag
Sams Posteingang
Martin – Thema OP
Cameron – zweiter Beitrag
GESENDET → an: Discourse, RE: zweiter Beitrag
Bob – Antwort im Thema, nicht auf einen bestimmten Beitrag
Ich denke, das ist richtig, können Sie sich bitte ansehen, was ich in diesen Headern geschrieben habe, und bestätigen, dass dies das ist, was Sie von diesem Szenario erwarten würden? Das Einzige, worüber ich mir ein wenig unsicher bin, ist, ob ich alle Referenzen abgedeckt habe, und natürlich würde ich dies an einem Live-Datensatz von E-Mails in einem Entwicklungszweig testen, bevor ich es ausrolle. Ich habe auch noch nichts in Mutt getestet.
Nebenbei bemerkt, habe ich mir auch angesehen, was GitHub mit seinen Benachrichtigungs-E-Mails macht, und festgestellt, dass sie etwas Ähnliches tun, wo sie eine allgegenwärtige Reference (discourse/discourse/pull/252@github.com) haben, die in allen E-Mails verwendet wird, die sich auf dieses “Thema” beziehen, das in diesem Fall eine GitHub-Pull-Anfrage ist:
Von Martin Brennan über Discourse Meta am 22. Juli 2022 um 06:34:
Okay, das ist ziemlich gewaltig, bitte habt etwas Geduld mit mir. Erstmal vielen Dank für
eine weitere detaillierte Antwort und das Angebot zur Fehlersuche/Überprüfung, das ist
wirklich hilfreich Ich habe mich heute Morgen tatsächlich damit beschäftigt und,
überraschenderweise, funktioniert die Thread-Ansicht in einer einheitlichen Ansicht in Thunderbird
für die meisten Fälle, und ich denke, dass der References-Header, der konsistent
auf den OP verweist, dabei hilft (beispielsweise ist der Topic-Reference-Eintrag
in dieser Kette, der immer vorhanden ist, <topic/53@discoursehosted.martin-brennan.com>.
Ich habe gerade RFC5322 Abschnitt 3.6.4 noch einmal genau gelesen. Er hat sich von
früheren Versionen (822 und 2822) weiterentwickelt und die E-Mail-In-Reply-To-
Header, die USENET-References-Header und moderne Antworten, die mehr als eine
vorherige Nachricht zitieren, zusammengeführt.
Kurze Zusammenfassung:
Die Message-ID ist eine einzige persistente Identifikator für eine Nachricht.
In-Reply-To enthält alle Message-IDs, auf die diese Nachricht direkt antwortet;
wenn ich also auf ein Paar von Nachrichten antworte, werden diese 2 Message-IDs enthalten sein.
References ist eine Antwortkette aus vorhergehenden Message-IDs vom OP bis zur
vorhergehenden Nachricht. Sie sollte also tatsächlich immer mit der Message-ID des OP beginnen.
Also für Diskussionen wie diese, wobei wir Labels als Message-IDs behandeln:
Vielen Dank nochmals für diese wunderbar ausführliche Antwort. Es wird wahrscheinlich eine Weile dauern, bis ich dies verarbeitet und in umsetzbare Punkte umgewandelt habe. Bitte haben Sie also etwas Geduld mit uns (außerdem habe ich einige andere interne Projekte mit hoher Priorität, an denen ich gerade arbeite). Ich denke, mit diesen Informationen werden wir in der Lage sein, unsere Threading-Systeme viel robuster und spezifikationsgerechter zu gestalten. Möglicherweise habe ich weitere Fragen, wenn ich Ihren Beitrag durchgehe. Danke, Cameron.
Von Martin Brennan via Discourse Meta am 25. Juli 2022 00:28:
Wow, danke nochmals für diese wunderbar ausführliche Antwort. Es wird
wahrscheinlich eine Weile dauern, bis ich das verarbeitet und in
umsetzbare Punkte umgewandelt habe, also haben Sie bitte etwas Geduld mit uns (außerdem habe ich derzeit einige andere interne Projekte mit hoher Priorität, an denen ich arbeite). Ich
denke, mit diesen Informationen werden wir in der Lage sein, unsere Threading-Systeme viel robuster und spezifikationsgerechter zu machen. Ich habe möglicherweise weitere Fragen, wenn ich Ihren Beitrag durchgehe, danke Cameron.
Ah, das ist eine interessante Beobachtung, ich hatte den kleinen Pfeil nicht bemerkt.
Das ist auch super interessant. Ich glaube (ohne den Quellcode zu prüfen), dass Thunderbird das tut, und wahrscheinlich auch die Gmail-Oberfläche, da sie dasselbe tut.
Das scheinen wir zu tun, aber ich schätze, nicht konsequent? Grundsätzlich müssen wir sicherstellen, dass:
TODO #1 - Wenn ein Beitrag einen zugehörigen IncomingEmail-Datensatz hat, verwenden wir immer diese Message-ID, wenn wir E-Mails senden.
TODO #2 - Verwenden Sie keine References, wenn Sie E-Mails im Zusammenhang mit dem OP des Themas versenden.@cameron-simpson eine Frage – wenn der OP über eine eingehende E-Mail erstellt wurde, würden wir dann diese Message-ID in References für den OP verwenden oder sie trotzdem ausschließen?
Das ist interessant, ich dachte, jeder Empfänger der E-Mail müsse eine eindeutige Message-ID haben? Tatsächlich glaube ich, dass wir deshalb dazu übergegangen sind, die Message-ID jedes Empfängers eindeutig zu machen, um Spam-Verhalten zu vermeiden, wenn ich an unseren internen Thread zurückdenke. Vielleicht könnte @supermathie, der in unserem Infrastrukturteam ist und Anfang des Jahres viel mit E-Mails getestet hat, hier auch etwas dazu sagen?
Sie sagen also, dass der Beitrag eher die Sache ist, die eine einzige Message-ID für alle Empfänger bestimmt. Vielleicht generieren wir also einfach eine für jeden Beitrag, der eine E-Mail generiert? Dann könnten wir auch die IncomingEmail.message_id hierher verschieben. Vorläufige Änderung, die wir vornehmen müssten:
TODO #3 - Fügen Sie der Post-Tabelle ein outbound_message_id hinzu. Generieren Sie es einmal, wenn eine E-Mail zum ersten Mal in Bezug auf den Beitrag gesendet wird. Verwenden Sie es für nachfolgende References- und In-Reply-To-Header. Setzen Sie seinen Wert, wenn ein Beitrag aus einer IncomingEmail erstellt wird. Das Format sollte topic/:topic_id/:post_id/:random_alphanumeric_string@host sein, z. B. topic/233499/33545/gvy8475y7c45y87554c@meta.discourse.org
Nach dieser Änderung würde mein erstes Beispiel so aussehen:
Unter Berücksichtigung, dass der OP keine Sonderbehandlung mehr erfährt, wird er nicht mehr im Format topic/:topic_id@hostname sein.
TODO #4 - Stellen Sie sicher, dass korrekte In-Reply-To- und References-Header basierend auf PostReply-Datensätzen und der neuen Spalte outbound_message_id in der Post-Tabelle generiert werden.
Ich glaube, wir haben hier einige Überlegungen, ich werde das noch einmal überprüfen.
Das scheint definitiv so zu sein
Können Sie bestätigen, dass die TODOs hier vernünftig klingen, Cameron? Es scheint jetzt wirklich nicht mehr viel zu sein, wenn ich es mir ansehe. Ich frage mich auch, wenn ich diese Arbeit angehe, ob Sie bereit wären, sich einer Test-Discourse-Instanz anzuschließen, auf der die WIP-Änderungen bereitgestellt werden, damit wir E-Mails hin und her senden und testen können, ob die Dinge korrekt funktionieren? Ich werde natürlich vorher meine eigenen Tests durchführen, bevor ich Sie einbeziehe.
Wenn nicht, ist das auch in Ordnung – ich habe Thunderbird und werde mutt einrichten und kann alles dort testen
@cameron-simpson Eine Sache, die ich hier klären wollte, ist der Geltungsbereich von „message_id“.
Der Auslöser für diesen ganzen Tanz war der starke Verdacht von @supermathie, dass unsere nicht eindeutigen message_ids Probleme verursachten.
Discourse generiert für jede gesendete E-Mail eindeutige E-Mails pro Benutzer. Wenn also beispielsweise 2 Benutzer dieses Thema verfolgen:
Benutzer 1 erhält Nutzlast 1 mit einem eindeutigen Abmeldelink, der auf Benutzer 1 gerichtet ist.
Benutzer 2 erhält Nutzlast 2 mit einem eindeutigen Abmeldelink, der auf Benutzer 2 gerichtet ist.
Wenn in beiden Fällen unsere Nachrichten-ID beispielsweise discourse_topic_100/23 (topic_id/post_number) wäre, würden wir den MTAs da draußen mitteilen, dass discourse_topic_100/23 2 eindeutige Nutzlasten sein können. Die Hypothese ist, dass sie dies als Spam-Signal behandeln.
Hey Discourse … du hast gerade zwei E-Mails namens discourse_topic_100/23 gesendet, was ist los?
Da Discourse die gesamte E-Mail-Übertragung kontrolliert und E-Mails nicht wie bei herkömmlichen Mailinglisten zu einer Bcc- oder Cc-Liste hinzugefügt werden, können wir uns saubere Abmeldelinks pro Benutzer leisten.
Was denkst du dazu? Was ist mit der einfachen Änderung, discourse_topic_100/23/7333 zu verwenden, z. B. (topic_id, post_number, user_id) als eindeutigen Bezeichner für die E-Mail? Es ist sicherlich eine eindeutige Nutzlast und wir können uns leicht darauf beziehen, wenn wir E-Mails für einen Benutzer generieren.
Von Martin Brennan über Discourse Meta am 26. Juli 2022, 00:27:
Das ist auch sehr interessant. Ich glaube (ohne den Quellcode zu prüfen), dass Thunderbird das tut,
und wahrscheinlich auch die Gmail-Oberfläche, da sie dasselbe macht.
Ich denke, Mutt wird beides verwenden, aber wahrscheinlich nur In-Reply-To, falls vorhanden,
und im Fallback auf References zurückgreifen. Ich müsste den Quellcode prüfen.
Bei References kennt man zumindest die gesamte Kette bis zum ursprünglichen Beitrag (OP);
bei In-Reply-To braucht man mehr oder weniger die vorausgehenden Nachrichten,
um alles zusammenzufügen. Bei Mailinglisten bewahre ich den gesamten Thread
lokal auf, bis er abgeschlossen ist, und das ist meiner Erfahrung nach üblich.
Das scheint uns zwar zu tun, aber wohl nicht konsistent? Grundsätzlich müssen wir sicherstellen, dass:
TODO #1 - Wenn ein Beitrag einen zugehörigen IncomingEmail-Eintrag hat, verwenden wir bei der Versendung der E-Mail immer diese Message-ID.
Ja. Deshalb dachte ich, es wäre am vernünftigsten, ein explizites Feld für die Message-ID einzuführen
und es einmalig zu füllen. Danach sollte es immer verwendet werden, unabhängig von späteren Änderungen
im Prozess, mit dem die Message-ID im Code generiert wird.
TODO #2 - Verwende beim Versenden von E-Mails, die sich auf den OP eines Themas beziehen, keinen References-Header.
Ja. Der OP hat keine vorausgehende Nachricht, also gibt es weder References noch In-Reply-To.
@cameron-simpson eine Frage jedoch – falls der OP über eine eingehende E-Mail erstellt wurde,
würden wir dann diese Message-ID in References für den OP verwenden oder ihn trotzdem ausschließen?
Immer ausschließen. Aber verwende sie als persistente Message-ID für den OP.
Eine per E-Mail verfasste Nachricht (OP oder Antwort) erhält ihre Message-ID aus der E-Mail.
Eine, die im Web verfasst wurde, erhält eine, wenn der Benutzer auf „Absenden“ klickt – generiert von Discourse.
Ab diesem Zeitpunkt ist das die Message-ID, egal wie sie entstanden ist.
Das ist interessant, ich dachte, jeder Empfänger der E-Mail müsse eine eindeutige Message-ID haben?
Nein. Die Message-ID identifiziert die „Nachricht“, nicht die einzelne Kopie. Ich könnte
einen Beitrag im Forum veröffentlichen und jemanden direkt per CC hinzufügen. Wenn diese Person
eine Kopie direkt von mir erhält und auch über das Forum, sollten beide Kopien dieselbe Message-ID haben.
Tatsächlich glaube ich, dass wir aus diesem Grund den Weg eingeschlagen haben,
jeder Empfänger-spezifischen Message-ID eine Einzigartigkeit zu verleihen, um Spam-Verhalten zu vermeiden.
Wenn ich auf unser internes Thema zurückblicke. Vielleicht könnte @supermathie, der bei unserem Infrastrukturteam
arbeitet und Anfang des Jahres einige Tests mit E-Mails durchgeführt hat, hier ebenfalls Stellung nehmen?
Vielleicht. Aber auf den ersten Blick ist das Threading tatsächlich defekt. Sicherlich sollte
die Versendung derselben Nachricht an viele Personen dieselbe Message-ID haben, und im Allgemeinen
sollte Discourse als Weiterleiter (E-Mail → Discourse → E-Mail-Empfänger) die Message-IDs nicht ändern.
Was du sagst, ist eher, dass der Beitrag das Element sein sollte, das eine einzige Message-ID für alle Empfänger bestimmt.
Also generieren wir vielleicht einfach eine pro Beitrag, der eine E-Mail auslöst?
Jeder Beitrag sollte eine stabile, eindeutige Message-ID für den E-Mail-Bereich haben. Wenn der Beitrag
aus einer E-Mail stammt, sollte diese ursprüngliche Message-ID verwendet werden. Andernfalls (über die Weboberfläche)
sollte Discourse eine Message-ID generieren und sie beim Beitrag speichern.
Dann könnten wir auch IncomingEmail.message_id hierher verschieben.
Sicher. Ein eigener Satz von Feldern (Message-ID scheint auszureichen), der den E-Mail-seitigen Zustand enthält, sollte genügen.
Vorläufig wäre die notwendige Änderung:
TODO #3 - Füge der Post-Tabelle ein outbound_message_id hinzu. Generiere es einmal, wenn eine E-Mail im Zusammenhang mit dem Beitrag erstmals versendet wird.
Wenn du den Beitrag aus einer E-Mail erhalten hast, solltest du diese verwenden, nicht eine neue generieren.
Verwende es für nachfolgende References- und In-Reply-To-Header. Setze seinen Wert, wenn ein Beitrag aus einem IncomingEmail erstellt wird.
Ja. Auf die Message-ID aus der E-Mail.
Das Format sollte sein: topic/:topic_id/:post_id/:random_alphanumeric_string@host, z. B. topic/233499/33545/gvy8475y7c45y87554c@meta.discourse.org
Für diejenigen, die ihr selbst generiert, sieht das für mich gut aus.
Nach dieser Änderung würde mein erstes Beispiel so aussehen:
Aber beachte: Die Message-ID muss nur stabil und eindeutig sein. Wenn topic/:topic_id/:post_id@host stabil ist
und nie neu generiert wird, reicht das aus. Aber wenn du dir darüber Sorgen machst (z. B. bei Datenbankwiederherstellungen,
Migrationen oder Importen, die dieselben Zahlen mitbringen), macht die zufällige Zeichenkette es robust gegen Kollisionen.
Beachte, dass der linke Teil der Message-ID dot-atom-text ist, definiert hier:
was Buchstaben, Ziffern und eine begrenzte Menge an Satzzeichen umfasst (darunter auch „/“).
Ähm, deine Header. Sie sollten folgendes enthalten:
Beachte die spitzen Klammern. Die Message-ID ist formal der Teil zwischen den spitzen Klammern,
und die spitzen Klammern sind zwingend erforderlich. Syntax hier:
Unter der Berücksichtigung, dass der OP keine spezielle Behandlung mehr hat, wird er nicht mehr im Format topic/:topic_id@hostname sein.
Klingt gut.
TODO #4 - Stelle sicher, dass korrekte In-Reply-To- und References-Header basierend auf PostReply-Einträgen und der neuen Spalte outbound_message_id in der Post-Tabelle generiert werden.
Danke.
Ich glaube, wir haben dafür bereits eine Berücksichtigung, ich werde das noch einmal überprüfen.
+1
Das scheint definitiv der Fall zu sein
Kannst du bestätigen, dass die TODOs hier vernünftig klingen, Cameron?
Sie scheinen mir korrekt zu sein.
Es scheint wirklich nicht viel zu sein, jetzt wo ich es mir ansehe. Ich frage mich auch,
ob du offen wärst, dich mir bei einer Test-Discourse-Instanz anzuschließen, auf der die WIP-Änderungen deployed sind,
damit wir per E-Mail hin und her kommunizieren und testen können, ob alles korrekt funktioniert?
Ich werde natürlich vorab selbst Tests durchführen, bevor ich dich einbinde.
Sicher. Ich helfe gerne auf jede erdenkliche Weise.
Falls nicht, ist das auch in Ordnung – ich habe Thunderbird und werde mutt einrichten,
und ich kann das alles dort testen
Ich kann dir bei mutt helfen, falls du das möchtest.
Ich denke, Sie können immer noch eindeutige Nachrichten mit derselben message-id senden, selbst mit kleinen Unterschieden wie diesem.
Gewöhnliche Mailinglisten tun dies mehr oder weniger ständig. Zumindest geschieht immer eine gewisse Manipulation von Headern. Aber auch der Nachrichtenkörper wird manchmal geändert. Ein krasses Beispiel ist python-list, das Nicht-Text-Anhänge verwirft. Die Nachricht wird jedoch mit derselben message-id weitergeleitet. Und fast alle Listen fügen unten einen Zusatz hinzu, zum Beispiel einen Link zur Admin-Seite der Liste oder einen Abmeldelink. Das war nicht in der Nachricht, als sie ankam.
Und es gab lange Diskussionen über die Inhaltsverschlüsselung, die sich darum drehen, was von einer Signatur abgedeckt werden sollte.
Daher wäre es für mich völlig in Ordnung, wenn Sie Ihren empfängerspezifischen Abmeldelink hinzufügen und die ursprüngliche message-id beibehalten. Die Vorteile überwiegen den Verlust des Threadings bei weitem, wenn Sie jeder Nachrichtenkopie eine individuelle message-id geben würden.
Betrachten Sie wieder den E-Mail-Benutzer. Ich kann auf eine Diskursnachricht antworten und einen CC an eine interessierte externe Person hinzufügen. Vielleicht erhält diese eine Kopie von Diskurs, vielleicht auch nicht. Aber wenn sie eine erhält, sollte sie die Quell-message-id auch mit Ihrem zusätzlichen Zusatz darauf haben. Andernfalls hat sie 2 Kopien meiner Nachricht, aber ihr Mail-System weiß nicht, dass es Kopien derselben Nachricht sind. Das führt zu Problemen.
Kurz gesagt: Ich glaube nicht, dass Ihr sehr kleiner zusätzlicher Abmeldetext separate message-ids rechtfertigt. Behalten Sie nur die eine.
Entschuldigung, ich bin gerade erst auf dem Laufenden, hier sind einige Gedanken, von denen einige bereits angesprochen wurden…
Die Schwierigkeit hierbei ist, dass das, was von Discourse ausgesendet wird, eine andere Nachricht ist als die eingehende. Sie hat andere Metadaten (für diesen Zweck To/From/Reply-to/Unsubscribe/etc.) und einen anderen Body (er ist pro Benutzer angepasst (glaube ich? Passiert das im Mailinglistenmodus nicht?)).
Was genau ist die Nachricht? Wenn man 5322 als Evangelium betrachtet:
Eine Nachricht besteht aus Header-Feldern, optional gefolgt von einem Nachrichtentext.
Das Feld „Message-ID:“ liefert eine eindeutige Nachrichten-ID, die sich auf eine bestimmte Version einer bestimmten Nachricht bezieht.
[Hervorhebung von mir]
Es ist diese „bestimmte Version“, die mich denken lässt, dass es unangemessen wäre, eine eingehende Nachricht mit einer anderen Message-ID erneut zu senden. Wenn Sie jedoch Ihren Standpunkt von Discourse als „Forum-Software“ zu Discourse als „Mailinglisten-Software“ ändern, dann ergibt es irgendwie Sinn, dies zu tun, daher verstehe ich, woher Sie kommen. 5322 besagt auch:
Es gibt viele Fälle, in denen Nachrichten „geändert“ werden, aber diese Änderungen stellen keine neue Instanziierung dieser Nachricht dar, und daher erhält die Nachricht keine neue Nachrichten-ID. Zum Beispiel werden beim Einbringen von Nachrichten in das Transportsystem oft zusätzliche Header-Felder wie Trace-Felder (beschrieben in Abschnitt 3.6.7)
und Resent-Felder (beschrieben in Abschnitt 3.6.6) vorangestellt. Das Hinzufügen solcher Header-Felder ändert nicht die Identität der Nachricht, und daher wird das ursprüngliche
„Message-ID:“-Feld beibehalten. In allen Fällen bestimmt die Bedeutung, die der Absender der Nachricht vermitteln möchte (d. h. ob es sich um dieselbe
Nachricht oder eine andere Nachricht handelt), ob das
„Message-ID:“-Feld geändert wird oder nicht, nicht irgendein bestimmter syntaktischer Unterschied, der
in der Nachricht erscheint (oder nicht erscheint).
Ich nehme an, es kommt darauf an, ändert sich der Absender der Nachricht, wenn Discourse sie versendet?
Vielleicht sollten wir Resent-Message-ID und ähnliche verwenden?
Es war schon immer da, bis zurück zu 822. Aber wie Sie später sagen, ja, es wurde aktualisiert.
5322 spricht auch direkt über die Art und Weise, wie Discourse und Github es verwenden:
Das Feld „In-Reply-To:“ kann verwendet werden, um die Nachricht (oder Nachrichten) zu identifizieren, auf die die neue Nachricht eine Antwort ist, während das Feld „References:“ verwendet werden kann, um einen Gesprächs „Thread“ zu identifizieren.
Möglicherweise leicht falsch, wahrscheinlich aufgrund des Fehlens einer geeigneten „Thread-Kennung“-Header. Aber diese Interpretation ist möglicherweise nicht das, was die RFC-Autoren beabsichtigt haben… sie befasst sich nicht mit Nachrichten mit „References“, aber ohne „In-Reply-To“.
Der knifflige Teil daran ist, dass wir nicht eine E-Mail versenden, sondern N - eine pro Empfänger - damit deren individuelle Metadaten (Abmelden usw.) korrekt sind.
Und ja, ich habe während der Tests starke Anzeichen dafür gesehen, dass die Spam-Bestimmung an eine Message-ID gebunden wäre. Wenn sie später wieder gesehen wurde (derselbe Benutzer oder ein anderer Benutzer), wäre sie viel wahrscheinlicher als Spam markiert worden.
Die Vorteile hierbei sind, fairerweise gesagt, vollständig auf das korrekte Threading von E-Mails in bestimmten E-Mail-Clients ausgerichtet, auf Kosten der Zustellbarkeit.
Das aktuelle topic/#{topic_id}/#{post_id}.s#{sender_user_id}r#{receiver_user_id} macht es zumindest konsistent für einen Benutzer in seinem Posteingang. Die Annahme
Mein größtes Anliegen ist die Zustellbarkeit – es ist schon schwer genug, E-Mails zuzustellen, wenn die großen Anbieter keine Sichtbarkeit haben.
Aber ich sehe ein starkes Argument dafür, Discourse im Mailinglistenmodus mehr wie eine Mailinglisten-Software zu verhalten. @martin Ich glaube, wir passen den Nachrichtentext im Mailinglistenmodus nicht an? Glauben Sie, dass es sinnvoll ist, einen strengeren Ansatz bezüglich der Beibehaltung und Wiederverwendung von Message-IDs im Mailinglistenmodus zu verfolgen?
Ich möchte hier nicht in eine Situation geraten, in der Perfektion das Gute genug verhindert.
Wir verwenden jetzt „zufällige Suffixe“ in Nachrichten, und das verursacht unbestreitbar Probleme.
Wir haben 3 Optionen zur Auswahl:
Zufällige Nachrichten-IDs, auf die nicht zurückverwiesen werden kann
Nachrichten-IDs stabil pro Thema/Beitrag/Benutzer
Nachrichten-IDs stabil pro Thema/Beitrags-Paar
Wir befinden uns derzeit in Planet (1), was verheerende Auswirkungen hat.
Ich befürchte, dass wir zwischen (2) und (3) eine Entscheidungsfindung erreichen können.
Vielleicht beginnen wir einfach mit (2) und erkennen an, dass das Hinzufügen zusätzlicher Kopien zu einer E-Mail von Discourse unerwartetes Verhalten verursachen kann, und hören zumindest auf, den Großteil der Probleme hier zu verursachen?
ah! Ich dachte, wir würden bereits Folgendes tun: topic/#{topic_id}/#{post_id}.s#{sender_user_id}r#{receiver_user_id}
Ich wäre geneigt, im Interesse der Abwägung von E-Mail-Einzigartigkeit und Zustellbarkeit gegenüber den Bedenken des Mailinglistenmodus, (2) für Mailinglistenmodus deaktiviert und (3) für Mailinglistenmodus aktiviert zu tun.
Ebenso wäre ich bei der References-Kopfzeile geneigt, sie für Beitrag Nr. 1 in einem Thema abwesend zu haben und sie auf das Thema (also topic/#{topic_id}) und den Beitrag, auf den geantwortet wird, falls vorhanden, verweisen zu lassen.