You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Abos in hitobito können zu MailChimp synchronisiert werden. Wenn dann später Newsletter via MailChimp versendet werden, dann enthalten diese einen Link "Unsubscribe", um sich von der Liste abzumelden.
Wenn eine Person diesen Link anklickt, wird sie im innerhalb von Mailchimp als abgemeldet vermerkt. Ein "Anmelden" via hitobito Mailchimp sync ist für diese Mailadresse nicht mehr möglich.
Falls die E-Email weiterhin im Abo enthalten wird, retourniert der Mailchimp sync folgende Antwort:
{
"status_code": 400,
"operation_id": null,
"response": "{\"title\":\"Forgotten Email Not Subscribed\",\"status\":400,\"detail\":\"<email> was permanently deleted and cannot be re-imported. The contact must re-subscribe to get back on the list.\",\"instance\":\"\"}"
},
Das Synchronisieren zeigt dann den Status "Teilweise", oder in gewissen Fällen noch schlimmer keine konkreten Zustand sondern {:unchanged=>"Unverändert", :success=>"Aktualisiert", :partial=>"Teilweise", :failed=>"Fehlgeschlagen"} an:
Gewünschtes Verhalten
Hitobito sollte erkennen, wenn MailChimp verhindert, dass abgemeldete Personen wieder zur Liste hinzugefügt werden, und entweder diese Personen vom Abo entfernen, oder zumindest den MailChimp Sync trotzdem als erfolgreich markieren.
Schritte zu reproduzieren
Siehe oben. Leider nicht ganz einfach zu reproduzieren ohne MailChimp Account.
Finde eine MailingList die ein Mitglied hat welches in diesen Fehler läuft. Z.B. Multitenancy glaj-vd, Abo mit ID 3 hat 1 solche Person.
MailchimpSynchronizationJob.new(<id der betroffenen MailingList>).perform auf dieser Umgebung
Im Log-Output suchen nach einem Batch welcher den Output "errored_operations"=> <irgendwas grösseres als 0> produziert hat
Den Google Storage API Link response_body_url anklicken (muss sofort geschehen, dieser Link wird nach wenigen Minuten ungültig), herunterladen und entzippen
Im JSON den Eintrag / die Einträge finden welche "status_code": 400, und "response": "{\"title\":\"Forgotten Email Not Subscribed\" haben
In einem serialisierten Array-Feld auf MailingList sollen all diejenigen Mailadressen abgespeichert werden, welche sich bei MailChimp unsubscribed haben.
Beim Mailchimp Sync werden diese unsubscribten Mailadressen ignoriert
Es dürfen nicht ganze Personen aus der MailingList entfernt werden, da eine Person in hitobito mehrere Mailadressen haben kann und weil dieselbe Mailadresse gleichzeitig mehreren Personen in der MailingList gehören kann (als additional_email, oder via Elternzugang). Ausserdem können Personen in hitobito jederzeit temporär aus einem Abo rausfliegen und wieder dazukommen, aber in der verbundenen Mailchimp Audience ist die Mailadresse für immer ausgeschlossen.
Da wir die fehlenden Mailadressen immer via Batch Operation bei Mailchimp eintragen, gibt es keine bessere Möglichkeit um das Resultat von einzelnen failenden Operations abzurufen, als effektiv die gezippte JSON-Datei vom Google Storage Link abzurufen und zu parsen.
Ziel ist es, dass die partial 400er Errors, die Mailchimp uns wegen diesem Thema zurückgibt, in hitobito nicht mehr zu einem "Teilweise" Status auf dem Mailchimp Sync führen (dies ist der Teil den wir als Bug ansehen)
ToDos
Neue Datenbankspalte serialize :mailchimp_forgotten_emails, Array auf MailingList anlegen (ähnlich wie hier)
Die ZIP-Datei von dieser response_body_url herunterladen
Einzige enthaltene Datei ./*.json entzippen (Dateiname ist jedes Mal anders, Bsp. noejtv88ky.json)
JSON-Datei parsen, dabei kommt ein Array von Objekten raus. Beispiele für ein solches Objekt:
{
"status_code": 400,
"operation_id": null,
"response": "{\"title\":\"Forgotten Email Not Subscribed\",\"status\":400,\"detail\":\"foobar@redacted.com was permanently deleted and cannot be re-imported. The contact must re-subscribe to get back on the list.\",\"instance\":\"\"}"
},
{
"status_code": 200,
"operation_id": null,
"response": "<redacted for brevity>"
},
{
"status_code": 400,
"operation_id": null,
"response": "{\"title\":\"Member Exists\",\"status\":400,\"detail\":\"foobar2@redacted.ch is already a list member. Use PUT to insert or update list members.\",\"instance\":\"\"}"
},
Diejenigen Response-Objekte finden welche status_code 400 haben, und deren title "Forgotten Email Not Subscribed" ist
Das detail Attribut dieser Objekte parsen: Gleich am Anfang müsste eine Mailadresse stehen
Diese Mailadresse in die mailchimp_forgotten_emails der MailingList hinzufügen (bisherige Einträge weiterhin drin lassen)
Für jedes so verarbeitetes JSON-Objekt die response["errored_operations"] bzw. den failed Counter im Sync Result um 1 verringern und response["finished_operations"] bzw. den finished Counter um 1 erhöhen
Specs schreiben (so gut es geht mit all diesem Overhead...)
Sicherstellen, dass diese Fälle
CHANGELOG-Eintrag unter "unreleased" unten hinzufügen
Dieses Issue steht aktuell im Widerspruch mit der Bemerkung zuunterst hier in der user documentation.
EDIT: Die user_documentation liegt hier aktuell effektiv falsch. Die falsche Aussage wurde in hitobito/user_documentation#7 von der Community contributet. Nach der Umsetzung dieses Issues wird es sich dann endlich so verhalten wie in der Dokumentation beschrieben.
Aktuelles Verhalten
Abos in hitobito können zu MailChimp synchronisiert werden. Wenn dann später Newsletter via MailChimp versendet werden, dann enthalten diese einen Link "Unsubscribe", um sich von der Liste abzumelden.
Wenn eine Person diesen Link anklickt, wird sie im innerhalb von Mailchimp als abgemeldet vermerkt. Ein "Anmelden" via hitobito Mailchimp sync ist für diese Mailadresse nicht mehr möglich.
Falls die E-Email weiterhin im Abo enthalten wird, retourniert der Mailchimp sync folgende Antwort:
{ "status_code": 400, "operation_id": null, "response": "{\"title\":\"Forgotten Email Not Subscribed\",\"status\":400,\"detail\":\"<email> was permanently deleted and cannot be re-imported. The contact must re-subscribe to get back on the list.\",\"instance\":\"\"}" },Das Synchronisieren zeigt dann den Status "Teilweise", oder in gewissen Fällen noch schlimmer keine konkreten Zustand sondern

{:unchanged=>"Unverändert", :success=>"Aktualisiert", :partial=>"Teilweise", :failed=>"Fehlgeschlagen"}an:Gewünschtes Verhalten
Hitobito sollte erkennen, wenn MailChimp verhindert, dass abgemeldete Personen wieder zur Liste hinzugefügt werden, und entweder diese Personen vom Abo entfernen, oder zumindest den MailChimp Sync trotzdem als erfolgreich markieren.
Schritte zu reproduzieren
Siehe oben. Leider nicht ganz einfach zu reproduzieren ohne MailChimp Account.
MailchimpSynchronizationJob.new(<id der betroffenen MailingList>).performauf dieser Umgebung"errored_operations"=> <irgendwas grösseres als 0>produziert hatresponse_body_urlanklicken (muss sofort geschehen, dieser Link wird nach wenigen Minuten ungültig), herunterladen und entzippen"status_code": 400,und"response": "{\"title\":\"Forgotten Email Not Subscribed\"habenEine solche JSON-Response-Datei ist für den Moment unter https://files.puzzle.ch/apps/files/files/6958308?dir=/swe/projects/SAC_SchweizerAlpenClub/Hitobito/7_Verschiedenes abgelegt.
Eventuel einfacher lokal mit dem hitobito Account (aus Cryptopus) eine neue Liste anlegen, sync und unsubscribe durchführen.
Screenshots, weiterer Kontext
Eine beispielhafte JSON-Response-Datei von MailChimp ist für den Moment unter https://files.puzzle.ch/apps/files/files/6958308?dir=/swe/projects/SAC_SchweizerAlpenClub/Hitobito/7_Verschiedenes abgelegt.
Tech Spec
ToDos
serialize :mailchimp_forgotten_emails, Arrayauf MailingList anlegen (ähnlich wie hier)response_body_urlherauslesen. Dann folgendes machen, alles immer noch im Rahmen des Jobs:response_body_urlherunterladen./*.jsonentzippen (Dateiname ist jedes Mal anders, Bsp. noejtv88ky.json){ "status_code": 400, "operation_id": null, "response": "{\"title\":\"Forgotten Email Not Subscribed\",\"status\":400,\"detail\":\"foobar@redacted.com was permanently deleted and cannot be re-imported. The contact must re-subscribe to get back on the list.\",\"instance\":\"\"}" }, { "status_code": 200, "operation_id": null, "response": "<redacted for brevity>" }, { "status_code": 400, "operation_id": null, "response": "{\"title\":\"Member Exists\",\"status\":400,\"detail\":\"foobar2@redacted.ch is already a list member. Use PUT to insert or update list members.\",\"instance\":\"\"}" },status_code400 haben, und deren title "Forgotten Email Not Subscribed" istmailchimp_forgotten_emailsder MailingList hinzufügen (bisherige Einträge weiterhin drin lassen)response["errored_operations"]bzw. denfailedCounter im Sync Result um 1 verringern undresponse["finished_operations"]bzw. denfinishedCounter um 1 erhöhen