<% '======================================================================================================================= ' Order-related outbound email: the "continue your order" link and the order-details ' confirmation sent after SubmitOrderDetails. '======================================================================================================================= Class OrderMailer_Class Public Sub SendContinuationEmail(email, token) Dim continueUrl continueUrl = Routes().AppURL & "order/continue?token=" & Server.URLEncode(token) Dim mail : Set mail = NewConfiguredMail() mail.Subject = "Continue your Purple Envelope order" mail.IsBodyHTML = True mail.Body = "

Click the link below to continue your order:

" & _ "

" & H(continueUrl) & "

" & _ "

This link expires in " & H(GetAppSetting("OrderTokenExpirationHours")) & _ " hours and can only be used once.

" mail.AddRecipient "To", email mail.Send End Sub ' Best-effort: the order is already safely persisted by the time a caller reaches this - ' an SMTP hiccup here should not turn a successful submission into a failed one. Public Sub SendOrderDetailsEmail(order, model) On Error Resume Next Dim mail : Set mail = NewConfiguredMail() mail.Subject = "Your Purple Envelope order details - Jurisdiction " & order("JurisdictionNumber") mail.IsBodyHTML = True mail.Body = BuildOrderDetailsEmailBody(order, model) mail.AddRecipient "To", order("Email") mail.Send Err.Clear On Error GoTo 0 End Sub '------------------------------------------------------------------------------------------------------------------- ' Private helpers '------------------------------------------------------------------------------------------------------------------- Private Function NewConfiguredMail() Dim smtpPort : smtpPort = GetAppSetting("SmtpPort") If Not IsNumeric(smtpPort) Then smtpPort = 25 Dim mail : Set mail = CDOEmail() mail.SMTPServer = GetAppSetting("SmtpServer") mail.SMTPPort = CInt(smtpPort) mail.SMTPUsername = GetAppSetting("SmtpUsername") mail.SMTPPassword = GetAppSetting("SmtpPassword") mail.SMTPUseSSL = (LCase(GetAppSetting("SmtpUseSSL")) = "true") mail.From = GetAppSetting("SmtpFromAddress") Set NewConfiguredMail = mail End Function Private Function BuildOrderDetailsEmailBody(order, model) Dim html html = "" & _ "
" & _ "" & _ "" & _ "" & _ "" & _ "
" & _ "KCI Purple Envelope Order Confirmation" & _ "
" & _ "
Order Received
" & _ "

Thanks! We've received your order details.

" & _ "

Jurisdiction number " & H(order("JurisdictionNumber")) & "" & _ " · submitted " & H(EmailDate(model.SubmittedAt)) & "

