main.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package main
  2. import (
  3. "crypto/tls"
  4. "flag"
  5. "log"
  6. "net"
  7. "net/smtp"
  8. "strings"
  9. "time"
  10. "github.com/chrj/smtpd"
  11. "github.com/vharitonsky/iniflags"
  12. )
  13. var (
  14. hostName = flag.String("hostname", "localhost.localdomain", "Server hostname")
  15. welcomeMsg = flag.String("welcome_msg", "", "Welcome message for SMTP session")
  16. listen = flag.String("listen", "127.0.0.1:25 [::1]:25", "Address and port to listen for incoming SMTP")
  17. localCert = flag.String("local_cert", "", "SSL certificate for STARTTLS/TLS")
  18. localKey = flag.String("local_key", "", "SSL private key for STARTTLS/TLS")
  19. localForceTLS = flag.Bool("local_forcetls", false, "Force STARTTLS (needs local_cert and local_key)")
  20. remoteHost = flag.String("remote_host", "smtp.gmail.com:587", "Outgoing SMTP server")
  21. remoteUser = flag.String("remote_user", "", "Username for authentication on outgoing SMTP server")
  22. remotePass = flag.String("remote_pass", "", "Password for authentication on outgoing SMTP server")
  23. )
  24. func handler(peer smtpd.Peer, env smtpd.Envelope) error {
  25. var auth smtp.Auth
  26. host, _, _ := net.SplitHostPort(*remoteHost)
  27. if *remoteUser != "" && *remotePass != "" {
  28. auth = smtp.PlainAuth("", *remoteUser, *remotePass, host)
  29. }
  30. return smtp.SendMail(
  31. *remoteHost,
  32. auth,
  33. env.Sender,
  34. env.Recipients,
  35. env.Data,
  36. )
  37. }
  38. func main() {
  39. iniflags.Parse()
  40. listeners := strings.Split(*listen, " ")
  41. for i := range(listeners) {
  42. listener := listeners[i]
  43. server := &smtpd.Server{
  44. Hostname: *hostName,
  45. WelcomeMessage: *welcomeMsg,
  46. Handler: handler,
  47. }
  48. if strings.Index(listeners[i], "://") == -1 {
  49. ;
  50. } else if strings.HasPrefix(listeners[i], "tls://") || strings.HasPrefix(listeners[i], "starttls://") {
  51. listener = strings.TrimPrefix(listener, "tls://")
  52. listener = strings.TrimPrefix(listener, "starttls://")
  53. if *localCert == "" || *localKey == "" {
  54. log.Fatal("TLS certificate/key not defined in config")
  55. }
  56. cert, err := tls.LoadX509KeyPair(*localCert, *localKey)
  57. if err != nil {
  58. log.Fatal(err)
  59. }
  60. server.ForceTLS = *localForceTLS
  61. server.TLSConfig = &tls.Config {
  62. Certificates: [] tls.Certificate{cert},
  63. }
  64. } else {
  65. log.Fatal("Unknown protocol in listener ", listener)
  66. }
  67. log.Printf("Listen on %s ...\n", listener)
  68. go server.ListenAndServe(listener)
  69. }
  70. for true {
  71. time.Sleep(time.Minute)
  72. }
  73. }