WIP on sending external email
parent
09269126d8
commit
cee8b75bad
|
@ -0,0 +1,8 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
// TODO function for reading smtp.pw from /town/docs
|
||||||
|
|
||||||
|
func sendInviteEmail() error {
|
||||||
|
// TODO
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -263,13 +263,18 @@ func _main() error {
|
||||||
updateCount()
|
updateCount()
|
||||||
render()
|
render()
|
||||||
if decision == models.SignupAccepted {
|
if decision == models.SignupAccepted {
|
||||||
err = invites.InsertInvite(inviteDB, currSignup.CleanEmail)
|
if err = invites.InsertInvite(inviteDB, currSignup.CleanEmail); err != nil {
|
||||||
if err != nil {
|
|
||||||
errorModal.SetText(fmt.Sprintf("error! failed to create invite: %s", err.Error()))
|
errorModal.SetText(fmt.Sprintf("error! failed to create invite: %s", err.Error()))
|
||||||
pages.SwitchToPage("error")
|
pages.SwitchToPage("error")
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO send invite email
|
// TODO need to get an invite back from InsertInvite so we can send it to
|
||||||
|
// the clean email using sendInviteEmail
|
||||||
|
|
||||||
|
if err = sendInviteEmail(); err != nil {
|
||||||
|
errorModal.SetText(fmt.Sprintf("error! failed to send welcome email: %s", err.Error()))
|
||||||
|
pages.SwitchToPage("error")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pages.SwitchToPage("main")
|
pages.SwitchToPage("main")
|
||||||
})
|
})
|
||||||
|
|
|
@ -16,6 +16,7 @@ import (
|
||||||
_ "embed"
|
_ "embed"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// TODO mark on user table what signup id led to the account for forensics
|
||||||
// TODO add logging like the signup tool has
|
// TODO add logging like the signup tool has
|
||||||
// TODO consider merging adduser, usermod, and createkeyfile into single createuser helper to limit sudoers list
|
// TODO consider merging adduser, usermod, and createkeyfile into single createuser helper to limit sudoers list
|
||||||
// TODO move magic key machine to static page
|
// TODO move magic key machine to static page
|
||||||
|
|
|
@ -2,10 +2,18 @@ package email
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"crypto/tls"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/smtp"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
SMTPlogin = "root@tilde.town"
|
||||||
|
SMTPHost = "smtp.zoho.com"
|
||||||
|
SMTPPort = 465
|
||||||
|
)
|
||||||
|
|
||||||
func SendLocalEmail(username, subject, body string) error {
|
func SendLocalEmail(username, subject, body string) error {
|
||||||
cmd := exec.Command("/usr/sbin/sendmail", username)
|
cmd := exec.Command("/usr/sbin/sendmail", username)
|
||||||
cmd.Stdin = bytes.NewBufferString(fmt.Sprintf("Subject: %s\n\n%s", subject, body))
|
cmd.Stdin = bytes.NewBufferString(fmt.Sprintf("Subject: %s\n\n%s", subject, body))
|
||||||
|
@ -16,3 +24,65 @@ func SendLocalEmail(username, subject, body string) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ExternalMailer struct {
|
||||||
|
Password string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewExternalMailer(pw string) *ExternalMailer {
|
||||||
|
if pw == "" {
|
||||||
|
panic("why?")
|
||||||
|
}
|
||||||
|
return &ExternalMailer{
|
||||||
|
Password: pw,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ExternalMailer) Send(address, subject, body string) error {
|
||||||
|
// TODO need to add headers to prepare message
|
||||||
|
auth := smtp.PlainAuth("", SMTPlogin, m.Password, SMTPHost)
|
||||||
|
|
||||||
|
server := fmt.Sprintf("%s:%d", SMTPHost, SMTPPort)
|
||||||
|
|
||||||
|
tlsconf := &tls.Config{
|
||||||
|
InsecureSkipVerify: true,
|
||||||
|
ServerName: server,
|
||||||
|
}
|
||||||
|
|
||||||
|
conn, err := tls.Dial("tcp", server, tlsconf)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c, err := smtp.NewClient(conn, SMTPHost)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = c.Auth(auth); err != nil {
|
||||||
|
return fmt.Errorf("auth failed for smtp: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = c.Mail("root@tilde.town"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = c.Rcpt(address); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
w, err := c.Data()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = w.Write([]byte(body))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
w.Close()
|
||||||
|
c.Quit()
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue