Skip to content

Commit b4f2915

Browse files
committed
added email
1 parent 26ab9dc commit b4f2915

File tree

5 files changed

+68
-2
lines changed

5 files changed

+68
-2
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
your ${brand} verification code is ${code}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" style="background:#fff!important"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width"><title>your ${brand} verification code is ${code}</title><style>@media only screen{html{min-height:100%;background:#e9edf0}}@media only screen and (max-width:488px){table.body img{width:auto;height:auto}table.body center{min-width:0!important}table.body .container{width:95%!important}table.body .columns{height:auto!important;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding-left:8px!important;padding-right:8px!important}table.body .collapse .columns{padding-left:0!important;padding-right:0!important}th.small-6{display:inline-block!important;width:50%!important}th.small-12{display:inline-block!important;width:100%!important}}</style></head><body style="-moz-box-sizing:border-box;-ms-text-size-adjust:100%;-webkit-box-sizing:border-box;-webkit-text-size-adjust:100%;Margin:0;background:#fff!important;box-sizing:border-box;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;line-height:1.6;margin:0;min-width:100%;padding:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;width:100%!important"><table class="body" style="Margin:0;background:#fff!important;border-collapse:collapse;border-spacing:0;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;height:100%;line-height:1.6;margin:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;width:100%"><tr style="padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top"><td class="center" align="center" valign="top" style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0;border-collapse:collapse!important;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;hyphens:auto;line-height:1.6;margin:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;word-wrap:break-word"><table class="wrapper header" align="center" style="border-collapse:collapse;border-spacing:0;margin-bottom:16px;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;width:100%"><tbody><tr style="padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top"><td class="wrapper-inner" style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0;border-collapse:collapse!important;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;hyphens:auto;line-height:1.6;margin:0;padding-bottom:20px;padding-left:0;padding-right:0;padding-top:20px;text-align:left;vertical-align:top;word-wrap:break-word"><table align="center" class="container" style="Margin:0 auto;background:#fff;border-collapse:collapse;border-spacing:0;margin:0 auto;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:inherit;vertical-align:top;width:480px"><tbody><tr style="padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top"><td style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0;border-collapse:collapse!important;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;hyphens:auto;line-height:1.6;margin:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;word-wrap:break-word"><table class="row collapse" style="border-collapse:collapse;border-spacing:0;display:table;padding:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;position:relative;text-align:left;vertical-align:top;width:100%"><tbody><tr style="padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top"><th class="small-6 large-6 columns first" style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0 auto;border-collapse:collapse!important;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;hyphens:auto;line-height:1.6;margin:0 auto;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;width:244px;word-wrap:break-word"><table style="border-collapse:collapse;border-spacing:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;width:100%"><tbody><tr style="padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top"><th style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0;border-collapse:collapse!important;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;hyphens:auto;line-height:1.6;margin:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;word-wrap:break-word"><p style="Margin:0;Margin-bottom:24px;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:80%;font-weight:300;line-height:1.6;margin:0;margin-bottom:24px;padding-bottom:0;padding-left:8px;padding-right:8px;padding-top:15px;text-align:left"><img class="logo" src="${brand_logo}" style="-ms-interpolation-mode:bicubic;clear:both;display:block;height:20px;max-width:100%;outline:0;text-decoration:none;width:auto"></p></th></tr></tbody></table></th><th class="small-6 large-6 columns last" style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0 auto;border-collapse:collapse!important;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;hyphens:auto;line-height:1.6;margin:0 auto;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;width:244px;word-wrap:break-word"><table style="border-collapse:collapse;border-spacing:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;width:100%"><tbody><tr style="padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top"><th style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0;border-collapse:collapse!important;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;hyphens:auto;line-height:1.6;margin:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;word-wrap:break-word"><p class="text-right" style="Margin:0;Margin-bottom:24px;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:80%;font-weight:300;line-height:1.6;margin:0;margin-bottom:24px;padding-bottom:0;padding-left:8px;padding-right:8px;padding-top:15px;text-align:right"><a href="${brand_url}" style="color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-weight:400;line-height:1.6;padding:0;text-align:left;text-decoration:none;text-transform:uppercase">${brand_label_url}</a></p></th></tr></tbody></table></th></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table><table align="center" class="container" style="Margin:0 auto;background:#fff;border-collapse:collapse;border-spacing:0;margin:0 auto;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:inherit;vertical-align:top;width:480px"><tbody><tr style="padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top"><td style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0;border-collapse:collapse!important;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;hyphens:auto;line-height:1.6;margin:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;word-wrap:break-word"><table class="row" style="border-collapse:collapse;border-spacing:0;display:table;padding:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;position:relative;text-align:left;vertical-align:top;width:100%"><tbody><tr style="padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top"><th class="small-12 large-12 columns first last" style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0 auto;border-collapse:collapse!important;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;hyphens:auto;line-height:1.6;margin:0 auto;padding-bottom:16px;padding-left:8px;padding-right:8px;padding-top:0;text-align:left;vertical-align:top;width:472px;word-wrap:break-word"><table style="border-collapse:collapse;border-spacing:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;width:100%"><tbody><tr style="padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top"><th style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0;border-collapse:collapse!important;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;hyphens:auto;line-height:1.6;margin:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;word-wrap:break-word"><h1 style="Margin:0;Margin-bottom:32px;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:32px;font-weight:300;line-height:1.6;margin:0;margin-bottom:32px;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:center;word-wrap:normal">Verify login</h1><p style="Margin:0;Margin-bottom:24px;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;line-height:1.6;margin:0;margin-bottom:24px;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left"><strong>${email}</strong> was used to login into ${brand}. Enter this code to verify your email and login into your account.</p><table class="spacer" style="border-collapse:collapse;border-spacing:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;width:100%"><tbody><tr style="padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top"><td height="16" style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0;border-collapse:collapse!important;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;hyphens:auto;line-height:16px;margin:0;mso-line-height-rule:exactly;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;word-wrap:break-word">&nbsp;</td></tr></tbody></table><p class="code" style="Margin:0;Margin-bottom:24px;color:#2391d3;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:48px;font-weight:200;letter-spacing:2px;line-height:1.6;margin:0;margin-bottom:24px;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:center">${code}</p><table class="spacer" style="border-collapse:collapse;border-spacing:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;width:100%"><tbody><tr style="padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top"><td height="16" style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0;border-collapse:collapse!important;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;hyphens:auto;line-height:16px;margin:0;mso-line-height-rule:exactly;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;word-wrap:break-word">&nbsp;</td></tr></tbody></table><p class="small" style="Margin:0;Margin-bottom:24px;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:80%;font-weight:300;line-height:1.36;margin:0;margin-bottom:16px;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left">If you have any questions, please <a href="${support}" style="color:#2391d3;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-weight:300;line-height:1.6;padding:0;text-align:left;text-decoration:none">contact us</a>.</p></th><th class="expander" style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0;border-collapse:collapse!important;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;hyphens:auto;line-height:1.6;margin:0;padding:0!important;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;visibility:hidden;width:0;word-wrap:break-word"></th></tr></tbody></table></th></tr></tbody></table></td></tr></tbody></table><table align="center" class="container footer" style="Margin:0 auto;background:#fff;border-collapse:collapse;border-spacing:0;margin:0 auto;margin-top:32px;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:inherit;vertical-align:top;width:480px"><tbody><tr style="padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top"><td style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0;border-collapse:collapse!important;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:16px;font-weight:300;hyphens:auto;line-height:1.6;margin:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:left;vertical-align:top;word-wrap:break-word"><hr style="border:1px solid #e9edf0;border-bottom:0;margin:32px auto;max-width:100%"><p style="Margin:0;Margin-bottom:24px;color:#42474a;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-size:80%;font-weight:400;line-height:1.6;margin:0;margin-bottom:24px;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;text-align:center"><a href="${legal}" style="color:#adafb0;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-weight:400;line-height:1.6;padding:0;text-align:left;text-decoration:none;text-transform:uppercase">Privacy policy and terms of use</a> <span>&middot;</span> <a href="mailto:${misuse}" style="color:#adafb0;font-family:BlinkMacSystemFont,-apple-system,Helvetica Neue,Arial,sans-serif;font-weight:400;line-height:1.6;padding:0;text-align:left;text-decoration:none;text-transform:uppercase">Report Misuse</a><br>${copyright}. ALL RIGHTS RESERVED.</p></td></tr></tbody></table></td></tr></table><div style="display:none;white-space:nowrap;font:15px courier;line-height:0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div></body></html>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[${brand_logo}]
2+
3+
${brand_label_url} [${brand_url}]
4+
5+
VERIFY LOGIN
6+
${email} was used to login into ${brand}. Enter this code to verify your email
7+
and login into your account.
8+
9+
${code}
10+
11+
If you have any questions, please contact us [${support}].
12+
13+
14+
--------------------------------------------------------------------------------
15+
16+
Privacy policy and terms of use [${legal}] · Report Misuse [${misuse}]
17+
${copyright}. ALL RIGHTS RESERVED.

