main.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. log.Printf("Listen on %s ...\n", listener)
  50. go server.ListenAndServe(listener)
  51. } else if strings.HasPrefix(listeners[i], "starttls://") {
  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.TLSConfig = &tls.Config {
  61. Certificates: [] tls.Certificate{cert},
  62. }
  63. server.ForceTLS = *localForceTLS
  64. log.Printf("Listen on %s (STARTSSL) ...\n", listener)
  65. lsnr, err := net.Listen("tcp", listener)
  66. defer lsnr.Close()
  67. go server.Serve(lsnr)
  68. } else if strings.HasPrefix(listeners[i], "tls://") {
  69. listener = strings.TrimPrefix(listener, "tls://")
  70. if *localCert == "" || *localKey == "" {
  71. log.Fatal("TLS certificate/key not defined in config")
  72. }
  73. cert, err := tls.LoadX509KeyPair(*localCert, *localKey)
  74. if err != nil {
  75. log.Fatal(err)
  76. }
  77. server.TLSConfig = &tls.Config {
  78. Certificates: [] tls.Certificate{cert},
  79. }
  80. log.Printf("Listen on %s (TLS) ...\n", listener)
  81. lsnr, err := tls.Listen("tcp", listener, server.TLSConfig)
  82. defer lsnr.Close()
  83. go server.Serve(lsnr)
  84. } else {
  85. log.Fatal("Unknown protocol in listener ", listener)
  86. }
  87. }
  88. for true {
  89. time.Sleep(time.Minute)
  90. }
  91. }