0 votes
in SoSci Survey (dt.) by s337594 (125 points)
edited by s337594

Guten Tag,

wir führen eine mehrwellige Tagebuchstudie mit vier Messzeitpunkten durch. Dabei möchten wir gerne automatisierte Serienmails für den Versand verwenden.

In dem 1. Fragebogen, in dem auch die SERIAL Kennung erhoben wird, fragen wir nach einem Datum. Dieses Datum soll verwendet werden, um den Messzeitpunkt des 2.Fragebogens zu personalisieren.

Ist es möglich, dass danach die Serienmails zum 2., 3. und 4. Fragebogen automatisiert zu individuellen Zeitpunkten abhängig von der Datumsangabe der Teilnehmenden (Platzhalter plus 8 Tage) im 1. Fragebogen versendet werden? Bislang ist vorgesehen, dass die Kontaktdaten für uns nicht im Fragebogen hinterlegt werden, sondern ausschließlich getrennt über SoSciSurvey gespeichert werden.

Ist es möglich, diesen Fall mit PHP zu programmieren?

Derzeit habe ich es so versucht, dass das Datum (Variable PI01_01) plus 8 Tage eingegeben wird für den Versand der 2. vorbereiteten Serienmail, auf einer der letzten Seiten des ersten Fragebogens mit PHP Code:
mailSchedule(false, 2, strtotime('PI01_01' +'8 day'))

Vielen Dank im Voraus für Ihre Unterstützung!

1 Answer

+1 vote
by SoSci Survey (353k points)

Sie sind schon nahe dran - nur dürfen Sie nicht versuchen, dass PHP direkt Zeiten addiert, sondern das muss strtotime() für Sie übernehmen. Also statt

mailSchedule(false, 2, strtotime('PI01_01' +'8 day'));

mailSchedule(false, 2, strtotime('PI01_01 + 8 days'));

Und weil PI01_01 kein gültiges Datum ist, müssen Sie noch value()verwenden, und den Punkt (.), welcher in PHP Strings zusammenfügt.

mailSchedule(false, 2, strtotime(value('PI01_01').' + 8 days'));

Ich würde es noch ein wenig aufteilen.

$startDate = value('PI01_01');
mailSchedule(false, 2, strtotime($startDate.' + 8 days'));

Beachten Sie, dass PHP hier mit dem Punkt nur einen String erstellt, der das "+ 8 days" enthält, und diesen dann an strtotime() übergibt.

Womöglich wird auch das noch nicht auf Anhieb funktionieren, wenn PI01_01 Den Start-Zeitpunkt nicht im richtigen Format enthält. Am besten wäre "YYYY-MM-DD HH:MM:SS". Was Sie da genau im Datensatz haben, sehen Sie durch

debug(value('PI01_01'));

Falls Sie nur den Tag abfragen, würden Sie im String auch noch die Uhrzeit ergänzen.

$startDate = value('PI01_01');
mailSchedule(false, 2, strtotime($startDate.' 08:00:00 +8 days'));
by s335460 (150 points)
Vielen Dank für die umfangreiche Beschreibung der Lösung!
by s337594 (125 points)
edited by s337594
Hallo,

danke für die tolle Lösung.

Die Lösung funktioniert sehr gut, wenn das PHP Script vor dem Zeitpunkt der ersten Serienmail ausgelöst wird.

Bei unserer Testung haben wir aber auch den Fall ausprobiert, dass das PHP Skript nach dem definierten Versandzeitpunkt der ersten Serienmail und vor dem Versandzeitpunkt von weiteren Serienmails ausgelöst wurde. Dies ist wichtig, da wir solche Fälle in unserer mehrwelligen Befragung erwarten.

Bei unserer Testung wurden bei dem oben beschriebenen Fall alle bereits zeitlich zurückliegenden Serienmails versendet. Gibt es eine Möglichkeit, die bereits zeitlich in der Vergangenheit liegenden Serienmails zurückzunehmen mit bspw. mit mailRevoke?

Vielen Dank im Voraus!
by SoSci Survey (353k points)
Hmm, schweirig. Also ja, es gibt schon eine einfache Lösung - aber die erfordert einen kleinen Filter für jedes mailSchedule():

$startDate = value('PI01_01');
$sendDate1 = strtotime($startDate.' 08:00:00 +8 days');
if ($sendDate1 >= date()) {
    mailSchedule(false, 2, $sendDate1);
}
$sendDate2 = strtotime($startDate.' 08:00:00 +9 days');
if ($sendDate2 >= date()) {
    mailSchedule(false, 3, $sendDate2);
}

u.s.w.

Ich denke aber eher darüber nach, das Verhalten von mailSchedule() generell zu ändern. Die Frage ist, ob es einen legitimen Anwendungsfall gibt, in welchem man als Anwender:in möchte, dass E-Mails auch dann versandt werden, wenn man einen vergangenen Zeitstempel an die Funktion übergibt...

Geben Sie mir doch bitte 1-2 Tage Zeit, damit ich mir darüber Gedanken machen kann. Im Moment schwebt mir vor, dass E-Mails dann nicht mehr verschickt werden - außer wenn man es in einer zusätzliche Einstellung explizit fordert.
by SoSci Survey (353k points)
Update: Wir haben auf www.soscisurvey.de ein Update installiert, welches die Funktion mailSchedule() in zwei Aspekten optimiert:

1) Wenn nicht explizit erlaubt, werden E-Mail mit vergangenem Zeitstempel nicht mehr verschickt.

2) Die Funktion strtotime() wird nicht mehr benötigt, es funktioniert nun auch...

mailSchedule(false, 2, $startDate.' 08:00:00 +8 days');

Bitte beachten Sie, dass diese Änderung auf s2survey.net und auf lokalen Befragungsservern erst in einiger Zeit verfügbar sein wird.
ago by s335460 (150 points)
edited ago by s335460
Hallo,
wir nutzen den s2survey.net Server. Ist dieses Update schon aktualisiert?
Falls ja, wie kann ich explizit erlauben, dass die E-Mails zu bestimmten Fragebögen trotzdem ankommen?

Falls Sie noch nicht aktualisiert wurde, würde ich den alten Code nehmen und hoffen, dass er in 4 Wochen noch "dasselbe" ausführt wie jetzt.

Vielen Dank!
ago by SoSci Survey (353k points)
Das Update ist seit heute (09.09.2025) 21:45 Uhr auf s2survey.net verfügbar.
ago by s335460 (150 points)
Vielen Dank für die Rückmeldung!

Und gibt es eine Möglichkeit, dass bestimmte Links trotzdem versendet werden, auch wenn sie in der Vergangenheit liegen?
ago by SoSci Survey (353k points)
Ja, vgl. https://www.soscisurvey.de/help/doku.php/de:create:functions:mailschedule - dafür gibt es die neue 'catch.up' Einstellung.
ago by s335460 (150 points)
Vielen Dank!
Leider kommt es bei Nutzung der catch.up Einstellung zu einer Fehlermeldung, dass die Funktion up nicht erkannt wird:

mailSchedule(false, 4, $startDate.' 15:00:00 +11 days', [catch.up('1209600')]);
ago by SoSci Survey (353k points)
Es handelt sich nicht um eine Funktion, sondern um einen Wert in einem Array, also

mailSchedule(false, 4, $startDate.' 15:00:00 +11 days', ['catch.up' => 1209600]);

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...