82 lines
2.8 KiB
Go
82 lines
2.8 KiB
Go
package mail
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// SendLicense delivers the blob inline. It is signed public data, not a secret —
|
|
// it is useless on any instance other than the one it names.
|
|
func (s Sender) SendLicense(to, instanceName, blob string) error {
|
|
return s.sendTemplate(to, "", "license", struct {
|
|
InstanceName string
|
|
Blob string
|
|
}{instanceName, blob})
|
|
}
|
|
|
|
// SendInstanceReady tells a customer their cloud instance exists, where it is,
|
|
// and when its licence runs out.
|
|
//
|
|
// The expiry is stated here rather than only in a later reminder: a Free licence
|
|
// that quietly expires in a month is a surprise, and the first email is the one
|
|
// people keep.
|
|
func (s Sender) SendInstanceReady(to, instanceName, loginURL string, expires time.Time) error {
|
|
return s.sendTemplate(to, "", "instanceready", struct {
|
|
InstanceName string
|
|
LoginURL string
|
|
Expires time.Time
|
|
}{instanceName, loginURL, expires})
|
|
}
|
|
|
|
// SendRenewed confirms a renewal and states the new date.
|
|
func (s Sender) SendRenewed(to, instanceName string, expires time.Time) error {
|
|
return s.sendTemplate(to, "", "renewed", struct {
|
|
InstanceName string
|
|
Expires time.Time
|
|
}{instanceName, expires})
|
|
}
|
|
|
|
// SendExpiring is the renew-now nudge, seven days out.
|
|
func (s Sender) SendExpiring(to, instanceName, portalURL string, expires time.Time) error {
|
|
return s.sendTemplate(to, "", "expiring", struct {
|
|
InstanceName string
|
|
PortalURL string
|
|
Expires time.Time
|
|
}{instanceName, portalURL, expires})
|
|
}
|
|
|
|
// SendExpired states plainly what has stopped and what happens next.
|
|
//
|
|
// It names the deletion date rather than a vague warning: the whole point of the
|
|
// sequence is that nobody loses an instance without having been told a date. A
|
|
// zero deleteOn means the reaper is disabled, and then no date is claimed.
|
|
func (s Sender) SendExpired(to, instanceName, portalURL string, deleteOn time.Time) error {
|
|
return s.sendTemplate(to, "", "expired", struct {
|
|
InstanceName string
|
|
PortalURL string
|
|
DeleteOn time.Time
|
|
}{instanceName, portalURL, deleteOn})
|
|
}
|
|
|
|
// SendDeletionWarning is the final countdown, sent at seven days and one day.
|
|
func (s Sender) SendDeletionWarning(to, instanceName, portalURL string, deleteOn time.Time, daysLeft int) error {
|
|
when := fmt.Sprintf("in %d days", daysLeft)
|
|
if daysLeft <= 1 {
|
|
when = "tomorrow"
|
|
}
|
|
return s.sendTemplate(to, "", "deletionwarning", struct {
|
|
InstanceName string
|
|
PortalURL string
|
|
When string
|
|
DeleteOn time.Time
|
|
}{instanceName, portalURL, when, deleteOn})
|
|
}
|
|
|
|
// SendLinkReminder chases a self-hosted customer who paid but never linked.
|
|
func (s Sender) SendLinkReminder(to, instanceName string) error {
|
|
return s.sendTemplate(to, "", "linkreminder", struct {
|
|
InstanceName string
|
|
PortalURL string
|
|
}{instanceName, s.PublicURL})
|
|
}
|