From 49c1af35d9df0d9af2cc0f3ae0affd231a4c88bb Mon Sep 17 00:00:00 2001 From: Niko Pitkonen Date: Mon, 4 Sep 2023 14:03:02 +0300 Subject: [PATCH] HAI-1526 Add mjml template --- README.md | 5 + .../hanke/email/EmailSenderServiceITest.kt | 16 +- .../hanke/email/EmailSenderService.kt | 40 +++ .../johtoselvitys-valmis.html.mustache | 296 +++++++++++++----- .../email/template/johtoselvitys-valmis.mjml | 138 ++++++++ .../johtoselvitys-valmis.text.mustache | 6 + .../kayttaja-lisatty-hakemus.html.mustache | 185 +++++++++-- .../template/kayttaja-lisatty-hakemus.mjml | 71 +++++ .../kayttaja-lisatty-hakemus.text.mustache | 2 + .../kayttaja-lisatty-hanke.html.mustache | 190 +++++++++-- .../template/kayttaja-lisatty-hanke.mjml | 70 +++++ .../kayttaja-lisatty-hanke.text.mustache | 2 + 12 files changed, 874 insertions(+), 147 deletions(-) create mode 100644 services/hanke-service/src/main/resources/email/template/johtoselvitys-valmis.mjml create mode 100644 services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hakemus.mjml create mode 100644 services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hanke.mjml diff --git a/README.md b/README.md index f0b44cc63..87aebe9a0 100644 --- a/README.md +++ b/README.md @@ -151,6 +151,11 @@ cd haitaton-backend When running locally, the system emails are sent to smtp4dev, which is started as part of the Docker Compose setup. You can access the sent emails by opening http://localhost:3003. +Creation of new emails is done with [mjml.io](https://mjml.io/). Either IntelliJ or Visual Studio Code plugin MJML is +needed. Once the Mjml template is done, it is converted to html. For example in Visual Studio, type >MJML:Copy HTML. + +The html output is the actual email content. + ## File scan Haitaton supports uploading of attachment files. Files are validated with ClamAV anti-malware tool. diff --git a/services/hanke-service/src/integrationTest/kotlin/fi/hel/haitaton/hanke/email/EmailSenderServiceITest.kt b/services/hanke-service/src/integrationTest/kotlin/fi/hel/haitaton/hanke/email/EmailSenderServiceITest.kt index 7b2b3e4a9..86bc210f3 100644 --- a/services/hanke-service/src/integrationTest/kotlin/fi/hel/haitaton/hanke/email/EmailSenderServiceITest.kt +++ b/services/hanke-service/src/integrationTest/kotlin/fi/hel/haitaton/hanke/email/EmailSenderServiceITest.kt @@ -153,12 +153,12 @@ class EmailSenderServiceITest : DatabaseTest() { val email = greenMail.firstReceivedMessage() val (textBody, htmlBody) = getBodiesFromHybridEmail(email) assertThat(textBody).all { - startsWith("${data.inviterName} (${data.inviterEmail}) lisäsi sinut") + contains("${data.inviterName} (${data.inviterEmail}) lisäsi sinut") contains("hankkeelle ${data.hankeNimi} (${data.hankeTunnus}).") contains("http://localhost:3001/${data.invitationToken}") } assertThat(htmlBody).all { - contains("