" html = html & EmailSection("Contact Information", _ EmailRow("Contact Name", model.ContactName) & _ EmailRow("Municipality", model.Municipality) & _ EmailRow("Phone", model.Phone)) If IsTrue(model.PurpleWantsQuote) Then Dim purpleBlueProviderLine purpleBlueProviderLine = LabelPurpleBlueProvider(model.PurpleBlueProvider) If purpleBlueProviderLine = "Other" And Len(Trim(model.PurpleBlueProviderOther & "")) > 0 Then purpleBlueProviderLine = model.PurpleBlueProviderOther End If html = html & EmailSection("Purple Ballot Envelopes", _ EmailRow("Envelope stock", LabelEnvelopeStock(model.PurpleEnvelopeStock)) & _ EmailRow("Print option", LabelPrintOption(model.PurplePrintOption)) & _ EmailRow("Also wants KCI blue envelopes", EmailYesNo(model.PurpleWantsBlueEnvelopes)) & _ EmailRow("Blue envelope provider", purpleBlueProviderLine) & _ EmailRow("Print style", LabelPrintStyle(model.PurplePrintStyle)) & _ EmailRow("Color coding by", LabelColorCodingBy(model.PurpleColorCodingBy)) & _ EmailRow("Number of precincts", model.PurplePrecinctCount) & _ EmailRow("Colors requested", model.PurpleColorNames) & _ EmailRow("Track with TrackMI Ballot", EmailYesNo(model.PurpleTrackMIBallot)) & _ EmailRow("Extra envelopes requested", model.PurpleExtraEnvelopeQty)) End If If IsTrue(model.BlueWantsQuote) Then ' City/permit number are always collected for an own-organization permit - a ' permit lookup can't be done from the nonprofit authorization code alone, so ' that code is additional information when nonprofit status is Yes, not a ' replacement for city/permit number. Dim bluePermitLine bluePermitLine = "" If LabelPermitOwnership(model.BluePermitOwnership) = "My organization's permit" Then bluePermitLine = EmailRow("City of permit holder", model.BluePermitCity) & _ EmailRow("Permit number", model.BluePermitNumber) If IsTrue(model.BlueHasNonprofitStatus) Then bluePermitLine = bluePermitLine & EmailRow("Nonprofit authorization code", model.BlueNonprofitAuthCode) End If End If html = html & EmailSection("Blue AV Envelopes", _ EmailRow("Print permit", EmailYesNo(model.BluePrintPermit)) & _ EmailRow("Permit ownership", LabelPermitOwnership(model.BluePermitOwnership)) & _ EmailRow("Confirmed nonprofit status with USPS", EmailYesNo(model.BlueHasNonprofitStatus)) & _ bluePermitLine) End If If IsTrue(model.MailingWantsService) Then html = html & EmailSection("Ballot Mailing Service", _ EmailRow("Postage", LabelPostageOption(model.MailingPostageOption)) & _ EmailRow("Nonprofit status with USPS", LabelNonprofitStatus(model.MailingHasNonprofitStatus)) & _ EmailRow("Estimated quantity", model.MailingEstimatedQuantity) & _ EmailRow("Preferred pickup date", EmailDate(model.MailingPickupDate))) End If If NumOrZero(model.SecrecySleevesQty) > 0 Or NumOrZero(model.IVotedStickerRolls) > 0 Or NumOrZero(model.FutureVoterStickerRolls) > 0 Or Len(Trim(model.SpecialRequests & "")) > 0 Then html = html & EmailSection("Additional Election Items", _ EmailRow("Secrecy sleeves (quantity)", model.SecrecySleevesQty) & _ EmailRow("""I Voted"" stickers (rolls of 250)", model.IVotedStickerRolls) & _ EmailRow("""Future Voter"" stickers (rolls of 500)", model.FutureVoterStickerRolls) & _ EmailRow("Special requests", model.SpecialRequests)) End If html = html & "

Questions about this order? Just reply to this email.

" & _ "
" & _ "Purple Envelope · Addressing & Barcoding" & _ "
" BuildOrderDetailsEmailBody = html End Function Private Function EmailSection(sectionTitle, rowsHtml) If Len(rowsHtml) = 0 Then EmailSection = "" Else EmailSection = "

" & _ H(sectionTitle) & "

" & _ "" & rowsHtml & "
" End If End Function Private Function EmailRow(label, value) If Len(Trim(value & "")) = 0 Then EmailRow = "" Else EmailRow = "" & _ "" & H(label) & "" & _ "" & H(value) & "" & _ "" End If End Function ' Null-safe boolean check for gating whole sections - a section's top-level "do you want ' this?" question isn't marked required client-side, so it may be missing (Null) rather ' than explicitly false. Private Function IsTrue(v) If IsNull(v) Then IsTrue = False Else IsTrue = CBool(v) End If End Function Private Function EmailYesNo(v) If IsNull(v) Then EmailYesNo = "" ElseIf CBool(v) Then EmailYesNo = "Yes" Else EmailYesNo = "No" End If End Function Private Function EmailDate(v) If IsNull(v) Then EmailDate = "" Else On Error Resume Next EmailDate = MonthName(Month(v)) & " " & Day(v) & ", " & Year(v) If Err.Number <> 0 Then EmailDate = "" Err.Clear On Error GoTo 0 End If End Function Private Function NumOrZero(v) If IsNull(v) Or Not IsNumeric(v) Then NumOrZero = 0 Else NumOrZero = CDbl(v) End If End Function End Class Dim OrderMailer_Class__Singleton Function OrderMailer() If IsEmpty(OrderMailer_Class__Singleton) Then Set OrderMailer_Class__Singleton = New OrderMailer_Class End If Set OrderMailer = OrderMailer_Class__Singleton End Function %>