Files
yggmail/internal/welcome/welcome.go
Tristan B. Velloza Kildaire 8bf3ba5f47 Onboarding, Sent box and Outbox (#45)
* main

- Set

* Working

* Welcome

- Added welcome message generation

* Smtpsender

- On successful SMTP send create the "Sent" box and then
try move from "Outbox" to "Sent"

* Sent box

- Create the mailbox in `main.go` and not every time we try move from `Outbox` to `Sent`

* Use logegr

* USer

- Added logger pointer (and made use of it)
- Disallow renaming or deletion of 'Sent'

* When creating a new user set it up with logger

* Encoded message

* Added tests

* Send a welcome mail on startup (soon to mke it only happen once)

* try set flags

* Onboarding flag set

* Sender
- Removed testing code

* Welcome

- Moved welcomer code

* Cleaned up

* Added more

* renamed package

* Removed comment

* welcome

- FIxed variable names

* welcome

- Removed semi-colons
- Fixed imports

* welcome

- Ran `gofmt`

* welcome test

- Fixed up

* h

* main

- Ran `gofmt`

* Main

- Fxied

* Welcome

- Foxed name

* Added `.gitignore`

* Mailbox

- Disabled print logging

* Fixed

* fixedg

* fixe and use `%v`
2025-12-20 14:30:37 +00:00

110 lines
2.8 KiB
Go

package welcome
import (
"bytes"
"fmt"
"github.com/emersion/go-message"
"github.com/neilalexander/yggmail/internal/storage"
"log"
)
const (
WEBSITE_URL = "https://github.com/neilalexander/yggmail"
CODE_URL = "https://github.com/neilalexander/yggmail"
)
func Onboard(user string, storage storage.Storage, log *log.Logger) {
// Fetch onboarding status
if f, e := storage.ConfigGet("onboarding_done"); e == nil {
// If we haven't onboarded yet
if len(f) == 0 {
log.Printf("Performing onboarding...\n")
// takes in addr and output writer
welcomeMsg, e := welcomeMessageFor(user)
if e != nil {
log.Println("Failure to generate welcome message")
}
var welcomeId int
if id, e := storage.MailCreate("INBOX", welcomeMsg); e != nil {
log.Printf("Failed to store welcome message: %v\n", e)
panic("See above")
} else {
welcomeId = id
}
if storage.MailUpdateFlags("INBOX", welcomeId, false, false, false, false) != nil {
panic("Could not set flags on onboarding message")
}
// set flag to never do it again
if storage.ConfigSet("onboarding_done", "true") != nil {
panic("Error storing onboarding flag")
}
log.Printf("Onboarding done\n")
} else {
log.Printf("Onboarding not required\n")
}
} else {
panic("Error fetching onboarding status")
}
}
func welcomeMessageFor(yourYggMailAddr string) ([]byte, error) {
var hdr = welcomeTo(yourYggMailAddr)
var buff = bytes.NewBuffer([]byte{})
// writer writes to underlying writer (our buffer)
// but returns a writer just for the body part
// (it will encode header to underlying writer
// first)
msgWrt, e := message.CreateWriter(buff, hdr)
if e != nil {
return nil, e
}
var formattedBody = fmt.Sprintf(welcomeBody, yourYggMailAddr, WEBSITE_URL, CODE_URL)
if _, e := msgWrt.Write([]byte(formattedBody)); e != nil {
return nil, e
}
// var ent, e = message.New(hdr, body_rdr)
return buff.Bytes(), nil
}
var welcomeSubject = "Welcome to Yggmail!"
var welcomeBody = `
Hey <b>%s</b>!
We'd like to welcome you to Yggmail!
You're about to embark in both a revolution and an
evolution as you know it. The revolution is that this
mailing system uses the new and experimental Yggdrasil
internet routing system, the evolution is that it's
good old email as you know it.
Want to learn more? See the <a href="%s">website</a>
Thinking of contributing; we'd be more than happy
to work together. Our project is hosted on <a href="%s">GitHub</a>.
`
func welcomeTo(yourYggMailAddr string) message.Header {
// header would be a nice preview of what to expect
// of the message
var welcomeHdr = message.Header{}
welcomeHdr.Add("From", "Yggmail Team")
welcomeHdr.Add("To", yourYggMailAddr+"@yggmail")
welcomeHdr.Add("Subject", welcomeSubject)
// FIXME: Add content-type entry here
fmt.Printf("Generated welcome mesg '%v'\n", welcomeHdr)
return welcomeHdr
}