commit d24e89620d95bbf249a0f26a2a48aa48bde172fb
parent 266169b9cc677877e24b878a95fd02fabdd461ac
Author: dwrz <dwrz@dwrz.net>
Date: Tue, 18 Oct 2022 17:34:15 +0000
Add sm cmd
Diffstat:
A | cmd/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)
+ }
+}