${data.inviterName} (${data.inviterEmail}) lisäsi sinut") + contains("${data.inviterName} (${data.inviterEmail})") contains("hankkeelle ${data.hankeNimi} (${data.hankeTunnus}).") contains("""""") } @@ -172,8 +172,8 @@ class EmailSenderServiceITest : DatabaseTest() { val email = greenMail.firstReceivedMessage() val (textBody, htmlBody) = getBodiesFromHybridEmail(email) - assertThat(textBody).startsWith("Asioija ${data.inviterEmail} lisäsi sinut") - assertThat(htmlBody).contains("

Asioija ${data.inviterEmail} lisäsi sinut") + assertThat(textBody).contains("Asioija ${data.inviterEmail}") + assertThat(htmlBody).contains("Asioija ${data.inviterEmail}") } } @@ -216,7 +216,7 @@ class EmailSenderServiceITest : DatabaseTest() { val email = greenMail.firstReceivedMessage() val (textBody, htmlBody) = getBodiesFromHybridEmail(email) assertThat(textBody).all { - startsWith("${data.inviterName} (${data.inviterEmail}) on") + contains("${data.inviterName} (${data.inviterEmail}) on") contains("tehnyt johtoselvityshakemuksen (${data.applicationIdentifier})") contains("hankkeella ${data.hankeTunnus}") contains("rooliin ${data.roleType.text()}.") @@ -226,7 +226,7 @@ class EmailSenderServiceITest : DatabaseTest() { contains("${data.inviterName} (${data.inviterEmail})") contains("johtoselvityshakemuksen (${data.applicationIdentifier})") contains("rooliin ${data.roleType.text()}") - contains("""Tarkastele hakemusta Haitattomassa: """) + contains("""""") } } @@ -238,8 +238,8 @@ class EmailSenderServiceITest : DatabaseTest() { val email = greenMail.firstReceivedMessage() val (textBody, htmlBody) = getBodiesFromHybridEmail(email) - assertThat(textBody).startsWith("Asioija ${data.inviterEmail} on tehnyt") - assertThat(htmlBody).contains("

Asioija ${data.inviterEmail} on tehnyt") + assertThat(textBody).contains("Asioija ${data.inviterEmail} on tehnyt") + assertThat(htmlBody).contains("Asioija ${data.inviterEmail} on tehnyt") } } diff --git a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/email/EmailSenderService.kt b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/email/EmailSenderService.kt index 4a748c8cf..b203f5d1b 100644 --- a/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/email/EmailSenderService.kt +++ b/services/hanke-service/src/main/kotlin/fi/hel/haitaton/hanke/email/EmailSenderService.kt @@ -10,6 +10,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.boot.convert.Delimiter import org.springframework.mail.javamail.JavaMailSender import org.springframework.mail.javamail.MimeMessageHelper +import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Service private val logger = KotlinLogging.logger {} @@ -56,6 +57,45 @@ class EmailSenderService( private val mailSender: JavaMailSender, private val emailConfig: EmailProperties, ) { + + @Scheduled(fixedDelay = 60000) + fun testSendHanke() { + sendHankeInvitationEmail( + HankeInvitationData( + recipientEmail = "haitaton@test.com", + inviterName = "Matti Meikäläinen", + inviterEmail = "foo@bar.com", + hankeTunnus = "HAI24-1", + hankeNimi = "Testi hanke", + invitationToken = "testtoken" + ) + ) + } + + @Scheduled(fixedDelay = 60000) + fun testSendHakemus() { + sendApplicationInvitationEmail( + ApplicationInvitationData( + recipientEmail = "haitaton@test.com", + inviterName = "Matti Meikäläinen", + inviterEmail = "foo@bar.com", + applicationType = ApplicationType.CABLE_REPORT, + applicationIdentifier = "JS002", + hankeTunnus = "HAI24-1", + roleType = ContactType.RAKENNUTTAJA, + ) + ) + } + + @Scheduled(fixedDelay = 60000) + fun testSendReady() { + sendJohtoselvitysCompleteEmail( + to = "haitaton@test.com", + applicationId = 3, + applicationIdentifier = "JS002" + ) + } + fun sendJohtoselvitysCompleteEmail( to: String, applicationId: Long?, diff --git a/services/hanke-service/src/main/resources/email/template/johtoselvitys-valmis.html.mustache b/services/hanke-service/src/main/resources/email/template/johtoselvitys-valmis.html.mustache index 937b4a44d..446522e70 100644 --- a/services/hanke-service/src/main/resources/email/template/johtoselvitys-valmis.html.mustache +++ b/services/hanke-service/src/main/resources/email/template/johtoselvitys-valmis.html.mustache @@ -1,83 +1,225 @@ - - - -

Hakemanne johtoselvitys {{applicationIdentifier}} on käsitelty. Lataa selvitys Haitattomasta ({{baseUrl}}/fi/hakemus/{{applicationId}}) ja tutustu sen - sisältöön huolellisesti.

+ + + + -<p>Miten onnistuimme? Kerro mielipiteesi <a - href="https://response.questback.com/isa/qbv.dll/bylink?p=x6TIpQ4sCcJt9Dv1T-AuuKa-DssX27rx6er2ohTVVipooPTA8H0u-weNFWY9GsVI0">täällä</a>. -</p> + + + + + + + + + + + + + +
+
+ + + + + + +
+
+ + + + + + +
+
+ + +
+
+
+
+ + + + + + +
+
+ + + + + + + + + + + + + + + +
+
+ Haitaton: Johtoselvitys {{applicationIdentifier}} +
+
+ Hakemanne johtoselvitys {{applicationIdentifier}} on käsitelty. Lataa selvitys Haitattomasta {{baseUrl}}/fi/hakemus/{{applicationId}} ja tutustu sen sisältöön huolellisesti. +
+
+ Miten onnistuimme? Kerro mielipiteesi täällä. +
+
+ Ystävällisin terveisin,

Helsingin kaupunkiympäristön asukas- ja yrityspalvelut
Alueidenkäyttö ja -valvonta
Johtotietopalvelu
Puh. 09 310 31940
johtotietopalvelu@hel.fi +
+
+
+
+ + + + + + +
+
+ + + + + + + + + + + + + + + +
+
+ Ledningsutredning {{applicationIdentifier}} +
+
+ Ledningsutredningen {{applicationIdentifier}} ni ansökt om har behandlats. Ladda ned utredningen från Haitaton {{baseUrl}}/sv/ansokan/{{applicationId}} och läs innehållet i den noggrannt. +
+
+ Hur lyckades vi? Ge din åsikt här. +
+
+ Med vänlig hälsning,

Helsingfors stadsmiljös boende- och företagstjänster
Användning och tillsyn av områden
Ledningstjänsten
Tfn 09 310 31940
johtotietopalvelu@hel.fi +
+
+
+
+ + + + + + +
+
+ + + + + + + + + + + + + + + +
+
+ Cable report {{applicationIdentifier}} +
+
+ Cable report {{applicationIdentifier}} that you requested has been processed. Download the report via Haitaton {{baseUrl}}/en/application/{{applicationId}} and read it carefully. +
+
+ How did we do? Please share your opinion here. +
+
+ Kind regards,

Helsinki Urban Environment Resident and Business Services
Land Use and Monitoring
Cable Location Service
Tel. +358 9 310 31940
johtotietopalvelu@hel.fi
+
+
+
+
+ + + + + + +
+
+ + + + + + + + + + + + +
+
+ + +

+
+ © Helsingin kaupunki 2023 +
+
+
+
diff --git a/services/hanke-service/src/main/resources/email/template/johtoselvitys-valmis.mjml b/services/hanke-service/src/main/resources/email/template/johtoselvitys-valmis.mjml new file mode 100644 index 000000000..a3e8a7310 --- /dev/null +++ b/services/hanke-service/src/main/resources/email/template/johtoselvitys-valmis.mjml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + Haitaton: Johtoselvitys + {{applicationIdentifier}} + + + Hakemanne johtoselvitys {{applicationIdentifier}} on käsitelty. Lataa selvitys Haitattomasta {{baseUrl}}/fi/hakemus/{{applicationId}} + ja + tutustu sen + sisältöön huolellisesti. + + + Miten onnistuimme? Kerro mielipiteesi + täällä. + + + Ystävällisin terveisin, +
+
+ Helsingin kaupunkiympäristön asukas- ja yrityspalvelut +
+ Alueidenkäyttö ja -valvonta +
+ Johtotietopalvelu +
+ Puh. 09 310 31940 +
+ johtotietopalvelu@hel.fi +
+
+
+ + + + Haitaton: Ledningsutredning {{applicationIdentifier}} + + + Ledningsutredningen {{applicationIdentifier}} ni ansökt om har behandlats. Ladda ned utredningen + från Haitaton + + {{baseUrl}}/sv/ansokan/{{applicationId}} + + och läs + innehållet i den noggrannt. + + + Hur lyckades vi? Ge din åsikt + här. + + + Med vänlig hälsning, +
+
+ Helsingfors stadsmiljös boende- och företagstjänster +
+ Användning och tillsyn av områden +
+ Ledningstjänsten +
+ Tfn 09 310 31940 +
+ johtotietopalvelu@hel.fi +
+
+
+ + + + Haitaton: Cable report {{applicationIdentifier}} + + + Cable report {{applicationIdentifier}} that you requested has been processed. Download the + report + via Haitaton + {{baseUrl}}/en/application/{{applicationId}} + and read it carefully. + + + How did we do? Please share your opinion + here. + + + Kind regards, +
+
+ Helsinki Urban Environment Resident and Business Services +
+ Land Use and Monitoring +
+ Cable Location Service +
+ Tel. +358 9 310 31940 +
+ johtotietopalvelu@hel.fi +
+
+
+
+ + + + + + + + + + © Helsingin + kaupunki 2023 + + + +
+
diff --git a/services/hanke-service/src/main/resources/email/template/johtoselvitys-valmis.text.mustache b/services/hanke-service/src/main/resources/email/template/johtoselvitys-valmis.text.mustache index 00fdd68d9..16860dc6a 100644 --- a/services/hanke-service/src/main/resources/email/template/johtoselvitys-valmis.text.mustache +++ b/services/hanke-service/src/main/resources/email/template/johtoselvitys-valmis.text.mustache @@ -1,3 +1,5 @@ +Johtoselvitys {{applicationIdentifier}} + Hakemanne johtoselvitys {{applicationIdentifier}} on käsitelty. Lataa selvitys Haitattomasta ({{baseUrl}}/fi/hakemus/{{applicationId}}) ja tutustu sen sisältöön huolellisesti. Miten onnistuimme? Kerro mielipiteesi täällä: https://response.questback.com/isa/qbv.dll/bylink?p=x6TIpQ4sCcJt9Dv1T-AuuKa-DssX27rx6er2ohTVVipooPTA8H0u-weNFWY9GsVI0. @@ -10,6 +12,8 @@ Puh. 09 310 31940 johtotietopalvelu@hel.fi +Ledningsutredning {{applicationIdentifier}} + Ledningsutredningen {{applicationIdentifier}} ni ansökt om har behandlats. Ladda ned utredningen från Haitaton ({{baseUrl}}/sv/ansokan/{{applicationId}}) och läs innehållet i den noggrannt. Hur lyckades vi? Ge din åsikt här: https://response.questback.com/isa/qbv.dll/bylink?p=x6TIpQ4sCcJt9Dv1T-AuuKa-DssX27rx6er2ohTVVipooPTA8H0u-weNFWY9GsVI0. @@ -22,6 +26,8 @@ Tfn 09 310 31940 johtotietopalvelu@hel.fi +Cable report {{applicationIdentifier}} + Cable report {{applicationIdentifier}} that you requested has been processed. Download the report via Haitaton ({{baseUrl}}/en/application/{{applicationId}}) and read it carefully. How did we do? Please share your opinion here: https://response.questback.com/isa/qbv.dll/bylink?p=x6TIpQ4sCcJt9Dv1T-AuuKa-DssX27rx6er2ohTVVipooPTA8H0u-weNFWY9GsVI0. diff --git a/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hakemus.html.mustache b/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hakemus.html.mustache index 01a52f954..619d6de11 100644 --- a/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hakemus.html.mustache +++ b/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hakemus.html.mustache @@ -1,38 +1,159 @@ - - - + + + + -<p>{{inviterInfo}} on tehnyt {{applicationType}} ({{applicationIdentifier}}) - hankkeella {{hankeTunnus}}, ja lähettänyt sen käsittelyyn. Sinut on määritetty hakemuksella - rooliin {{recipientRole}}. - Tarkastele hakemusta Haitattomassa: <a href="{{baseUrl}}">{{baseUrl}}</a> -</p> + + + + + + + + + + + + + +
+
+ + + + + + +
+
+ + + + + + +
+
+ + +
+
+
+
+ + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+ Haitaton: Sinut on lisätty hakemukselle {{applicationIdentifier}} +
+
+ {{inviterInfo}} on tehnyt {{applicationType}} ({{applicationIdentifier}}) hankkeella {{hankeTunnus}}, ja lähettänyt sen käsittelyyn. Sinut on määritetty hakemuksella rooliin {{recipientRole}}. Tarkastele hakemusta Haitattomassa {{baseUrl}} +
+
+ Löydät hakemuksesi siirtymällä etusivulta Omiin hankkeisiin ja valitsemalla sieltä oikean hankkeen. Avaa listanäkymässä hankkeen tiedot ja valitse "Näytä hankkeen hakemukset". +
+
+ Haitaton on Helsingin kaupungin asiointijärjestelmä yleisille alueille sijoittuvien hankkeiden edistämiseen ja haittojen hallintaan. +
+
+ Tämä on automaattinen sähköposti – älä vastaa tähän viestiin. +
+
+ Ystävällisin terveisin,

Helsingin kaupungin kaupunkiympäristön toimiala
Haitaton-asiointi
haitaton@hel.fi +
+
+
+
+ + + + + + +
+
+ + + + + + + + + + + + +
+
+ + +

+
+ © Helsingin kaupunki 2023 +
+
+
+
diff --git a/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hakemus.mjml b/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hakemus.mjml new file mode 100644 index 000000000..6d4692831 --- /dev/null +++ b/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hakemus.mjml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + Haitaton: Sinut on lisätty hakemukselle {{applicationIdentifier}} + + + {{inviterInfo}} on tehnyt {{applicationType}} ({{applicationIdentifier}}) hankkeella + {{hankeTunnus}}, ja lähettänyt sen käsittelyyn. Sinut on määritetty hakemuksella rooliin + {{recipientRole}}. Tarkastele hakemusta Haitattomassa + {{baseUrl}} + + + Löydät hakemuksesi siirtymällä etusivulta Omiin hankkeisiin ja valitsemalla sieltä oikean + hankkeen. + Avaa listanäkymässä hankkeen tiedot ja valitse "Näytä hankkeen hakemukset". + + + Haitaton on Helsingin kaupungin asiointijärjestelmä yleisille alueille sijoittuvien hankkeiden + edistämiseen ja haittojen hallintaan. + + + Tämä on automaattinen sähköposti – älä vastaa tähän viestiin. + + + Ystävällisin terveisin, +
+
+ Helsingin kaupungin kaupunkiympäristön toimiala +
+ Haitaton-asiointi +
+ haitaton@hel.fi +
+
+
+ + + + + + + + + + © Helsingin + kaupunki 2023 + + + +
+
diff --git a/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hakemus.text.mustache b/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hakemus.text.mustache index 3b27d2a9b..0ac1350ba 100644 --- a/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hakemus.text.mustache +++ b/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hakemus.text.mustache @@ -1,3 +1,5 @@ +Haitaton: Sinut on lisätty hakemukselle {{applicationIdentifier}} + {{inviterInfo}} on tehnyt {{applicationType}} ({{applicationIdentifier}}) hankkeella {{hankeTunnus}}, ja lähettänyt sen käsittelyyn. Sinut on määritetty hakemuksella rooliin {{recipientRole}}. Tarkastele hakemusta Haitattomassa: {{baseUrl}} Löydät hakemuksesi siirtymällä etusivulta Omiin hankkeisiin ja valitsemalla sieltä oikean hankkeen. Avaa listanäkymässä hankkeen tiedot ja valitse “Näytä hankkeen hakemukset”. diff --git a/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hanke.html.mustache b/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hanke.html.mustache index 2b3e89b96..227569aaf 100644 --- a/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hanke.html.mustache +++ b/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hanke.html.mustache @@ -1,35 +1,165 @@ - - - + + + + -<p>{{inviterInfo}} lisäsi sinut hankkeelle <b>{{hankeNimi}} ({{hankeTunnus}})</b>. Tunnistaudu - Haitattomaan - alla olevan linkin kautta.<br/> - <a href="{{baseUrl}}/{{invitationToken}}">{{baseUrl}}/{{invitationToken}}</a> -</p> + + + + + + + + + + + + + +
+
+ + + + + + +
+
+ + + + + + +
+
+ + +
+
+
+
+ + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ Haitaton: Sinut on lisätty hankkeelle {{hankeTunnus}} +
+
+ {{inviterInfo}} lisäsi sinut hankkeelle {{hankeNimi}} ({{hankeTunnus}}). Tunnistaudu Haitattomaan alla olevan linkin kautta. +
+
+
+ Löydät hankkeesi Haitattoman etusivun Omat hankkeet -osion alta hankkeen nimellä. +
+
+ Haitaton on Helsingin kaupungin asiointijärjestelmä yleisille alueille sijoittuvien hankkeiden edistämiseen ja haittojen hallintaan. +
+
+ Tämä on automaattinen sähköposti – älä vastaa tähän viestiin. +
+
+ Ystävällisin terveisin,

Helsingin kaupungin kaupunkiympäristön toimiala
Haitaton-asiointi
haitaton@hel.fi +
+
+
+
+ + + + + + +
+
+ + + + + + + + + + + + +
+
+ + +

+
+ © Helsingin kaupunki 2023 +
+
+
+
+ diff --git a/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hanke.mjml b/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hanke.mjml new file mode 100644 index 000000000..7ee1b9894 --- /dev/null +++ b/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hanke.mjml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + Haitaton: Sinut on lisätty hankkeelle {{hankeTunnus}} + + + {{inviterInfo}} lisäsi sinut hankkeelle {{hankeNimi}} ({{hankeTunnus}}). Tunnistaudu + Haitattomaan alla olevan linkin kautta. + + + Haitattomaan + + + Löydät hankkeesi Haitattoman etusivun Omat hankkeet -osion alta hankkeen nimellä. + + + Haitaton on Helsingin kaupungin asiointijärjestelmä yleisille alueille sijoittuvien hankkeiden + edistämiseen ja haittojen hallintaan. + + + Tämä on automaattinen sähköposti – älä vastaa tähän viestiin. + + + Ystävällisin terveisin, +
+
+ Helsingin kaupungin kaupunkiympäristön toimiala +
+ Haitaton-asiointi +
+ haitaton@hel.fi +
+
+
+ + + + + + + + + + © Helsingin + kaupunki 2023 + + + +
+
diff --git a/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hanke.text.mustache b/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hanke.text.mustache index 244abc486..f099722c6 100644 --- a/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hanke.text.mustache +++ b/services/hanke-service/src/main/resources/email/template/kayttaja-lisatty-hanke.text.mustache @@ -1,3 +1,5 @@ +Haitaton: Sinut on lisätty hankkeelle {{hankeTunnus}} + {{inviterInfo}} lisäsi sinut hankkeelle {{hankeNimi}} ({{hankeTunnus}}). Tunnistaudu Haitattomaan alla olevan linkin kautta. {{baseUrl}}/{{invitationToken}}