services/brig/src/Brig/User/Email.hs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ sendVerificationMail to pair loc = do
5454
Email.sendMail $ renderVerificationMail mail tpl branding
5555

5656
sendLoginVerificationMail :: Email -> Code.Value -> Maybe Locale -> (AppIO r) ()
57-
sendLoginVerificationMail _ _ _ = pure () --todo(leif): implement
57+
sendLoginVerificationMail email code mbLocale = do
58+
tpl <- verificationLoginEmail . snd <$> userTemplates mbLocale
59+
branding <- view templateBranding
60+
Email.sendMail $ renderSecondFactorVerificationEmail tpl email code branding
5861

5962
sendActivationMail :: Email -> Name -> ActivationPair -> Maybe Locale -> Maybe UserIdentity -> (AppIO r) ()
6063
sendActivationMail to name pair loc ident = do
@@ -168,6 +171,33 @@ renderDeletionEmail DeletionEmailTemplate {..} DeletionEmail {..} branding =
168171
replace2 "code" = code
169172
replace2 x = x
170173

174+
renderSecondFactorVerificationEmail ::
175+
SecondFactorVerificationEmailTemplate ->
176+
Email ->
177+
Code.Value ->
178+
TemplateBranding ->
179+
Mail
180+
renderSecondFactorVerificationEmail SecondFactorVerificationEmailTemplate {..} email codeValue branding =
181+
(emptyMail from)
182+
{ mailTo = [to],
183+
mailHeaders =
184+
[ ("Subject", toStrict subj),
185+
("X-Zeta-Purpose", "SecondFactorVerification"),
186+
("X-Zeta-Code", code)
187+
],
188+
mailParts = [[plainPart txt, htmlPart html]]
189+
}
190+
where
191+
from = Address (Just sndFactorVerificationEmailSenderName) (fromEmail sndFactorVerificationEmailSender)
192+
to = Address Nothing (fromEmail email)
193+
txt = renderTextWithBranding sndFactorVerificationEmailBodyText replace branding
194+
html = renderHtmlWithBranding sndFactorVerificationEmailBodyHtml replace branding
195+
subj = renderTextWithBranding sndFactorVerificationEmailSubject replace branding
196+
code = Ascii.toText (fromRange (Code.asciiValue codeValue))
197+
replace "email" = fromEmail email
198+
replace "code" = code
199+
replace x = x
200+
171201
-------------------------------------------------------------------------------
172202
-- Verification Email
173203

