forked from tildetown/town
		
	WIP on sending external email
This commit is contained in:
		
							parent
							
								
									09269126d8
								
							
						
					
					
						commit
						cee8b75bad
					
				
							
								
								
									
										8
									
								
								cmd/review/email.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								cmd/review/email.go
									
									
									
									
									
										Normal file
									
								
							@ -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()
 | 
			
		||||
		render()
 | 
			
		||||
		if decision == models.SignupAccepted {
 | 
			
		||||
			err = invites.InsertInvite(inviteDB, currSignup.CleanEmail)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
			if err = invites.InsertInvite(inviteDB, currSignup.CleanEmail); err != nil {
 | 
			
		||||
				errorModal.SetText(fmt.Sprintf("error! failed to create invite: %s", err.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")
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
@ -16,6 +16,7 @@ import (
 | 
			
		||||
	_ "embed"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// TODO mark on user table what signup id led to the account for forensics
 | 
			
		||||
// TODO add logging like the signup tool has
 | 
			
		||||
// TODO consider merging adduser, usermod, and createkeyfile into single createuser helper to limit sudoers list
 | 
			
		||||
// TODO move magic key machine to static page
 | 
			
		||||
 | 
			
		||||
@ -2,10 +2,18 @@ package email
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"crypto/tls"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/smtp"
 | 
			
		||||
	"os/exec"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	SMTPlogin = "root@tilde.town"
 | 
			
		||||
	SMTPHost  = "smtp.zoho.com"
 | 
			
		||||
	SMTPPort  = 465
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func SendLocalEmail(username, subject, body string) error {
 | 
			
		||||
	cmd := exec.Command("/usr/sbin/sendmail", username)
 | 
			
		||||
	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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user