code.dwrz.net

Go monorepo.
Log | Files | Refs

commit d24e89620d95bbf249a0f26a2a48aa48bde172fb
parent 266169b9cc677877e24b878a95fd02fabdd461ac
Author: dwrz <dwrz@dwrz.net>
Date:   Tue, 18 Oct 2022 17:34:15 +0000

Add sm cmd

Diffstat:
Acmd/sm/sm.go | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 88 insertions(+), 0 deletions(-)

diff --git a/cmd/sm/sm.go b/cmd/sm/sm.go @@ -0,0 +1,88 @@ +package main + +import ( + "encoding/base64" + "flag" + "fmt" + "net/http" + "net/smtp" + "os" + "strings" + + "code.dwrz.net/pkg/gmail" + "code.dwrz.net/pkg/log" +) + +var ( + user = flag.String("user", "", "username") + pass = flag.String("pass", "", "password") + + from = flag.String("from", "", "sender address") + to = flag.String("to", "", "recipient address, comma delimited") + sbj = flag.String("subject", "", "subject") + + text = flag.String("text", "", "message text") + file = flag.String("file", "", "attachment filepath") +) + +func main() { + l := log.New() + + // Parse flags. + flag.Parse() + + // Compose email. + var str strings.Builder + + fmt.Fprintf(&str, "From: %s\r\n", *from) + fmt.Fprintf(&str, "To: %s\r\n", *to) + fmt.Fprintf(&str, "Subject: %s\r\n", *sbj) + + str.WriteString("MIME-Version: 1.0\n") + str.WriteString("Content-Type: multipart/mixed; boundary=\"=-=-=\"\n") + str.WriteString("\n") + str.WriteString("--=-=-=\n") + str.WriteString("Content-Type: text/plain; format=flowed\n") + str.WriteString("\n") + str.WriteString("\n") + str.WriteString(*text) + str.WriteString("\n") + str.WriteString("--=-=-=\n") + + // Add the attachment, if provided. + if *file != "" { + data, err := os.ReadFile(*file) + if err != nil { + l.Error.Fatalf("failed to open file: %v", err) + } + + fmt.Fprintf( + &str, + "Content-Type: %s\n", http.DetectContentType(data), + ) + fmt.Fprintf( + &str, + "Content-Disposition: attachment; filename=%s\n", + *file, + ) + str.WriteString("Content-Transfer-Encoding: base64\n") + fmt.Fprintf(&str, "Content-Description: %s\n", *file) + str.WriteString("\n") + str.WriteString(base64.StdEncoding.EncodeToString([]byte(data))) + str.WriteString("--=-=-=\n") + } + + // Send the email. + if err := smtp.SendMail( + gmail.Address, + &gmail.Auth{ + Username: *user, + Password: *pass, + }, + *from, + strings.Split(*to, ","), + []byte(str.String()), + ); err != nil { + l.Error.Fatalf("failed to send email: %v", err) + } +}