services/brig/src/Brig/User/Template.hs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ module Brig.User.Template
2929
DeletionSmsTemplate (..),
3030
DeletionEmailTemplate (..),
3131
NewClientEmailTemplate (..),
32+
SecondFactorVerificationEmailTemplate (..),
3233
loadUserTemplates,
3334

3435
-- * Re-exports
@@ -56,7 +57,8 @@ data UserTemplates = UserTemplates
5657
loginCall :: !LoginCallTemplate,
5758
deletionSms :: !DeletionSmsTemplate,
5859
deletionEmail :: !DeletionEmailTemplate,
59-
newClientEmail :: !NewClientEmailTemplate
60+
newClientEmail :: !NewClientEmailTemplate,
61+
verificationLoginEmail :: !SecondFactorVerificationEmailTemplate
6062
}
6163

6264
data ActivationSmsTemplate = ActivationSmsTemplate
@@ -143,6 +145,14 @@ data NewClientEmailTemplate = NewClientEmailTemplate
143145
newClientEmailSenderName :: !Text
144146
}
145147

148+
data SecondFactorVerificationEmailTemplate = SecondFactorVerificationEmailTemplate
149+
{ sndFactorVerificationEmailSubject :: !Template,
150+
sndFactorVerificationEmailBodyText :: !Template,
151+
sndFactorVerificationEmailBodyHtml :: !Template,
152+
sndFactorVerificationEmailSender :: !Email,
153+
sndFactorVerificationEmailSenderName :: !Text
154+
}
155+
146156
loadUserTemplates :: Opt.Opts -> IO (Localised UserTemplates)
147157
loadUserTemplates o = readLocalesDir defLocale templateDir "user" $ \fp ->
148158
UserTemplates
@@ -217,6 +227,13 @@ loadUserTemplates o = readLocalesDir defLocale templateDir "user" $ \fp ->
217227
<*> pure emailSender
218228
<*> readText fp "email/sender.txt"
219229
)
230+
<*> ( SecondFactorVerificationEmailTemplate
231+
<$> readTemplate fp "email/verification-login-subject.txt"
232+
<*> readTemplate fp "email/verification-login.txt"
233+
<*> readTemplate fp "email/verification-login.html"
234+
<*> pure emailSender
235+
<*> readText fp "email/sender.txt"
236+
)
220237
where
221238
gOptions = Opt.general $ Opt.emailSMS o
222239
uOptions = Opt.user $ Opt.emailSMS o

0 commit comments

Comments
 (0)