You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
3.5 KiB
Go
133 lines
3.5 KiB
Go
8 months ago
|
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)
|
||
|
}
|