package smtpclient import ( "b612.me/apps/b612/smtpclient/email" "b612.me/stario" "b612.me/starlog" "crypto/tls" "github.com/spf13/cobra" "mime" "net/smtp" "os" "path/filepath" "strings" ) var Cmd = &cobra.Command{ Use: "smtpc", Short: "smtp client", Long: "smtp client", Run: func(cmd *cobra.Command, args []string) { run() }, } var from, subject, text string var to, cc, bcc, attachments, replyTo []string var useHTML bool var user, pwd, server string var skipInsecure, usingFile bool var useTLS int func init() { Cmd.Flags().BoolVarP(&usingFile, "file", "F", false, "using file") Cmd.Flags().StringSliceVarP(&replyTo, "reply-to", "r", nil, "reply to") Cmd.Flags().StringVarP(&from, "from", "f", "", "from") Cmd.Flags().StringVarP(&subject, "subject", "s", "", "subject") Cmd.Flags().StringVarP(&text, "text", "t", "", "text") Cmd.Flags().StringSliceVarP(&to, "to", "T", nil, "to") Cmd.Flags().StringSliceVarP(&cc, "cc", "C", nil, "cc") Cmd.Flags().StringSliceVarP(&bcc, "bcc", "B", nil, "bcc") Cmd.Flags().StringSliceVarP(&attachments, "attachments", "a", nil, "attachments") Cmd.Flags().BoolVarP(&useHTML, "html", "H", false, "use html") Cmd.Flags().StringVarP(&user, "user", "u", "", "user") Cmd.Flags().StringVarP(&pwd, "pwd", "p", "", "password") Cmd.Flags().StringVarP(&server, "server", "S", "127.0.0.1:25", "server") Cmd.Flags().IntVarP(&useTLS, "tls", "l", 0, "use tls,1 means use tls,2 means use starttls,other means not use tls") Cmd.Flags().BoolVarP(&skipInsecure, "skip-insecure", "i", false, "skip insecure") } func run() { { for from == "" { from = stario.MessageBox("Please input mail from:", "").MustString() } for len(to) == 0 { to = stario.MessageBox("Please input mail to,split by ,:", "").MustSliceString(",") } for subject == "" { subject = stario.MessageBox("Please input mail subject:", "").MustString() } for text == "" { text = stario.MessageBox("Please input mail text:", "").MustString() } for server == "" { server = stario.MessageBox("Please input mail server:", "").MustString() } } var mail = email.Email{ ReplyTo: replyTo, From: from, To: to, Bcc: bcc, Cc: cc, Subject: subject, } var txt []byte var err error if usingFile { txt, err = os.ReadFile(text) if err != nil { starlog.Errorf("read file %s error:%s\n", text, err) os.Exit(1) } } else { txt = []byte(text) } if useHTML { mail.HTML = txt } else { mail.Text = txt } if len(attachments) > 0 { for _, v := range attachments { if strings.TrimSpace(v) == "" { continue } f, err := os.Open(v) if err != nil { starlog.Errorf("open attach file %s error:%s\n", v, err) os.Exit(1) } stat, err := f.Stat() if err != nil { starlog.Errorf("stat attach file %s error:%s\n", v, err) os.Exit(1) } _, err = mail.Attach(f, stat.Name(), mime.TypeByExtension(filepath.Ext(stat.Name()))) if err != nil { starlog.Errorf("attach file %s error:%s\n", v, err) os.Exit(1) } } } var auth smtp.Auth if user != "" && pwd != "" { auth = smtp.PlainAuth("", user, pwd, server) } switch useTLS { case 1: err = mail.SendWithTLS(server, auth, &tls.Config{InsecureSkipVerify: skipInsecure}) case 2: err = mail.SendWithStartTLS(server, auth, &tls.Config{InsecureSkipVerify: skipInsecure}) default: err = mail.Send(server, auth) } if err != nil { starlog.Errorf("send mail error:%s\n", err) os.Exit(1) } starlog.Infof("send mail to %v success by server %s\n", to, server) }