mirror of
https://github.com/axllent/mailpit.git
synced 2025-02-03 13:12:03 +02:00
126 lines
3.1 KiB
Go
126 lines
3.1 KiB
Go
// Package cmd is the sendmail cli
|
|
package cmd
|
|
|
|
/**
|
|
* Bare bones sendmail drop-in replacement borrowed from MailHog
|
|
*/
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/mail"
|
|
"net/smtp"
|
|
"os"
|
|
"os/user"
|
|
|
|
"github.com/axllent/mailpit/config"
|
|
"github.com/axllent/mailpit/utils/logger"
|
|
flag "github.com/spf13/pflag"
|
|
)
|
|
|
|
var (
|
|
// Verbose flag
|
|
Verbose bool
|
|
|
|
fromAddr string
|
|
)
|
|
|
|
// Run the Mailpit sendmail replacement.
|
|
func Run() {
|
|
host, err := os.Hostname()
|
|
if err != nil {
|
|
host = "localhost"
|
|
}
|
|
|
|
username := "nobody"
|
|
user, err := user.Current()
|
|
if err == nil && user != nil && len(user.Username) > 0 {
|
|
username = user.Username
|
|
}
|
|
|
|
if fromAddr == "" {
|
|
fromAddr = username + "@" + host
|
|
}
|
|
|
|
smtpAddr := "localhost:1025"
|
|
var recip []string
|
|
|
|
// defaults from envars if provided
|
|
if len(os.Getenv("MP_SENDMAIL_SMTP_ADDR")) > 0 {
|
|
smtpAddr = os.Getenv("MP_SENDMAIL_SMTP_ADDR")
|
|
}
|
|
if len(os.Getenv("MP_SENDMAIL_FROM")) > 0 {
|
|
fromAddr = os.Getenv("MP_SENDMAIL_FROM")
|
|
}
|
|
|
|
// override defaults from cli flags
|
|
flag.StringVarP(&fromAddr, "from", "f", fromAddr, "SMTP sender address")
|
|
flag.StringVar(&smtpAddr, "smtp-addr", smtpAddr, "SMTP server address")
|
|
flag.BoolVarP(&Verbose, "verbose", "v", false, "Verbose mode (sends debug output to stderr)")
|
|
flag.BoolP("long-b", "b", false, "Ignored. This flag exists for sendmail compatibility.")
|
|
flag.BoolP("long-i", "i", false, "Ignored. This flag exists for sendmail compatibility.")
|
|
flag.BoolP("long-o", "o", false, "Ignored. This flag exists for sendmail compatibility.")
|
|
flag.BoolP("long-s", "s", false, "Ignored. This flag exists for sendmail compatibility.")
|
|
flag.BoolP("long-t", "t", false, "Ignored. This flag exists for sendmail compatibility.")
|
|
flag.CommandLine.SortFlags = false
|
|
|
|
// set the default help
|
|
flag.Usage = func() {
|
|
fmt.Printf("A sendmail command replacement for Mailpit (%s).\n\n", config.Version)
|
|
fmt.Printf("Usage:\n %s [flags] [recipients]\n", os.Args[0])
|
|
fmt.Println("\nFlags:")
|
|
flag.PrintDefaults()
|
|
}
|
|
|
|
flag.Parse()
|
|
|
|
// allow recipient to be passed as an argument
|
|
recip = flag.Args()
|
|
|
|
if Verbose {
|
|
fmt.Fprintln(os.Stdout, smtpAddr, fromAddr)
|
|
}
|
|
|
|
body, err := ioutil.ReadAll(os.Stdin)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "error reading stdin")
|
|
os.Exit(11)
|
|
}
|
|
|
|
msg, err := mail.ReadMessage(bytes.NewReader(body))
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, fmt.Sprintf("error parsing message body: %s", err))
|
|
os.Exit(11)
|
|
}
|
|
|
|
addresses := []string{}
|
|
|
|
if len(recip) > 0 {
|
|
addresses = recip
|
|
} else {
|
|
// get all recipients in To, Cc and Bcc
|
|
if to, err := msg.Header.AddressList("To"); err == nil {
|
|
for _, a := range to {
|
|
addresses = append(addresses, a.Address)
|
|
}
|
|
}
|
|
if cc, err := msg.Header.AddressList("Cc"); err == nil {
|
|
for _, a := range cc {
|
|
addresses = append(addresses, a.Address)
|
|
}
|
|
}
|
|
if bcc, err := msg.Header.AddressList("Bcc"); err == nil {
|
|
for _, a := range bcc {
|
|
addresses = append(addresses, a.Address)
|
|
}
|
|
}
|
|
}
|
|
|
|
err = smtp.SendMail(smtpAddr, nil, fromAddr, addresses, body)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "error sending mail")
|
|
logger.Log().Fatal(err)
|
|
}
|
|
}
|